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 ,就完成了

posted @ 2020-01-09 14:20  Tester北柯郡  阅读(700)  评论(0编辑  收藏  举报