速卖通素材
奋斗

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

服务器

在 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)

✅ 验证部署是否成功

  1. 访问 http://your_domain.com → 应看到 Django 页面
  2. 访问 /admin/ → 应能登录后台
  3. 检查静态文件是否正常加载
  4. 使用 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 » ubuntu系统nginx部署python+django+mysql网站服务器配置推荐?