在 Ubuntu 系统上部署 Python + Django + MySQL 网站,目前业界最推荐、最稳定且性能最佳的生产环境架构是:
Nginx (反向X_X) + Gunicorn (WSGI 服务器) + Django + MySQL
⚠️ 为什么不直接用
python manage.py runserver?
Django 自带的开发服务器仅用于调试,不支持并发、不安全、无静态文件处理能力。❌ 不推荐 Apache + mod_wsgi(配置复杂,资源占用高)
✅ 推荐 Nginx + Gunicorn(轻量、高性能、易维护)
📦 完整部署方案(Ubuntu 20.04/22.04 LTS)
一、系统准备
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装必要工具
sudo apt install -y nginx mysql-server python3-pip python3-venv git curl
二、MySQL 数据库配置
1. 启动并设置 MySQL root 密码
sudo systemctl start mysql
sudo systemctl enable mysql
sudo mysql_secure_installation # 按提示设置 root 密码、移除测试库等
2. 创建数据库和用户
sudo mysql -u root -p
CREATE DATABASE myproject_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myproject_user'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON myproject_db.* TO 'myproject_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
三、Django 项目部署
1. 创建虚拟环境并安装依赖
cd /var/www
sudo mkdir myproject
sudo chown $USER:$USER /var/www/myproject
cd /var/www/myproject
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install django gunicorn mysqlclient psycopg2-binary # mysqlclient 替代 PyMySQL 性能更好
pip freeze > requirements.txt
2. 创建 Django 项目(假设已有项目代码,此处为示例)
django-admin startproject myproject .
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
3. 配置 settings.py
# settings.py
DEBUG = False
ALLOWED_HOSTS = ['your_domain.com', 'www.your_domain.com', 'IP地址']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myproject_db',
'USER': 'myproject_user',
'PASSWORD': 'your_strong_password',
'HOST': '127.0.0.1', # 本地连接
'PORT': '3306',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
# 生产环境建议收集静态文件
# python manage.py collectstatic
4. 收集静态文件
python manage.py collectstatic
四、Gunicorn 配置
1. 创建 Gunicorn systemd 服务文件
sudo nano /etc/systemd/system/gunicorn.service
写入以下内容:
[Unit]
Description=gunicorn daemon for myproject
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/myproject
Environment="PATH=/var/www/myproject/venv/bin"
ExecStart=/var/www/myproject/venv/bin/gunicorn
--access-logfile -
--workers 3
--bind unix:/var/www/myproject/myproject.sock
myproject.wsgi:application
[Install]
WantedBy=multi-user.target
🔧 参数说明:
--workers 3:工作进程数,建议公式CPU核心数 * 2 + 1,最小为 2--bind unix:...:使用 Unix Socket 与 Nginx 通信(比 TCP 更快)myproject.wsgi:application:指向你的 WSGI 应用入口
2. 设置权限并启动
sudo chmod 644 /etc/systemd/system/gunicorn.service
sudo systemctl daemon-reload
sudo systemctl enable gunicorn
sudo systemctl start gunicorn
# 检查状态
sudo systemctl status gunicorn
3. 确保 Nginx 用户能访问 socket
sudo setfacl -m u:www-data:rwx /var/www/myproject
sudo chgrp www-data /var/www/myproject/myproject.sock
sudo chmod 775 /var/www/myproject/myproject.sock
五、Nginx 反向X_X配置
1. 创建 Nginx 站点配置
sudo nano /etc/nginx/sites-available/myproject
写入:
server {
listen 80;
server_name your_domain.com www.your_domain.com;
# 重定向 HTTP 到 HTTPS(可选,需先配置 SSL)
# return 301 https://$server_name$request_uri;
location / {
include proxy_params;
proxy_pass http://unix:/var/www/myproject/myproject.sock;
}
# 静态文件直接由 Nginx 处理
location /static/ {
alias /var/www/myproject/staticfiles/;
}
# 媒体文件(如有上传)
location /media/ {
alias /var/www/myproject/media/;
}
# 日志
access_log /var/log/nginx/myproject.access.log;
error_log /var/log/nginx/myproject.error.log;
}
2. 启用站点并重启 Nginx
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default # 移除默认配置
# 测试配置语法
sudo nginx -t
# 重启 Nginx
sudo systemctl restart nginx
sudo systemctl enable nginx
六、SSL 证书配置(Let’s Encrypt 免费证书)
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx
# 获取并自动配置 SSL
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
# 自动续期测试
sudo certbot renew --dry-run
Certbot 会自动修改 Nginx 配置,添加 HTTPS 和 HTTP→HTTPS 重定向。
七、防火墙与安全加固
1. UFW 防火墙
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full' # 允许 HTTP 和 HTTPS
sudo ufw enable
sudo ufw status
2. 限制 MySQL 仅本地访问
确保 my.cnf 中绑定本地 IP:
[mysqld]
bind-address = 127.0.0.1
3. 禁用不必要的服务
sudo systemctl stop apache2 # 如果安装了 Apache
sudo systemctl disable apache2
八、监控与维护
1. 查看日志
# Gunicorn 日志
sudo journalctl -u gunicorn -f
# Nginx 日志
sudo tail -f /var/log/nginx/myproject.access.log
sudo tail -f /var/log/nginx/myproject.error.log
2. 自动备份脚本(示例)
#!/bin/bash
BACKUP_DIR="/backup/django"
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
# 备份数据库
mysqldump -u myproject_user -p'your_password' myproject_db > $BACKUP_DIR/db_$DATE.sql
# 备份项目代码和静态文件
tar -czf $BACKUP_DIR/project_$DATE.tar.gz /var/www/myproject/
# 保留最近 7 天备份
find $BACKUP_DIR -type f -mtime +7 -delete
📊 性能优化建议
| 优化项 | 建议 |
|---|---|
| Gunicorn Workers | min(2, CPU核数) * 2 + 1,一般 3~5 个 |
| Nginx Worker Processes | auto(自动匹配 CPU 核数) |
| Gzip 压缩 | 在 Nginx 中启用 gzip |
| 缓存 | 使用 Redis/Memcached 做会话或查询缓存 |
| 数据库连接池 | Django 默认已支持,确保 CONN_MAX_AGE 合理设置 |
| CDN | 静态文件托管到 CDN(如 Cloudflare、阿里云 OSS) |
✅ 验证部署是否成功
- 访问
http://your_domain.com→ 应看到 Django 页面 - 访问
/admin/→ 应能登录后台 - 检查静态文件是否正常加载
- 使用 PageSpeed Insights 或 GTmetrix 检测性能
🔄 更新部署流程
每次代码更新后执行:
cd /var/www/myproject
git pull origin main # 或从仓库拉取最新代码
source venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py collectstatic --noinput
sudo systemctl restart gunicorn
此方案在生产环境中广泛使用,稳定性高、易于扩展,适合中小型网站。如需更高并发,可考虑将 Gunicorn 替换为 Uvicorn + Daphne(支持 WebSocket)或使用 Kubernetes + Docker 容器化部署。
轻量云Cloud