【痛点问题】
Django web应用开发一般在windows上进行,开发完毕后需要将应用部署到Linux系统上。Django自带的runserver由于性能差、不安全、不支持高并发等缺点,不能在线上使用。
而Django+Linux+Nginx+uWSGI是最为经典、最稳定的生产环境组合,在各种大型生产环境广泛应用!但是很多小伙伴反馈说生产上部署难度高,底层依赖复杂、安装步骤繁琐。因此,为了解决痛点问题,本文带领大家一步步完成Django应用部署,新手也能直接照着操作,一次成功。
【业务流程】
(1)前端用户通过浏览器访问http/https网址;
(2)Nginx响应前端业务请求,自己处理请求中静态资源的内容(图片、css、js、视频等),而针对请求中动态交互的内容(信息验证、业务逻辑处理、数据交互),转发给后面的uWSGI进行处理。
(3)uWSGI接收动态业务请求,通过wsgi接口,与后面的Django项目进行联动,从而完成动态业务处理。

【环境准备】
(1)Linux服务器一台,配置2核4G;
(2)准备nginx和uwsgi离线安装包,并已完成上传到Linux系统;
(3)关闭防火墙和SELinux;
(4)已配置基于ISO镜像的YUM源,具体配置步骤可参考本公众号之前的文章运维实操指南|搭建内网YUM源服务器,解决内网软件部署难的问题。
(5)已安装Python环境,具体安装步骤可参考本公众号之前的文章Linux内网环境下Python编译安装与pip 包离线部署实战。
【部署步骤】
(1)安装编译Nginx的基础工具包
#yum install gcc make openssl-devel zlib-devel pcre-devel
(2)解压Nginx和uWSGI安装包
①在/home目录创建nginx文件夹和uWSGI文件夹
#mkdir -p nginx uwsgi
②拷贝nginx压缩包到/home/nginx文件夹,拷贝uWSGI压缩包到/home/uwsgi文件夹。
# cp nginx-1.24.0.tar.gz /home/nginx/
# cp uwsgi-2.0.31.tar.gz/home/uwsgi/
③解压nginx和uWSGI两个压缩包文件
#tar -zxvf nginx-1.24.0.tar.gz
#tar -zxvf uwsgi-2.0.31.tar.gz
(3)编译安装Nginx和uWSGI
一、编译安装Nginx服务
1.生成nginx编译配置文件
进入到nginx-1.24.0文件夹内,需要编译HTTPS/SSL模块、TCP/UDP代理开启SSL加密、四层反向代理、性能优化、静态文件预压缩、支持线程池这6大模块,这些模块基本上覆盖了90%的应用场景。执行命令:
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-stream_ssl_module --with-stream --with-http_gzip_static_module --with-threads2.编译和安装Nginx
执行指令:
#make install
3.Nginx自带的各类命令
进入到安装目录/usr/local/nginx/sbin,在这个里面进行nginx的启动、停止、重启和配置检查,执行指令:
nginx#启动Nginx服务
nginx -s stop#停止Nginx服务
nginx -s reload#重新加载Nginx
nginx -t#检查Nginx配置文件。
4.设置Nginx服务托管给systemd,并且开机自启
进入到/etc/systemd/system文件夹下,创建nginx.service文件,填写如下内容到nginx.service配置文件中。
[Unit]Description=Nginx HTTP ServerAfter=network.target remote-fs.target nss-lookup.target[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pid# 启动前先测试配置ExecStartPre=/usr/local/nginx/sbin/nginx -t# 启动命令ExecStart=/usr/local/nginx/sbin/nginx# 重载配置ExecReload=/usr/local/nginx/sbin/nginx -s reload# 停止命令ExecStop=/usr/local/nginx/sbin/nginx -s stopPrivateTmp=true# 异常退出自动重启(可选)Restart=on-failureRestartSec=2[Install]WantedBy=multi-user.target
#systemctl enable nginx
#systemctl start nginx
二、安装uWSGI服务
1.安装Python开发依赖包,uWSGI编译需要此工具
#yum install python3-devel
2.进入到uWSGI解压目录uwsgi-2.0.31,安装uWSGI服务。本文安装的Python是3.11.9版本,并且通过软链接生成Python3.11命令,执行命令:
#python3.11 setup.py install
3.设置uWSGI托管给systemd,并设置开机自启。
进入到/etc/systemd/system文件夹下,创建uwsgi.service文件,填写如下内容到uwsgi.service文件中。
[Unit]Description=uWSGI ServiceAfter=network.target[Service]# 运行用户(根据你的实际情况修改,通常是root)User=rootGroup=root#如果不确定路径,执行 which uwsgi 查看#uwsgi.ini文件位于/home/django文件夹下ExecStart=/usr/local/bin/uwsgi --ini /home/django/uwsgi.ini# 重启策略(崩溃自动重启)Restart=alwaysRestartSec=5# 工作目录(和你的uwsgi.ini 里的chdir 保持一致)WorkingDirectory=/home/django[Install]WantedBy=multi-user.target
# systemctl enable uwsgi
# systemctl start uwsgi
4.配置uwsgi.ini文件。
进入到/home/django文件夹下,创建uwsgi.ini文件。其中,设置processes为CPU核数*2,threads默认=2即可。如果想通过socket通信,保留socket这一行;如果想http通信,保留http这一行。
[uwsgi]# 你的Django 项目根目录(manage.py 所在文件夹)chdir = /home/django# Django 的 wsgi 文件(项目名.wsgi)module = 你的Django项目名.wsgi:application# 2核4G 服务器最佳进程配置master = trueprocesses = 4threads = 2# 使用 socket 和 Nginx 通信socket = %(chdir)/uwsgi.sockchmod-socket = 666vacuum = true#使用http和Nginx通信,本文进行注释#http=X.X.X.X:端口号 例如,http=127.0.0.1:8000# 安全设置single-interpreter = trueenable-threads = truethunder-lock = true# 日志daemonize = %(chdir)/uwsgi.logpidfile = %(chdir)/uwsgi.pid# 防止中文乱码env = LANG=en_US.UTF-8env = LC_ALL=en_US.UTF-8
(4)拷贝Django代码到指定目录
将开发好的代码,复制到/home/django文件下,保持django项中的manage.py与uwsgi.ini在同一级目录下。
(5)收集静态文件到manage.py同级目录下,本文收集js、css、png文件到static_prod文件夹中。执行命令:
#python3.11 manage.py collectstatic
(6)修改Nginx配置文件,将静态文件指向static_prod,将动态交互内容指向uwsgi
进入到/usr/local/nginx/conf文件夹下,修改nginx.conf文件内容如下所示:
location / {
proxy_pass http://127.0.0.1:8000;
}
location /static/ {
alias /home/django/static_prod/;
}
(7)重启nginx服务,让配置生效,最终达成效果如下图所示。其中,图片、js、css由nginx处理,登录验证等动态交互由uwsgi处理。

【结束语】
恭喜您,成功完成Django应用部署。评论区有文章总结!觉得好可以关注、点赞、推荐、转发,谢谢!