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 文件。
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 gunicorn和systemctl 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 nginx或systemctl restart gunicorn即可应用变更。
参考来源
- Django 官方文档 - 部署指南:https://docs.djangoproject.com/
- Gunicorn 官方文档 - 部署:https://docs.gunicorn.org/
- Nginx 官方文档 - 入门指南:https://nginx.org/en/docs/
- Ubuntu 官方文档 - 服务器版:https://ubuntu.com/server/docs