Wardon&ET 博客

django+nginx环境部署

环境:python3.7 django2.2 centos7

起因:之前我一直直接用django自带的调试服务来部署网站,但是毕竟不适合线上系统,而且我想要加https证书,必须要通过配置nginx来实现,所以必须得把项目部署到nginx上去。

网上查了资料django部署nginx需要基于uwsgi。他们的关系就是,nginx和uwsgi都是web服务器,nignx负责静态内容,uwsgi负责项目里的动态内容,两者互相配合提供web服务以实现提高效率和负载均衡等目的。他们的请求和响应流程如下:

Request > Nginx > uWSGI > Django > uWSGI > Nginx > Response

备注:uwsgi也是可以单独运行的。

1 准备环境

1.1 安装uwsgi,django-secure

pip install uwsgi
pip install django-secure #如果已安装请忽略

安装完成之后,运行一下指令测试是否安装成功,正确则已经可以直接访问网站

uwsgi --http :8002 --chdir 项目路径 --home=虚拟环境路径 --module 项目名称.wsgi

如果没有虚拟环境则去掉home参数

如果显示一下内容则表示端口号已被占用

probably another instance of uWSGI is running on the same address (:8002).
bind(): Address already in use [core/socket.c line 764]

可以用lsof -i :8002指令查出进程kill掉

1.2 安装nginx,可以用yum,wget等工具

yum install nginx

2 配置文件

2.1 配置uwsgi

在项目在中新建一个文件 项目名称.ini,如 test.ini,内容如下:

[uwsgi]
project = test #项目路径
socket = /home/tu/test/test.sock #用来和nginx通信的socket文件
chdir = /home/tu/test #项目路径
wsgi-file = test/wsgi.py
module = test.wsgi
 
processes = 2
threads = 4
 
chmod-socket = 664
chown-socket = tu:www-data
 
vacuum = true

这里要注意,不建议把sock文件放在tmp目录下,nginx可能会访问不到这个文件

为了方便启动,可以利用supervisor,安装supervisor,在/etc/supervisord.conf配置如下

[program:test]
command=/path/to/uwsgi --ini /home/tu/test/test.ini
directory=/path/to/test
startsecs=0

启动test

supervisorctl restart test

2.2 配置nginx

复制 /etc/nginx/uwsgi_params 到项目下,在/etc/nginx/conf.d/ 新建文件 test.conf,nginx总配置文件会引入这个目录下的所有.conf,内容如下:

upstream django {
    server unix:///path/to/test/test.sock;
}

server {
    listen 80;
    server_name  www.test.com  test.com;
    charset        utf-8;

    client_max_body_size    75M;

    location /static {
        alias    /path/to/test/static;
    }

    location / {
        uwsgi_pass     django;
        include        /path/to/test/uwsgi_params;
    }
}

重启nginx,网站可以正常访问

nginx -c /etc/nginx/nginx.conf
nginx -s reload

3 常见问题

3.1 启动nginx,也要同时启动uwsgi。

两者配合才能正常访问网站,更改了项目文件就用supervisor重启项目,更改了nignx配置就重启ningx。

碰到500,400等错误,可以查看nginx错误日志,uwsgi错误日志,排查错误

cat /var/log/nginx/error.log

3.2 部署nginx之后发现admin后台的静态资源无法加载了

只需要在setting.py里面加入

STATIC_ROOT = 'static/'

然后收集静态资源,如果显示失败则可以先把目录改到其他位置,收集完之后再手动覆盖项目下的static

python manage.py collectstatic

如果你设置了STATIC_URL = '/static/' ,收集完静态资源后把STATIC_ROOT = 'static/'删掉

重启uwsgi,可以正常访问了