Django Nginx+uwsgi 安装配置(最佳实践)

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

⚠️ 注意:chdirhome 必须是绝对路径,否则 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 进程或线程太少 增加 processesthreads 数量
权限拒绝 文件或目录权限不足 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 安装配置,说明你已经迈入了后端开发的“实战阶段”。继续加油!