Django Nginx+uwsgi 安装配置:从零搭建高性能生产环境
在开发 Django 项目时,我们通常先用 python manage.py runserver 跑起来测试,但这个命令只适用于本地开发。一旦项目要上线,就必须用更稳定、高效的部署方式。今天我们就来手把手教你完成 Django Nginx+uwsgi 安装配置,让你的项目真正跑在生产环境上。
这个过程就像盖房子:Django 是房子的结构设计,Nginx 是门卫和保安系统,而 uWSGI 就是连接房子和门卫的“信息通道”。三者配合,才能保证用户访问时既快又稳。
为什么需要 Nginx + uWSGI?——理解部署架构
你可能好奇:为什么不能直接用 Django 自带的服务器部署?原因很简单——它不够快,也不够稳。
想象一下,一个网站每天有上万用户访问。如果所有请求都交给 Django 自带的开发服务器处理,它就像一个只有一条车道的小路,高峰时段堵得水泄不通,还容易“翻车”。
而 Nginx + uWSGI 的组合,就像高速公路 + 交通指挥中心:
- Nginx 是前端的“流量调度员”:它负责接收所有用户请求,分发给后端处理。
- uWSGI 是“中间通信器”:它把 Nginx 的请求转成 Python 能理解的格式,交给 Django 处理。
- Django 是“内容生产者”:它真正执行业务逻辑,返回页面或数据。
这个架构支持多进程、负载均衡,还能做静态文件处理、HTTPS 加密等,是生产环境的标准配置。
环境准备与依赖安装
我们以 Ubuntu 22.04 为例,其他 Linux 发行版类似。先确保系统更新:
sudo apt update && sudo apt upgrade -y
接下来安装必要的工具:
sudo apt install python3 python3-pip -y
sudo apt install python3-venv -y
sudo apt install nginx -y
pip3 install uwsgi
💡 提示:
pip3 install uwsgi会自动安装 uWSGI 的 Python 接口。你也可以用apt install uwsgi,但版本可能较旧,推荐用 pip 安装。
创建 Django 项目并配置运行环境
假设你已经有一个 Django 项目,如果还没有,可以快速创建一个:
mkdir /opt/myproject && cd /opt/myproject
python3 -m venv venv
source venv/bin/activate
pip install django
django-admin startproject mysite .
现在项目结构如下:
/opt/myproject/
├── manage.py
├── mysite/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── venv/
我们重点修改 mysite/wsgi.py 文件,确保它能被 uWSGI 正确调用:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
application = get_wsgi_application()
这个文件是 uWSGI 调用 Django 的“入口点”,就像一个快递站的收件台,所有请求都先到这里。
配置 uWSGI 服务
uWSGI 是连接 Nginx 和 Django 的“翻译官”,我们需要写一个配置文件让它工作。
在项目根目录下创建 uwsgi.ini 文件:
[uwsgi]
chdir = /opt/myproject
home = /opt/myproject/venv
module = mysite.wsgi:application
processes = 4
threads = 2
http = :8000
logto = /var/log/uwsgi/myproject.log
log-maxsize = 104857600 # 100MB
⚠️ 注意:
chdir和home必须是绝对路径,否则 uWSGI 找不到项目和依赖。
现在你可以先测试 uWSGI 是否能正常运行:
uwsgi --ini uwsgi.ini
如果看到类似 uWSGI running 的提示,说明配置成功。此时访问 http://你的服务器IP:8000,应该能看到 Django 的欢迎页面。
配置 Nginx 作为反向代理
Nginx 的作用是“挡在 Django 前面”,它接收用户请求,再转发给 uWSGI。
先删除默认的 Nginx 配置:
sudo rm /etc/nginx/sites-enabled/default
然后创建新的站点配置文件:
sudo nano /etc/nginx/sites-available/myproject
写入以下内容:
server {
listen 80;
server_name your-domain.com; # 替换为你的域名或服务器 IP
# 静态文件路径(如 CSS、JS、图片)
location /static/ {
alias /opt/myproject/static/; # 确保这个路径存在
expires 1y;
add_header Cache-Control "public, immutable";
}
# 动态请求转发给 uWSGI
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000; # uWSGI 监听的端口
uwsgi_param UWSGI_CHDIR /opt/myproject;
uwsgi_param UWSGI_MODULE mysite.wsgi;
}
}
📌 重要:
your-domain.com替换为你的域名或服务器公网 IP。如果用 IP,可以写127.0.0.1。
接着启用站点配置:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
检查 Nginx 配置是否正确:
sudo nginx -t
如果提示 syntax is ok,说明没问题,重启 Nginx:
sudo systemctl restart nginx
启动服务并测试访问
现在我们来启动 uWSGI 服务,并通过 Nginx 访问。
先确保静态文件已收集:
source /opt/myproject/venv/bin/activate
python manage.py collectstatic --noinput
然后启动 uWSGI(建议用 systemd 管理):
sudo nano /etc/systemd/system/uwsgi-myproject.service
写入:
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/opt/myproject
ExecStart=/opt/myproject/venv/bin/uwsgi --ini uwsgi.ini
Restart=always
[Install]
WantedBy=multi-user.target
✅
User=www-data是 Nginx 默认用户,建议保持一致,避免权限问题。
保存后启用服务:
sudo systemctl enable uwsgi-myproject.service
sudo systemctl start uwsgi-myproject.service
最后,测试访问:
- 打开浏览器,访问
http://你的服务器IP - 如果看到 Django 欢迎页面,说明 Django Nginx+uwsgi 安装配置成功!
常见问题排查与优化建议
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 502 Bad Gateway | uWSGI 未启动或端口错误 | systemctl status uwsgi-myproject.service 检查状态 |
| 静态文件 404 | 静态路径配置错误 | 检查 location /static/ 的 alias 路径是否正确 |
| 页面加载慢 | uWSGI 进程或线程太少 | 增加 processes 和 threads 数量 |
| 权限拒绝 | 文件或目录权限不足 | sudo chown -R www-data:www-data /opt/myproject |
✅ 建议:定期查看日志文件:
tail -f /var/log/uwsgi/myproject.log
总结:从开发到上线的关键一步
完成 Django Nginx+uwsgi 安装配置后,你已经拥有了一个稳定、高效的生产部署架构。这个架构不仅支持高并发,还能轻松扩展,是企业级应用的标准选择。
记住,一个好的部署不是“装完就完事”,而是持续监控、优化和维护。比如你可以后续接入 HTTPS(用 Let's Encrypt)、配置缓存、做日志分析等。
现在,你的 Django 项目已经不再是“玩具”,而是真正能服务用户的生产系统了。
后续建议
- 学习使用
supervisor管理 uWSGI,比 systemd 更灵活。 - 配置
Gunicorn + Nginx作为替代方案,适合更复杂的场景。 - 定期备份数据库和静态文件,防止数据丢失。
当你能独立完成一次完整的 Django Nginx+uwsgi 安装配置,说明你已经迈入了后端开发的“实战阶段”。继续加油!