ubuntu系统nginx部署python+django+mysql网站服务器配置推荐?

在 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 » ubuntu系统nginx部署python+django+mysql网站服务器配置推荐?