Nginx与uWSGI部署Django生产环境的完整指南
本文详细讲解如何在Linux服务器上使用Nginx和uWSGI部署Django项目。从安装配置到解决静态资源(static/media)无法访问的问题,涵盖DEBUG模式调整、collectstatic命令使用及Nginx反向代理设置,帮助开发者顺利完成从开发到生产环境的迁移。
Nginx与uWSGI部署Django生产环境指南
暑期完成的小项目准备上线云服务器。起初尝试直接运行 `python3 manager.py runserver 0.0.0.0:80`,但这仅适用于Django的开发模式,且不支持多用户并发访问。为了实现生产环境的稳定运行,必须引入专业的Web服务器进行部署,这里选择Nginx。
选择Nginx的理由
关于Nginx的选择理由。
选择Nginex的原因。
Nginx具有轻量、简洁的特点,相比Apache更为轻便,且社区普遍推荐其用于Django部署。
环境安装与配置
安装步骤。
安装过程此处省略。建议Linux用户通过源码编译安装,因为包管理器安装的版本可能包含非官方的二次开发修改。使用官方原版更为稳妥。
uWSGI配置详解
uWSGI的作用。
为何需要uWSGI介入。
Nginx作为反向代理服务器,负责监听外部端口(如80),并将请求转发至内部端口(如8000)。用户实际访问的是Nginx,从而隐藏了后端真实端口。然而,Nginx本身不具备处理Django应用逻辑的能力,且单点代理仍受限于并发处理能力,因此需要uWSGI来处理多用户并发请求。
uWSGI的安装方法。
pip install uwsgi
配置文件详解。
首先查看项目目录结构。
FlyCold
├── FlyCold
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── SchoolBuy
│ ├── admin.py
│ ├── forms.py
│ ├── __init__.py
│ ├── models.py
│ ├── urls.py
│ └── views.py
└── templates
以下是精简后的目录树结构。项目名为FlyCold,包含FlyCold子目录和SchoolBuy子目录。主要业务代码位于SchoolBuy中,`settings.py` 位于FlyCold子目录,而 `manage.py` 位于FlyCold根目录。
安装完成后,需要创建配置文件。
# myweb_uwsgi.ini file
[uwsgi]
# Django-related settings
socket = :8080
#真实服务的端口
# Django项目根目录 (绝对路径)
chdir = /home/lyt/FlyCold
# wsgi.py文件在项目中的位置
module = FlyCold.wsgi
# process-related settings
# master
master = true
# 运行的进程数
processes = 4
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
该 `.ini` 配置文件可放置于任意位置,启动时通过命令 `uwsgi --ini ***.ini` 指定路径即可加载配置。
Nginx反向代理配置
Nginx配置步骤。
找到 `nginx.conf` 文件,写入相应的服务器配置。
server {
#这里是访问时用到的端口
listen 80;
server_name localhost;
charset UTF-8;
#这块存让日志文件
access_log /var/log/nginx/SchoolBuy_access.log;
error_log /var/log/nginx/SchoolBuy_error.log;
client_max_body_size 75M;
location / {
include uwsgi_params;
#同uwsgi内容
uwsgi_pass 127.0.0.1:8001;
#链接超时时间
uwsgi_read_timeout 30;
}
}
保存配置后重启Nginx服务,访问80端口即可看到部署效果。
静态资源处理与优化
常见问题排查。
部署后可能会发现网页静态资源(如Admin后台页面)加载异常,样式简陋。这是因为Django默认处理静态资源的方式与Nginx+uWSGI架构不兼容。实际上,静态资源处理应由Nginx负责,因其在此方面性能更优,Django不应承担此任务。
通常涉及两类静态资源:以 `/media/` 开头的用户上传文件和以 `/static/` 开头的网站原始资源(图片、视频、JS、CSS)。Django默认支持 `/static/` 的处理。要关闭Django对 `/static/` 的处理,只需在 `settings.py` 中将 `DEBUG` 设置为 `False`,此时Django将不再处理静态文件。
对于 `/media/` 目录,通常用于存储用户上传的图片。需在 `settings.py` 中进行相应配置。
MEDIA_URL = '/media/' #访问的前缀链接
MEDIA_ROOT = os.path.join(BASE_DIR, '../media') #存放文件的具体位置
接着在 `urls.py` 中添加相关路由配置。
from django.conf import settings
from django.conf.urls.static import static
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
上述配置的含义是:当 `DEBUG=True` 时,Django会解析 `/media/` 请求,文件存储路径由第二个参数指定。
当部署为生产环境时,只需将 `DEBUG` 改为 `False`,Django便不再处理 static 和 media 文件,转而由Nginx接管。
静态文件收集。
Django提供了一个工具,用于收集项目中所有应用的静态文件,便于Nginx统一解析。
在 `settings.py` 中设置 `STATIC_ROOT = os.path.join(BASE_DIR, '../collectedstatic')`,指定收集目录。
配置好目录后,运行命令 `python3 manager.py collectstatic` 即可将静态文件收集至指定目录。
Nginx解析静态文件配置。
同样需要在 `nginx.conf` 中进行调整。
首先,在配置文件顶部添加 `user root`。
声明由root用户运行Nginx,否则访问静态文件时可能会遇到权限不足的错误。
其次,在之前配置的 `location /` 之前,添加针对静态文件的处理块。
location /static/ {
autoindex on;
alias /root/SchoolBuyWeb/collectedstatic/;
}
location /media/ {
autoindex on;
alias /root/SchoolBuyWeb/media/;
}
注意确保 `alias` 后的路径与你设定的静态文件目录完全一致。
重启Nginx服务,此时静态资源应能正常访问。
以上即为Nginx结合uWSGI部署Django项目的完整流程,希望对各位开发者有所帮助,欢迎继续支持本站获取更多技术内容。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













