Ubuntu 20.04 上用 Nginx+Gunicorn 部署 Django 要怎么操作?

文章导读
Ubuntu 20.04 上部署 Django 推荐使用 Nginx 作为反向代理服务器,配合 Gunicorn 作为 WSGI HTTP 服务器。此方案适合生产环境,需注意防火墙端口仅开放 Nginx 的 80/443 端口,避免直接暴露 Gunicorn。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Ubuntu 20.04 上部署 Django 推荐使用 Nginx 作为反向代理服务器,配合 Gunicorn 作为 WSGI HTTP 服务器。此方案适合生产环境,需注意防火墙端口仅开放 Nginx 的 80/443 端口,避免直接暴露 Gunicorn。

先说结论:该架构是 Django 生产环境的标准部署方案,利用 Nginx 处理静态资源和并发连接,Gunicorn 专注 Python 应用逻辑。

  • 适合:需要对外提供 HTTP/HTTPS 服务的生产环境 Django 项目
  • 先准备:确保已安装 Python3 虚拟环境且 Django 项目能本地运行
  • 验收:通过公网 IP 访问域名能正常加载页面且静态文件无 404

命令速用版

以下命令用于安装依赖、创建服务配置文件及重启服务,需在 sudo 权限下执行。

sudo apt update
sudo apt install python3-pip python3-venv nginx
pip install gunicorn
sudo systemctl daemon-reload
sudo systemctl restart nginx

为什么会这样

Django 内置开发服务器不适合生产环境,因为它无法有效处理并发请求和静态文件。

Nginx 作为高性能 Web 服务器,擅长处理静态文件、SSL 终止和并发连接;Gunicorn 作为 WSGI 服务器,负责将 HTTP 请求转换为 Python 应用能理解的格式。两者配合能确保应用稳定性和安全性。

分步处理

1. 准备 Python 环境

在项目目录下创建虚拟环境并安装 Gunicorn。

python3 -m venv venv
source venv/bin/activate
pip install gunicorn django

2. 创建 Systemd 服务

创建/etc/systemd/system/gunicorn.service 文件,配置开机自启。

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/path/to/your/project
ExecStart=/path/to/venv/bin/gunicorn `--access-logfile` - `--workers` 3 `--bind` unix:/run/gunicorn.sock your_project.wsgi:application

[Install]
WantedBy=multi-user.target

注意替换 User、WorkingDirectory 和 ExecStart 中的路径为实际值。

3. 配置 Nginx 反向代理

在/etc/nginx/sites-available/下创建配置文件,指向 Gunicorn 的 socket 文件。

Ubuntu 20.04 上用 Nginx+Gunicorn 部署 Django 要怎么操作?
server {
    listen 80;
    server_name your_domain;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        alias /path/to/your/project/static/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

4. 启用配置并重启

链接配置到 sites-enabled 并测试 Nginx 配置。

sudo ln -s /etc/nginx/sites-available/your_project /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl start gunicorn

怎么验证是否生效

检查服务状态和日志是确认部署成功的最直接方式。

  • 检查服务状态:运行systemctl status gunicornsystemctl status nginx,显示 active (running) 即为正常。
  • 检查日志:查看/var/log/nginx/error.log确认无权限错误或连接拒绝。
  • 页面测试:浏览器访问服务器 IP 或域名,确认 Django 页面加载且 CSS/JS 无 404 错误。

常见坑

  • 静态文件 404:忘记运行python manage.py collectstatic导致 Nginx 找不到静态资源。
  • 权限拒绝:Gunicorn 创建的 socket 文件 Nginx 无法读取,需确保用户组权限正确。
  • 防火墙拦截:Ubuntu 默认 UFW 可能未开放 80/443 端口,需执行sudo ufw allow 'Nginx Full'

常见问题

为什么浏览器显示 502 Bad Gateway?

通常是因为 Nginx 无法连接到 Gunicorn 的 socket 文件。

检查 socket 文件路径是否在 Nginx 配置中正确书写,并确认 Gunicorn 服务正在运行。

静态文件加载失败怎么办?

需要在 Django 项目中配置 STATIC_ROOT 并收集静态文件。

运行python manage.py collectstatic,并确保 Nginx 配置中的 alias 路径与该目录一致。

需要重启服务器才能生效吗?

不需要,重启相关服务即可。

修改配置后执行systemctl restart nginxsystemctl restart gunicorn即可应用变更。

参考来源

  • Django 官方文档 - 部署指南:https://docs.djangoproject.com/
  • Gunicorn 官方文档 - 部署:https://docs.gunicorn.org/
  • Nginx 官方文档 - 入门指南:https://nginx.org/en/docs/
  • Ubuntu 官方文档 - 服务器版:https://ubuntu.com/server/docs