在 Ubuntu 系统上部署 Python + Django + MySQL 网站,推荐采用 Nginx + Gunicorn + Django + MySQL 的经典生产环境架构。
以下是完整的配置推荐和步骤指南:
一、整体架构说明
用户请求 → Nginx (静态文件/反向X_X) → Gunicorn (WSGI服务器) → Django (应用逻辑) → MySQL (数据库)
- Nginx: 处理静态文件、HTTPS、反向X_X请求到 Gunicorn
- Gunicorn: Python WSGI HTTP 服务器,高效运行 Django
- Django: Web 框架
- MySQL: 关系型数据库
❌ 不推荐使用 Apache + mod_wsgi 或 Django 内置开发服务器用于生产环境
二、系统准备(Ubuntu 22.04 LTS)
1. 更新系统并安装基础工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip python3-venv python3-dev libmysqlclient-dev
nginx mysql-server mysql-client certbot python3-certbot-nginx git curl wget
2. 创建专用用户(安全最佳实践)
sudo adduser --system --no-create-home --shell /bin/false django-user
三、MySQL 配置
1. 设置 root 密码并优化
sudo mysql_secure_installation
按提示设置 root 密码,移除匿名用户、禁止远程 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;
3. 修改 MySQL 字符集(可选但推荐)
编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,确保:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
重启 MySQL:
sudo systemctl restart mysql
四、Django 项目部署
1. 创建项目目录
sudo mkdir -p /var/www/myproject
sudo chown django-user:django-user /var/www/myproject
2. 以 django-user 身份创建虚拟环境并安装依赖
sudo su - django-user
cd /var/www/myproject
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install django gunicorn mysqlclient psycopg2-binary # 如果用 PostgreSQL 则装 psycopg2-binary
pip install django-environ # 可选:环境变量管理
3. 上传/克隆项目代码
# 假设你有 Git 仓库
git clone https://github.com/yourusername/myproject.git .
# 或手动上传项目文件
pip install -r requirements.txt
4. 配置 Django settings.py
关键配置示例:
# settings.py
import environ
env = environ.Env()
environ.Env.read_env() # 读取 .env 文件
SECRET_KEY = env('SECRET_KEY')
DEBUG = False # 生产环境必须为 False
ALLOWED_HOSTS = ['your_domain.com', 'www.your_domain.com', 'your_server_ip']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': env('DB_NAME'), # myproject_db
'USER': env('DB_USER'), # myproject_user
'PASSWORD': env('DB_PASSWORD'),
'HOST': env('DB_HOST', default='localhost'),
'PORT': env('DB_PORT', default='3306'),
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
'charset': 'utf8mb4',
}
}
}
STATIC_ROOT = BASE_DIR / 'staticfiles'
MEDIA_ROOT = BASE_DIR / 'media'
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
# 其他必要配置...
5. 收集静态文件
python manage.py collectstatic --noinput
6. 迁移数据库并创建超级用户
python manage.py migrate
python manage.py createsuperuser # 按需执行
7. 测试 Gunicorn 是否正常运行
gunicorn myproject.wsgi:application --bind 127.0.0.1:8000 --workers 3
访问 http://your_server_ip:8000 应能看到 Django 页面。Ctrl+C 停止。
五、Gunicorn 服务配置
1. 创建 systemd 服务文件
sudo nano /etc/systemd/system/gunicorn.service
内容:
[Unit]
Description=Gunicorn daemon for Django project
After=network.target
[Service]
User=django-user
Group=www-data
WorkingDirectory=/var/www/myproject
ExecStart=/var/www/myproject/venv/bin/gunicorn
--access-logfile /var/log/gunicorn/access.log
--error-logfile /var/log/gunicorn/error.log
--bind unix:/run/gunicorn.sock
--workers 3
--timeout 120
myproject.wsgi:application
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
✅ 使用 Unix Socket (
unix:/run/gunicorn.sock) 比 TCP 端口更高效且更安全
2. 创建日志目录并启动服务
sudo mkdir -p /var/log/gunicorn
sudo chown django-user:www-data /var/log/gunicorn
sudo systemctl daemon-reload
sudo systemctl enable gunicorn
sudo systemctl start 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;
# 重定向 HTTPS(可选但推荐)
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name your_domain.com www.your_domain.com;
# SSL 证书路径(使用 Let's Encrypt)
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 安全头
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
# 静态文件
location /static/ {
alias /var/www/myproject/staticfiles/;
expires 30d;
access_log off;
}
# 媒体文件
location /media/ {
alias /var/www/myproject/media/;
expires 30d;
access_log off;
}
# 所有其他请求转发给 Gunicorn
location / {
proxy_pass http://unix:/run/gunicorn.sock;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
# 限制上传大小(按需调整)
client_max_body_size 50M;
}
2. 启用站点并获取 SSL 证书
# 链接到 sites-enabled
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重启 Nginx
sudo systemctl restart nginx
# 获取 Let's Encrypt 证书
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
如果 Certbot 自动修改了 Nginx 配置,请根据上述模板调整。
七、防火墙与安全
1. 开放必要端口
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full' # 允许 80 和 443
sudo ufw enable
sudo ufw status
2. 禁用不必要的服务
sudo systemctl disable apache2 # 如果安装了 Apache
八、监控与维护
1. 查看日志
# Gunicorn 错误日志
sudo tail -f /var/log/gunicorn/error.log
# Nginx 访问日志
sudo tail -f /var/log/nginx/access.log
# Nginx 错误日志
sudo tail -f /var/log/nginx/error.log
2. 定期更新
sudo apt update && sudo apt upgrade -y
cd /var/www/myproject && source venv/bin/activate && pip install --upgrade -r requirements.txt
3. 备份策略
# 备份数据库
mysqldump -u myproject_user -p myproject_db > backup_$(date +%F).sql
# 备份项目文件和 media
tar -czf project_backup_$(date +%F).tar.gz /var/www/myproject/staticfiles /var/www/myproject/media
九、性能优化建议
| 方面 | 建议 |
|---|---|
| Gunicorn Workers | workers = min(2, CPU核心数) + 1,通常 3~5 个 |
| Nginx 缓存 | 对静态文件启用 gzip 和缓存头 |
| MySQL 优化 | 启用查询缓存,合理索引,调整 innodb_buffer_pool_size |
| CDN | 静态资源使用 CDN(如 Cloudflare、阿里云 OSS) |
| Redis | 如需会话缓存或任务队列,可引入 Redis + Celery |
十、常见问题排查
| 问题 | 解决方案 |
|---|---|
| 502 Bad Gateway | 检查 Gunicorn 是否运行,socket 权限是否正确 |
| 静态文件 404 | 确认 collectstatic 已执行,Nginx alias 路径正确 |
| 数据库连接失败 | 检查 MySQL 用户权限、密码、主机名 |
| 权限拒绝 | 确保 django-user 有项目目录读写权限,Nginx worker 能访问 socket |
总结配置清单
✅ 软件栈: Ubuntu 22.04 + Nginx + Gunicorn + Django + MySQL
✅ 安全: 非 root 用户运行、HTTPS、防火墙、安全头
✅ 性能: Unix Socket、Worker 数量优化、静态文件缓存
✅ 可维护: systemd 服务管理、日志集中、自动化备份
按照以上步骤部署,你将获得一个稳定、安全、高性能的 Django 生产环境。
云服务器