Django 使用 Nginx + uWSGI 启动
一、前言
购买了腾讯云服务器练习 Django 项目时,
# 最开始用的启动 Django 项目命令
python3 manage.py runserver 0.0.0.0:80
后面发现我一旦把 xshell 窗口关闭,Django 项目就宕机了,无法访问。
之后学了一个新的启动命令,使用后台常驻模式,
# 改进后的命令
nohup python3 manage.py runserver 0.0.0.0:80 > /dev/null 2> /dev/null &
这时候关了 xshell 窗口,Django 项目也能访问了。
开心了一小阵子,
随后,发现性能差得离奇,就两个并发用户访问,都会挂掉的那种,吐血。
查阅资料发现,使用 python3 manage.py runserver 只能用于单人调试,不能用于生产环境,可怜兮兮的我居然一直以为这是正确的启动方式。
二、Django + uWSGI + Nginx 搭建
(1)uWSGI
概念性的东西,请看大神们的博客,写得很清晰明了
传送门:
https://blog.csdn.net/CHENYAoo/article/details/83055108
https://www.cnblogs.com/new-rain/p/10089941.html
下面讲一讲搭建
首先,非常遗憾的说,Windows 是无法安装使用 uWSGI 的,网上很多教程说安装 MinGW Installer 的,我试了也不行,只能运行在 Linux 上面
进入正题
# 安装模块
pip3 install uwsgi
然后在项目根目录(跟 manage.py 同一层级的)新建文件 uwsgi.ini
写入内容,备注表明了3个地方是需要根据你自己的情况来修改的
[uwsgi] # (1)第一处修改的地方 # 这个地方有个坑,就是假如你是买的云主机,那么你的内网ip不是127.0.0.1,而是要去云服务器控制台看的 # socket = 你的服务器内网的ip地址:8889 http = 你的服务器内网的ip地址:8889 # (2)第二处修改的地方 # 项目根目录 chdir = 项目根目录的绝对路径 # (3)第三处修改的地方 wsgi-file = 项目名称/wsgi.py master = True processes = 4 threads = 2 pidfile = uwsgi.pid daemonize = uwsgi.log
接下来,测试一下,不再使用 python3 manage.py runserver 启动,而是改成
uwsgi --ini uwsgi.ini
用 ps aux | grep uwsgi 有没有启动进程,或者访问 你的服务器内网的ip地址:8889 能不能访问到 Django的页面
测试完了,停掉 uwsgi,使用命令
uwsgi --stop uwsgi.pid
(2)Nginx
安装 Nginx 的,网上一堆教程,这里就不写了
第一步,为了让 Nginx 接管,需要修改上面 uwsgi.ini 文件,就是把 http 换成 socket
socket = 你的服务器内网的ip地址:8889 # http = 你的服务器内网的ip地址:8889
第二步,需要改 Nginx 的配置文件,我的配置文件在 /usr/local/nginx/conf,这个路径根据个人情况而定,
vim nginx.conf
在 http{} 里面的 server{} 里面添加内容
location / { include uwsgi_params; uwsgi_pass 你的服务器内网的ip地址:8889; }
保存,重启 Nginx,启动 uwsgi,访问 80 端口,如果看到你的项目,说明就正确了
(3)静态资源的问题
这时候,你会发现网站的图片啊、样式啊,都是无法显示的,是因为静态文件的原因
第一个要改的,项目的 settings.py
加一句
STATIC_ROOT = os.path.join(BASE_DIR, 'static_all')
然后执行命令
python3 manage.py collectstatic
第二个要改的,Nginx 的配置文件
vim nginx.conf
在 http{} 里面的 server{} 里面添加内容
location /static { alias 项目根目录的绝对路径/static_all/; }
之后,重启 Nginx 和 uwsgi ,就完成了