在 Ubuntu 系统上部署 Python + Django + MySQL 网站,目前业界最稳定、高性能且易于维护的架构推荐如下:
✅ 推荐架构方案
用户请求 → Nginx (反向X_X/静态文件服务)
↓
Gunicorn / uWSGI (WSGI服务器,运行Django)
↓
Django Application (Python)
↓
MySQL Database (数据存储)
为什么不用 Apache?
Nginx 在高并发下性能更优,资源占用更低,与 Gunicorn/uWSGI 配合更紧密。
📦 一、环境准备(Ubuntu 22.04 LTS)
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装必要工具
sudo apt install -y python3-pip python3-venv nginx mysql-server git curl wget
# 验证安装
python3 --version
pip3 --version
nginx -v
mysql --version
🗄️ 二、MySQL 配置
1. 初始化 MySQL 并设置 root 密码
sudo mysql_secure_installation
2. 创建数据库和用户
sudo mysql -u root -p
CREATE DATABASE myproject_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myproject_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
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 myproject
cd myproject
python3 -m venv venv
source venv/bin/activate
2. 安装依赖
pip install django gunicorn mysqlclient Pillow psycopg2-binary # 如果用PostgreSQL则换psycopg2
⚠️
mysqlclient需要系统库支持:sudo apt install -y default-libmysqlclient-dev build-essential pkg-config
3. 上传或克隆项目代码
git clone https://github.com/yourusername/myproject.git .
# 或手动上传项目文件
4. 配置 Django settings.py
# settings.py
DEBUG = False
ALLOWED_HOSTS = ['your_domain.com', 'www.your_domain.com', 'your_server_ip']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myproject_db',
'USER': 'myproject_user',
'PASSWORD': 'StrongPassword123!',
'HOST': 'localhost',
'PORT': '3306',
}
}
STATIC_ROOT = '/var/www/myproject/staticfiles/'
MEDIA_ROOT = '/var/www/myproject/media/'
5. 收集静态文件 & 迁移数据库
python manage.py collectstatic --noinput
python manage.py migrate
python manage.py createsuperuser # 可选
🚀 四、Gunicorn 配置
1. 测试 Gunicorn 是否正常工作
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
访问 http://your_server_ip:8000 确认页面正常显示后,Ctrl+C 停止。
2. 创建 systemd 服务文件
sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=Gunicorn daemon for Django project
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/myproject
ExecStart=/var/www/myproject/venv/bin/gunicorn
--access-logfile -
--workers 3
--bind unix:/var/www/myproject/myproject.sock
myproject.wsgi:application
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
💡 参数说明:
--workers 3:工作进程数,建议公式2×CPU核心数+1--bind unix:...sock:使用 Unix socket 比 TCP 更快更安全User/Group=www-data:Nginx 默认运行用户,需确保权限一致
3. 启动并启用服务
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
# 检查状态
sudo systemctl status gunicorn
🌐 五、Nginx 配置
1. 创建 Nginx 站点配置
sudo nano /etc/nginx/sites-available/myproject
server {
listen 80;
server_name your_domain.com www.your_domain.com;
# 静态文件直接由 Nginx 处理
location /static/ {
alias /var/www/myproject/staticfiles/;
}
location /media/ {
alias /var/www/myproject/media/;
}
# 所有其他请求转发给 Gunicorn
location / {
include proxy_params;
proxy_pass http://unix:/var/www/myproject/myproject.sock;
}
# 安全头
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
}
2. 启用站点并测试配置
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
🔒 六、SSL 证书(Let’s Encrypt)
1. 安装 Certbot
sudo apt install -y certbot python3-certbot-nginx
2. 获取证书
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
Certbot 会自动修改 Nginx 配置并重定向 HTTPS。
3. 自动续期
sudo certbot renew --dry-run # 测试续期
# Certbot 已自动添加 cron job 定期续期
🔐 七、权限与安全加固
1. 设置正确权限
sudo chown -R www-data:www-data /var/www/myproject
sudo chmod -R 755 /var/www/myproject
sudo chmod 644 /var/www/myproject/myproject/settings.py # 如果包含敏感信息
2. 防火墙配置
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status
3. 禁用目录浏览
在 Nginx 配置中添加:
location ~* ^/(static|media)/ {
autoindex off;
...
}
📊 八、监控与维护
1. 查看日志
# Gunicorn 日志(stdout/stderr)
sudo journalctl -u gunicorn -f
# Nginx 错误日志
sudo tail -f /var/log/nginx/error.log
# Django 日志(需在 settings.py 中配置)
2. 备份策略
# 数据库备份
mysqldump -u myproject_user -p myproject_db > backup_$(date +%F).sql
# 项目文件备份
tar -czvf project_backup_$(date +%F).tar.gz /var/www/myproject
3. 更新项目
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
🧪 九、健康检查与自动化
1. 创建健康检查脚本
sudo nano /usr/local/bin/check_django_health.sh
#!/bin/bash
curl -s -o /dev/null -w "%{http_code}" http://localhost/ | grep -q "200"
if [ $? -eq 0 ]; then
exit 0
else
exit 1
fi
sudo chmod +x /usr/local/bin/check_django_health.sh
2. 添加到 systemd 定时器(可选)
📁 十、目录结构参考
/var/www/myproject/
├── venv/ # 虚拟环境
├── myproject/ # Django 项目代码
│ ├── manage.py
│ ├── wsgi.py
│ └── settings.py
├── staticfiles/ # collectstatic 输出
├── media/ # 用户上传文件
├── myproject.sock # Gunicorn Unix socket
└── requirements.txt # Python 依赖
✅ 最终验证清单
- [ ] Nginx 正常运行,监听 80/443 端口
- [ ] Gunicorn 通过 Unix socket 与 Nginx 通信
- [ ] Django 页面可正常访问
- [ ] 静态文件正确加载
- [ ] MySQL 数据库连接正常
- [ ] SSL 证书有效且自动续期
- [ ] 防火墙仅开放必要端口(80, 443, 22)
- [ ] 日志可正常查看和轮转
🔄 替代方案对比
| 组件 | 推荐选择 | 备选 |
|---|---|---|
| WSGI Server | Gunicorn | uWSGI |
| Web Server | Nginx | Caddy(更简单但功能少) |
| DB | MySQL 8.0 | PostgreSQL |
| 进程管理 | systemd | Supervisor |
| SSL | Certbot | Cloudflare Tunnel |
此配置适用于中小型生产环境。如需更高可用性,可考虑:
- 多实例 Gunicorn + Nginx 负载均衡
- MySQL 主从复制
- Redis 缓存层
- Docker/Kubernetes 容器化部署
云知识CLOUD