Nginx + Supervisor + uWSGI 部署 Django 服务

2018年03月28日

这一篇介绍使用 Nginx + Supervisor + uWSGI 部署 Django 服务。

为了保证服务器的纯净,不用virtualenv。

下面演示一下,我们的平台的部署

下载工程

centos的/var目录下新建www目录

cd /var
sudo mkdir www
sudo chmod a+w www # 所有用户具有写权限

一般我们的web工程都放在 /var/www下面,放在/var/www/目录下。

cd /var/www/jed/
git clone https://github.com/xxx/jed.git

在工程目录下,有以下文件:

├── jed/
        ├── nginx.conf
        ├── supervisor.conf
        ├── uwsgi.ini
        └── requirements.txt

包含了下面所有的用到的配置文件.

pip install -r requirments.tx # 安装工程相关依赖

配置uWsgi

uWsgi

通过pip来安装

sudo yum install python-devel # python开发相关
sudo pip install uwsgi
sudo yum -y install mysql-devel # python操作mysql 

执行下面的命令,测试uWsgi+Django是否能正常启动Web服务

# 启动web服务
uwsgi --http-socket 0.0.0.0:59152 --chdir /var/www/jed/ --wsgi-file jed/wsgi.py --master --processes 4 --threads 2 --stats 0.0.0.0:9191

然后打开浏览器访问: http://你的服务器ip:3031, 看能否访问网站。 测试通过后,可以结束上面的进程。 或者直接本地使用curl命令来访问

curl 192.168.1.100:59152 # 可以访问到该网页

uWsgi的具体配置如下:

[uwsgi]
chdir=/var/www/jed/
# py-autoreload=3  #实现和django自带server一样更新文件自动重启功能
module=jed.wsgi:application
master=True
pidfile=/tmp/jed.pid
vacuum=True   # clear environment on exit
socket=127.0.0.1:59152
processes=16    # 启动16个进程
harakiri=20 # respawn processes taking more than 20 seconds
max-requests=5000  # 请求5000次后重启
# daemonize=/var/log/yz/jed.log # 不使用daemon模式,防止supervisor自动重启

需要在/var/log目录下创建yz目录

sudo mkdir /var/log/yz
sudo a+w /var/log/yz

配置Supervisor

Supervisor是用来将uWsgi做成一个守护进程的,通过supervisor命令或者网页服务也能启动和停止uUwsgi.

安装和运行Supervisor, 也可参考官方文档: http://supervisord.org/

sudo pip install supervisor # 安装
su - root # 切换到root用户
echo_supervisord_conf > /etc/supervisord.conf # 在root用户下,写配置文件

修改supervisord.conf 配置文件,在文件末尾加上如下语句:

[include]
files = /etc/supervisord.conf.d/*.conf

启动supervisor

sudo supervisord -c /etc/supervisord.conf # 启动
ps aux|grep supervisor # 查看进程是否启动

下面开始配置Supervisor

# 使用软链接, 载入 `supervisor` 的配置
sudo mkdir /etc/supervisord.conf.d # 创建配置目录
cd /etc/supervisord.conf.d/
sudo ln -s /var/www/jed/supervisord.conf jed.localhost.conf 

# supervisor 更新配置,并启动进程
sudo supervisorctl -c /etc/supervisord.conf
> reread
> update
> status

这个时候可以看到服务已经启动起来了。

Supervisor的配置如下:

[program:uwsgi-jed.localhost]
# 确保uwsgi命令的路径是对的
command=/usr/bin/uwsgi --ini /var/www/jed/uwsgi.ini
directory=/var/www/jed
umask=022
# 以ripple用户运行
user=jed
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true
# 注意确保路径存在
stdout_logfile=/var/log/yz/jed.stdout.log
stderr_logfile=/var/log/yz/jed.stderr.log
stopsignal=QUIT
killasgroup=true

[supervisord]

如果不想使用Supervisor也可以,只要把上面uwsgi.ini文件中关于最后一行关于daemonize的注释去掉, 直接用以下命令启动uWsgi

/usr/bin/uwsgi --ini /var/www/jed/uwsgi.ini

配置Nginx

使用软链接, 将 nginx.conf 写入到 nginx 的配置中:

cd /etc/nginx/conf.d/
sudo ln -s /var/www/jed/nginx.conf jed.localhost.conf

然后重启 nginx

sudo /usr/sbin/nginx # 开启nginx
sudo /usr/sbin/nginx -s reload # 重新加载nginx

nginx.conf 的配置内容如下:

upstream jed_uwsgi_backend {
	# django工程在59152端口启动
    server 127.0.0.1:59152;
}

server {
    listen   9001;
    # 通过该域名访问
    server_name jed.localhost;

	# 禁止访问git文件
    location ^~ /.git {
        deny all;
    }
	
	# django的静态文件,直接通过nginx访问,不走uWsgi。 
	# 静态文件的目录是:/var/www/jed/jed/static/
    location ^~ /static {
        root   /var/www/jed/jed; 
        index  index.html;
        expires 1M;
        access_log off;
        add_header Cache-Control "public";
    }
	# 非静态文件请求都走uWsgi,具体端口在upstream配置
    location / {
        proxy_next_upstream error timeout http_500 http_503;
        proxy_connect_timeout 4000ms;
        proxy_read_timeout    30s;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Rewrite-URL $request_uri;
        client_max_body_size 10m;

		# 通过 upstream 
        uwsgi_pass  jed_uwsgi_backend;
        include uwsgi_params;
    }

}

配置域名

在你的域名提供服务商处,增加一条域名解析A记录,将域名 jed.localhost 解析到 你的服务器ip。 成功后。

这个时候打开 http://jed.localhost:9001 ,就能成功访问网站了。