大致想法以及背景:

刚开始创建Django项目,可以通过runserver命令更方便地调试程序,但是如果当一个项目完成了之后,需要部署到真正的环境,就需要考虑其稳定性。
之前在写毕设的时候,写过一个自动化运维监控的项目,部署在自己的阿里云服务器上。那时候没啥经验,直接一个(pyhon runserver 0.0.0.0:8888 &)让项目在后台自己跑。所以对一些项目挂掉,数据库连接失败等问题不能够及时定位解决。
所以现在花点时间结合Nginx+Uwsgi部署自己的项目,利用Nginx处理静态资源请求以及Uwsgi处理后台的动态请求。

1、安装Uwsgi

pip安装:pip install uwsgi

源码包安装:wget https://files.pythonhosted.org/packages/a2/c9/a2d5737f63cd9df4317a4acc15d1ddf4952e28398601d8d7d706c16381e0/uwsgi-2.0.17.1.tar.gz
(解压文件,安装编译)

2、使用Uwsgi启动项目

2.1、使用uwsgi命令启动项目

cd /data/wwwroot/DevOps/ (进入Django项目,以下是项目的目录树)

结合Nginx+Uwsgi部署Django项目_第1张图片

uwsgi --http 0.0.0.0:8888 --file mysite/wsgi.py --static-map=/static=static
参数详解:--http:启动项目的IP地址和端口 --file:指定Django项目中wsgi文件,一般创建Django项目自动生成,--static-map:指定静态资源存放的目录

结合Nginx+Uwsgi部署Django项目_第2张图片

启动成功!!!

2.2、使用配置文件启动Django项目

创建uwsgi.ini配置文件

[uwsgi]
chdir=/data/wwwroot/DevOps/
module=mysite.wsgi:application
socket=/data/wwwroot/DevOps/uwsgi/uwsgi.sock
workers=5
pidfile=/data/wwwroot/DevOps/uwsgi/uwsgi.pid
http=192.168.1.1:8888
static-map=/static=/data/wwwroot/DevOps/static
uid=root
gid=root
master=true
vacuum=true
thunder-lock=true
enable-threads=true
harakiri=30
post-buffering=4096
daemonize=/data/wwwroot/DevOps/uwsgi/uwsgi.log

uwsgi.ini配置文件参数重点详解:
vacuum:自动移除unix Socket和pid文件当服务停止的时候;
thunder-lock:序列化接受的内容
enable-threads:启用线程
harakiri:设置自中断时间
post-buffering:设置缓冲

3、结合Nginx+Uwsgi启动项目

对于安装Nginx,本节忽略不讲,主要是针对安装玩Nginx,修改配置文件,添加虚拟主机。同时在前文也提到了,nginx对于处理静态资源能力强,而对于动态请求,nginx将其转发到uwsgi处理。
添加配置文件到/etc/nginx/conf.d/目录下

server{
                listen 80;
                server_name 192.168.1.1;
                access_log /data/wwwroot/DevOps/uwsgi/nginx/access.log main;
                error_log /data/wwwroot/DevOps/uwsgi/nginx/error.log;
                charset utf-8;
                gzip_types  text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png  application/octet-stream;
location / {
                include uwsgi_params;
                uwsgi_connect_timeout 30;
                uwsgi_pass unix:/data/wwwroot/DevOps/uwsgi/uwsgi.sock;
}
location /static/{
        alias  /data/wwwroot/DevOps/static/;
        index index.html index.htm;
}
}

重要参数详解:

gzip_types:支持的压缩类型
uwsgi_connect_timeout:设置Uwsgi超时时间
uwsgi_pass:指定uwsgi的sock文件处理动态请求
使用(nginx -t)命令检测nginx配置是否出错,然后重启nginx(systemctl restart nginx)

4、需要注意的几点:

4.1、在启动项目之后,再日志文件中出现了IOError: write error 问题

问题解决的方法:

通过查阅资料和整理文档:
“But uWSGI logs these things for misbehaving clients. A write error would happen if the upstream got disconnected, but the backend process was still attempting to write to the closed socket.”
在配置文件最后添加:

ignore-sigpipe = true
ignore-write-errors = true
disable-write-exception = true

4.2、Nginx在等待接收信息的过程会出现504错误

问题解决方法:

由于接受uwsgi的应答的事件超时,所以发生504错误,通过修改nginx的uwsgi超时连接时间就可以解决此类问题。

uwsgi_send_timeout 600; # 指定向uWSGI传送请求的超时时间,完成握手后向uWSGI传送请求的超时时间。
uwsgi_connect_timeout 600; # 指定连接到后端uWSGI的超时时间。
uwsgi_read_timeout 600; # 指定接收uWSGI应答的超时时间,完成握手后接收uWSGI应答的超时时间。