速卖通素材
努力

ubuntu 22.04系统部署web服务器python + Django+mysql?

服务器

在 Ubuntu 22.04 上部署 Python + Django + MySQL 的 Web 服务器,通常采用 Nginx + Gunicorn + Supervisor/Systemd 的经典架构。这种组合性能稳定、易于维护,且是生产环境的标准配置。

以下是完整的分步部署指南:


第一步:更新系统并安装基础依赖

首先更新软件包列表,安装必要的开发工具和编译库(用于编译 Python 扩展和数据库驱动)。

sudo apt update
sudo apt upgrade -y
sudo apt install python3-pip python3-venv python3-dev libmysqlclient-dev default-libmysqlclient-dev build-essential libssl-dev zlib1g-dev -y

注意libmysqlclient-dev 是编译 mysqlclient (Django 的官方 MySQL 后端) 所必需的 C 语言库。如果安装失败,可能需要先安装 default-libmysqlclient-dev


第二步:创建虚拟环境并安装项目依赖

建议为每个项目创建独立的 Python 虚拟环境,避免依赖冲突。

# 进入你的项目目录
cd /var/www/your_project_name

# 创建虚拟环境
python3 -m venv venv

# 激活虚拟环境
source venv/bin/activate

# 升级 pip 并安装核心依赖
pip install --upgrade pip
pip install django gunicorn mysqlclient psycopg2-binary requests
# 如果你使用 Redis 缓存等,也可以在此处安装

第三步:配置 MySQL 数据库

Django 需要连接 MySQL 数据库。我们需要创建数据库用户和权限。

  1. 安装 MySQL Server (如果尚未安装):

    sudo apt install mysql-server
    sudo mysql_secure_installation # 按提示设置 root 密码和安全选项
  2. 创建数据库和用户
    登录 MySQL 命令行:

    sudo mysql -u root -p

    执行以下 SQL 语句(请替换为你自己的数据库名、用户名和密码):

    CREATE DATABASE your_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    CREATE USER 'your_user'@'localhost' IDENTIFIED BY 'your_strong_password';
    GRANT ALL PRIVILEGES ON your_db_name.* TO 'your_user'@'localhost';
    FLUSH PRIVILEGES;
    EXIT;
  3. 配置 Django 设置
    编辑你的 settings.py 文件,找到 DATABASES 部分并修改:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'your_db_name',
            'USER': 'your_user',
            'PASSWORD': 'your_strong_password',
            'HOST': 'localhost',
            'PORT': '3306',
            'OPTIONS': {
                'charset': 'utf8mb4',
            },
        }
    }
  4. 迁移数据库

    python manage.py makemigrations
    python manage.py migrate
    python manage.py createsuperuser

第四步:收集静态文件与测试运行

在生产环境中,Django 不应直接提供静态文件(CSS/JS/图片),而是由 Nginx 处理。

  1. 收集静态文件

    mkdir staticfiles
    python manage.py collectstatic

    确保 STATIC_ROOT 在 settings.py 中已正确配置指向该目录。

  2. 本地测试 Gunicorn
    在后台启动 Gunicorn 进行临时测试,确保没有报错:

    gunicorn your_project_name.wsgi:application --bind 127.0.0.1:8000

    如果看到 Started server process [PID],说明服务正常。按 Ctrl+C 停止。


第五步:配置 Systemd 服务

为了让 Gunicorn 开机自启并在崩溃时自动重启,我们创建一个 Systemd 服务单元文件。

  1. 创建服务文件

    sudo nano /etc/systemd/system/gunicorn.service
  2. 写入以下内容(请根据实际路径修改 WorkingDirectoryUser):

    [Unit]
    Description=gunicorn daemon for your_project_name
    After=network.target
    
    [Service]
    User=www-data
    Group=www-data
    WorkingDirectory=/var/www/your_project_name
    ExecStart=/var/www/your_project_name/venv/bin/gunicorn 
              --access-logfile - 
              --workers 3 
              --worker-class gevent 
              --bind 127.0.0.1:8000 
              your_project_name.wsgi:application
    
    [Install]
    WantedBy=multi-user.target

    注意

    • UserGroup 建议使用 www-data (Ubuntu 默认 web 用户),或者创建一个新的专用用户。
    • --bind 绑定到 127.0.0.1:8000,这样 Nginx 可以通过反向X_X访问它,而不是让 Gunicorn 直接暴露公网端口。
  3. 启动服务

    sudo systemctl daemon-reload
    sudo systemctl start gunicorn
    sudo systemctl enable gunicorn
    sudo systemctl status gunicorn

第六步:配置 Nginx 反向X_X

Nginx 将作为入口服务器,接收外部请求并将其转发给 Gunicorn,同时负责处理静态文件和 SSL 证书。

  1. 安装 Nginx

    sudo apt install nginx -y
  2. 创建 Nginx 配置文件

    sudo nano /etc/nginx/sites-available/your_project_name
  3. 写入配置

    server {
        listen 80;
        server_name your_domain.com www.your_domain.com; # 替换为你的域名或 IP
    
        # 静态文件配置
        location /static/ {
            alias /var/www/your_project_name/staticfiles/;
        }
    
        # 媒体文件配置 (如果有 MEDIA_ROOT)
        location /media/ {
            alias /var/www/your_project_name/media/;
        }
    
        # 反向X_X到 Gunicorn
        location / {
            proxy_pass http://127.0.0.1:8000;
            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;
    
            # WebSocket 支持 (如果需要)
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    
        # 安全头
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-Content-Type-Options "nosniff";
    }
  4. 启用站点并测试配置

    # 创建软链接到 sites-enabled
    sudo ln -s /etc/nginx/sites-available/your_project_name /etc/nginx/sites-enabled/
    
    # 移除默认的 Nginx 配置(防止冲突)
    sudo rm /etc/nginx/sites-enabled/default
    
    # 测试配置语法
    sudo nginx -t
    # 如果显示 "syntax is ok" 和 "test is successful",则继续
    
    # 重启 Nginx
    sudo systemctl restart nginx

第七步:防火墙与安全 (UFW)

Ubuntu 默认安装了 UFW。我们需要开放 HTTP (80) 和 HTTPS (443) 端口。

sudo ufw allow 'Nginx Full'
sudo ufw allow 'OpenSSH'
sudo ufw enable

第八步:(可选但推荐) 配置 HTTPS (Let’s Encrypt)

为了安全性,强烈建议配置 SSL 证书。

  1. 安装 Certbot

    sudo apt install certbot python3-certbot-nginx -y
  2. 获取并配置证书

    sudo certbot --nginx -d your_domain.com -d www.your_domain.com

    Certbot 会自动修改 Nginx 配置并重定向 HTTP 到 HTTPS,并设置自动续期。


常见问题排查

  1. Permission Denied (权限问题)

    • 如果 Nginx 无法读取静态文件或 Gunicorn 无法写入日志,检查目录所有权。
    • 命令示例:sudo chown -R www-data:www-data /var/www/your_project_name
    • 确保 /var/www/your_project_name/staticfileswww-data 用户可读写。
  2. MySQL 连接错误

    • 确保 mysqlclient 版本与 Python 版本匹配。
    • 检查 settings.py 中的 HOST 是否为 localhost(本地部署)或正确的内网 IP。
    • 确认 MySQL 用户有远程访问权限(如果是跨服务器部署)。
  3. Gunicorn 进程未运行

    • 查看日志:sudo journalctl -u gunicorn -f
    • 检查是否有 Python 导入错误。

通过以上步骤,你的 Django 应用应该已经可以在 Ubuntu 22.04 上通过浏览器访问了。

未经允许不得转载:轻量云Cloud » ubuntu 22.04系统部署web服务器python + Django+mysql?