奋斗
努力

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

云计算

在 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 生产环境。

未经允许不得转载:云服务器 » ubuntu系统nginx部署python+django+mysql网站服务器配置推荐?