django+nginx环境部署
by ET posted on 2019年8月5日 12:22 under 技术分享
标签: python
环境: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,可以正常访问了