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

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


🛡️ 七、安全加固建议

  1. 防火墙

    sudo ufw allow 'Nginx Full'
    sudo ufw allow OpenSSH
    sudo ufw enable
  2. Fail2Ban 防止暴力破解

    sudo apt install fail2ban
    sudo systemctl enable fail2ban
  3. 定期更新

    sudo unattended-upgrades
  4. 日志监控

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