在 Ubuntu 系统上部署 Python + Django + MySQL 网站,目前业界最推荐、最稳定且性能最好的架构是:
Nginx (反向X_X/静态文件) + Gunicorn (WSGI 服务器) + Django (应用) + MySQL (数据库)
⚠️ 不推荐使用
python manage.py runserver生产环境,也不推荐直接使用 Apache + mod_wsgi(除非有特定遗留需求),因为 Nginx + Gunicorn 组合更轻量、并发处理能力更强。
✅ 推荐配置方案概览
| 组件 | 角色 | 推荐版本 |
|---|---|---|
| OS | 操作系统 | Ubuntu 22.04 LTS |
| Web Server | 反向X_X & 静态文件服务 | Nginx |
| App Server | WSGI 服务器 | Gunicorn |
| Framework | Web 框架 | Django |
| Database | 关系型数据库 | MySQL 8.0+ |
| Process | 进程管理 | Systemd |
| Security | HTTPS | Let’s Encrypt (Certbot) |
| Cache | 可选缓存 | Redis / Memcached |
📦 一、系统准备
1. 更新系统并安装基础工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip python3-venv nginx mysql-server git curl
2. 创建专用用户(安全最佳实践)
sudo adduser --disabled-password --gecos "" deploy
sudo usermod -aG sudo deploy
su - deploy
🗄️ 二、MySQL 配置
1. 设置 root 密码并优化
sudo mysql_secure_installation
2. 创建数据库和用户
CREATE DATABASE mysite CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mysite_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON mysite.* TO 'mysite_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
3. 修改 MySQL 配置文件(可选优化)
编辑 /etc/mysql/mysql.conf.d/mysqld.cnf:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
max_connections = 500
innodb_buffer_pool_size = 256M # 根据内存调整
重启 MySQL:
sudo systemctl restart mysql
🐍 三、Django 项目部署
1. 创建虚拟环境
cd ~
mkdir myproject && cd myproject
python3 -m venv venv
source venv/bin/activate
2. 安装依赖
pip install django gunicorn mysqlclient whitenoise
# 如果用了 Celery,还需:celery redis
3. 配置 Django settings.py
# settings.py
DEBUG = False
ALLOWED_HOSTS = ['your_domain.com', 'www.your_domain.com', 'IP地址']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'USER': 'mysite_user',
'PASSWORD': 'strong_password',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
},
}
}
# 静态文件配置
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATIC_URL = '/static/'
# 使用 WhiteNoise 提供静态文件(简化 Nginx 配置)
INSTALLED_APPS += ['whitenoise.runserver_nostatic']
MIDDLEWARE.insert(1, 'whitenoise.middleware.WhiteNoiseMiddleware')
4. 收集静态文件
python manage.py collectstatic
5. 测试运行
gunicorn myproject.wsgi:application --bind 127.0.0.1:8000
访问 http://localhost:8000 确认正常。
🔧 四、Gunicorn 配置
1. 创建 systemd 服务文件
sudo nano /etc/systemd/system/gunicorn.service
内容如下:
[Unit]
Description=gunicorn daemon for myproject
After=network.target
[Service]
User=deploy
Group=www-data
WorkingDirectory=/home/deploy/myproject
ExecStart=/home/deploy/myproject/venv/bin/gunicorn
--access-logfile -
--workers 3
--bind unix:/home/deploy/myproject/myproject.sock
myproject.wsgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.target
💡 workers 数量建议:
(2 × CPU核心数) + 1,一般 3~5 个足够。
2. 设置权限并启动
sudo chmod 664 /home/deploy/myproject/myproject.sock
sudo chown www-data:www-data /home/deploy/myproject/myproject.sock
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
🌐 五、Nginx 配置
1. 创建站点配置
sudo nano /etc/nginx/sites-available/myproject
内容如下:
server {
listen 80;
server_name your_domain.com www.your_domain.com;
# 静态文件由 Nginx 直接提供(性能更好)
location /static/ {
alias /home/deploy/myproject/staticfiles/;
}
# 媒体文件(如有上传)
location /media/ {
alias /home/deploy/myproject/media/;
}
# X_X到 Gunicorn
location / {
include proxy_params;
proxy_pass http://unix:/home/deploy/myproject/myproject.sock;
}
# 健康检查端点(可选)
location /health/ {
access_log off;
return 200 "OK";
}
}
2. 启用站点并测试配置
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
🔒 六、HTTPS 配置(Let’s Encrypt)
1. 安装 Certbot
sudo apt install certbot python3-certbot-nginx
2. 获取证书
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
Certbot 会自动修改 Nginx 配置并重定向 HTTP → HTTPS。
🛡️ 七、安全加固建议
-
防火墙
sudo ufw allow 'Nginx Full' sudo ufw allow OpenSSH sudo ufw enable -
Fail2Ban 防止暴力破解
sudo apt install fail2ban sudo systemctl enable fail2ban -
定期更新
sudo unattended-upgrades -
日志监控
sudo tail -f /var/log/nginx/access.log sudo journalctl -u gunicorn -f
📊 八、性能优化建议
| 优化项 | 方法 |
|---|---|
| 静态文件 | 使用 CDN(如 Cloudflare)或 Nginx 直接提供 |
| 数据库连接池 | Django 默认已支持,确保 CONN_MAX_AGE 设置合理 |
| Gunicorn workers | 根据 CPU 核心数调整,避免过多导致上下文切换 |
| 缓存 | 使用 Redis 做页面缓存或会话存储 |
| 压缩 | Nginx 开启 gzip |
| 数据库索引 | 为常用查询字段添加数据库索引 |
🔄 九、自动化部署(可选)
可使用以下工具实现一键部署:
- GitHub Actions + SSH
- Ansible 配置管理
- Capistrano(Ruby 生态,也可用)
- Fabric(Python 脚本)
示例 GitHub Actions 片段:
name: Deploy to Ubuntu
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd ~/myproject
git pull origin main
source venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py collectstatic --noinput
systemctl restart gunicorn
✅ 最终验证清单
- [ ] Django 页面正常访问
- [ ] 静态文件加载正常
- [ ] HTTPS 生效(绿锁)
- [ ] 数据库读写正常
- [ ] Gunicorn 进程常驻
- [ ] Nginx 日志无错误
- [ ] 防火墙仅开放必要端口(80, 443, 22)
📝 总结
| 步骤 | 关键命令/文件 |
|---|---|
| 系统准备 | apt install python3-pip nginx mysql-server |
| MySQL | 创建数据库和用户,设置 utf8mb4 |
| Django | collectstatic, 配置 settings.py |
| Gunicorn | systemd 服务,绑定 Unix socket |
| Nginx | 反向X_X到 Gunicorn,提供静态文件 |
| HTTPS | Certbot 自动配置 |
| 安全 | UFW, Fail2Ban, 最小权限原则 |
这套配置在生产环境中广泛使用,稳定性高、易于维护、扩展性强。如需更高并发,可后续引入 Redis 缓存、Celery 异步任务、负载均衡器 等组件。
CLOUD技术博