Centos6.8:Django+uWSGI+Nginx+supervisord部署web服务器

帮团队的公司建个官网,部署服务器的时候采用了腾讯云推荐的Django+uWSGI+Nginx+supervisord方案,也采用过几个教程,最后发现这两个比较好:

官方教程(无supervisord),英文,怕英文的话太吃亏了。
腾讯云的教程很简洁,推荐下载文字版,且网速好的话不用配置清华源,理论上一次就能成功,但是如果中间哪步出了问题。。。你就需要看看下面的教程了。

推荐腾讯云等平台上的“实验室”,如,基于 CentOS 搭建 Python 的 Django 环境,有免费服务器尝试。只是应该不能使用Putty与WinSCP。

说明

目标

最后,我们将要实现以下通路:

客户端 <-> 服务器 <-> the socket <-> uwsgi <-> Django

服务器预装环境

  • centos 6.8x64,root用户
  • python2(不用,后面装python3)

工具说明

推荐下列工具,不会用的自行搜索

  • win10笔记本一台;
  • 常用命令.txt;
  • putty: 用于连接服务器,支持复制粘贴;
  • WinSCP: 可实现一些重要功能——将本机的文件拖拽复制到服务器上+摆脱linux上的vim。

可以说,有了putty和WinSCP,服务器相当于装在你电脑上了。


安装

Nginx

先安装 EPEL 的基础库,再安装Nginx

yum install epel-release -y
yum install nginx -y

启动 Nginx(centos7使用systemctl命令)

service enable nginx
service start nginx

python3.4与pip3

sudo yum groupinstall -y development tools
sudo yum install -y epel-release python34-devel libxslt-devel libxmt2-devel openssl-devel
sudo yum install -y python34
sudo yum install -y python34-setuptools
sudo easy_install-3.4 pip

uWSGI

在python3的虚拟环境下:

yum install gcc -y  # 安装 uwsgi 需要编译环境
python3.4 -m pip install uwsgi  # 安装 uwsgi

django

推荐配置虚拟环境的方案

正式项目部署时也参考这里的步骤

cd /home/
mkdir django
cd django
python3.4 -m venv venv #后者可换成你喜欢的名字,但这样后面的命令也有改动

创建完成后,进入虚拟环境、安装 Django 、创建项目

source /home/django/venv/bin/activate # 此命名可保存到“常用命令.txt”,
pip install django
django-admin startproject <project_name># 将<project_name>改成你的项目名称,下同,可把/home/django/<project_name>保存到“常用命令.txt”;
cd <project_name>
python manage.py startapp <app_name># 建议用网站名称代替<app_name>,但这个名称不能与项目名称相同。

配置

配置并测试Django

允许域名

使 Django 能处理来做所有域名中的请求,目标文件为/home/django/<project_name>目录下的settings.py,这里有两种操作,一种是vim,另一种是WinSCP双击打开,“严重”推荐后者,避免学习vim,方便复制粘贴。

vim my/settings.py

找到

ALLOWED_HOSTS = []

改为

ALLOWED_HOSTS = ['*']

(vim要按i输入,完后,ecs键后输入:wq,再按Enter键)

运行测试

下面测试Django(当前目录在/home/django/<project_name>)

python manage.py runserver  0.0.0.0:8000

用电脑浏览器访问云主机的 IP 地址,可以看到 Django 的启动页面了。

回到命令行,Ctrl+C断开。

收集静态文件

后面你要处理Django中的static文件,但现在你就可以这样了,先修改/home/django/<project_name>/<project_name>/下的settings.py。添加(一般在文末):

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

然后在命令行运行:

python manage.py collectstatic

插播:端口选择

这篇教程里,通常使用8000端口,你也可以使用其他的,但谨慎使用80端口。如果发生端口占用的情况,请谨慎使用下列代码:

lsof -i:80
kill -9 [UID]

首次配置uWSGI

若仍未安装uWSGI,请回到“安装”一节。

基础测试

/home/django/<project_name>目录下,创建测试文件test.py:

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
    #return ["Hello World"] # python2

在命令行中运行uWSGI:

uwsgi --http :8000 --wsgi-file test.py
  • http :8000:使用http协议,端口8000.

  • wsgi-file test.py:加载特定文件test.py

    如果你访问<你的服务器外网ip或者域名>:8000,看到"Hello World"字样,便可确认已连接下面通路:

客户端 <-> uWSGI <-> Python

启动Django

下面执行 uwsgi 命令来启动 Django,同样的,更改<project_name>

uwsgi --http :8000 --chdir /home/django/<project_name> --home=/home/django/venv --module <project_name>.wsgi
  • chdir: 工作目录为/home/django/<project_name>/<project_name>
  • home:虚拟环境根目录。
  • module <project_name>.wsgi是指/home/django/<project_name>/<project_name>目录中的wsgi.py文件。

执行后,访问云主机,若看到 Django 的启动页面,按下 Ctrl + C,退出进程。

客户端 <-> uWSGI <-> Django

下面我们将使用服务器。

配置Nginx

首次配置Nginx

若未安装Nginx,请回到“安装”一节。确保打开Nginx

service restart nginx

访问<你的服务器外网ip或者域名>:80——nginx所在的端口,应该会出现“Welcome to nginx!”字样(或502),这意味着:

客户端<->服务器

如果你的服务器的80端口被其他程序占用,Kill掉这个程序,或者更改nginx配置选用其他端口。

再次配置(Configure)nginx

/home/django/wowuo/文件下,需要一份uwsgi_params文件,以备nginx使用

cp /etc/nginx/uwsgi_params /home/django/wowuo/

或者github下载

/etc/nginx/conf.d/目录下创建<project_name>_nginx.conf文件:

# the upstream component nginx needs to connect to
upstream django {
    # server unix:///home/django/<project_name>/mysite.sock; # for a file socket
    server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

server {
    listen      8000;
    server_name <>;
    charset     utf-8;
 
    client_max_body_size 75M;
 
    location /media  {
        alias /home/django/<project_name>/media;
    }
 
    location /static {
        alias /home/django/<project_name>/static;
    }
 
    location / {
        uwsgi_pass  django;
        include     /path/to/your/mysite/uwsgi_params;
    }
}

nginx测试

重启nginx,如果有问题,它会告诉你。

service nginx restart

测试前,添加一个图像,比如media.png,到/home/django/<project_name>/media中,如果可以访问你的外网ip或域名:8000/media/media.png,比如,当时我当时用的图片(或许你注意到了图片的地址并没有:8000,但你的地址现在不能省略:8000):

水果魔方

nginx、uWSGI、test.py

同样是"Hello World",不一样的说法——这次我们让nginx来说(注意目录):

uwsgi --socket :8001 --wsgi-file test.py
  • socket :8001:使用uwsgi协议,8001端口。

这时访问<你的服务器外网ip或者域名>:8000,如果成功:

客户端 <-> 服务区 <-> the socket <-> uWSGI <-> Python

为什么不是<你的服务器外网ip或者域名>:8001呢?你可以试试,然后在终端看看报错——体会http协议与uwsgi协议的区别。

改进Socket

我们应该使用Unix socket,而不是刚才那种更简单的。

编辑<project_name>_nginx.conf,更改这部分

# the upstream component nginx needs to connect to
upstream django {
    server unix:///home/django/<project_name>/mysite.sock; # for a file socket
    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

重启nginx。

再次运行uWSGI,注意当前目录:

uwsgi --socket mysite.sock --wsgi-file test.py

这里是事故多发区了,如果你再次访问网站:

如果502?

查看日志,在命令行中输入:

tail -10 /var/log/nginx/error.log

其中一条(…代表省略部分信息)

2018/10/01 11:20:53 [crit] 19766#0: *14 connect() to unix:///home/django/... failed (13: Permission denied) while connecting to upstream, client: 119.2.128.225, server: ..., request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///home/django/...:", host: "www....:8000"

注意 “[crit] ”和“failed (13: Permission denied)”,这代表nginx没有权限打开那个sock文件。

可以尝试这个:

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666

如果还不行,请再次检查是不是[crit]错误。如果是,可以把你当前用户加入nginx组中,或直接:(我是后者,因为我使用root用户,用前者略危险)。

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 --chown-socket = nginx:nginx

Django、uwsgi 、nginx

若刚才的步骤正常运行,可先:

uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666

"Hello World"变为你的Django项目(或许是个火箭?)

用ini文件配置uwsgi

为简化命令,下面用ini文件配置uwsgi。

/home/django/<project_name>目录下创建uwsgi.ini文件,向内粘贴:

[uwsgi]
socket = /home/django/<project_name>/<project_name>.sock
chdir = /home/django/<project_name>
wsgi-file = <project_name>/wsgi.py
plugins = python
virtualenv = /home/django/venv/
processes = 2
threads = 4
chmod-socket = 664
chown-socket = nginx:nginx
vacuum = true

其中chown-socket = nginx:nginx为nginx用户和nginx用户组。

再次运行uwsgi

uwsgi --ini mysite_uwsgi.ini 

进程守护supervisord(可选)

为了让程序持久运行,可采用supervisord

首先为系统的 Python2 安装上 pip

yum install python-pip -y

安装完成后,我们使用 pip 来安装 supervisord,并输出配置文件

python -m pip install supervisor
echo_supervisord_conf > /etc/supervisord.conf

接下来使用 vim /etc/supervisord.conf 来编辑配置文件,在文件尾部添加如下代码

[program:my]
command=/usr/bin/uwsgi --ini /home/django/<program_name>/uwsgi.ini
directory=/home/django/<program_name>
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true

添加完成后,执行命令启动 Supervisord即可

supervisord -c /etc/supervisord.conf
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值