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

在 Ubuntu 22.04 上部署 Python + Django + MySQL 的 Web 服务器,通常采用 Nginx (反向X_X) + Gunicorn (应用服务器) + MySQL (数据库) 的经典架构。

以下是完整的分步指南:


第一阶段:系统更新与基础环境安装

首先更新软件源并安装必要的依赖工具(如 Git, Build tools)。

sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip python3-venv git build-essential libmysqlclient-dev -y

注意libmysqlclient-dev 是编译 MySQL 驱动所需的开发库。如果后续遇到 pip install mysqlclient 报错,请确保此包已安装。


第二阶段:创建虚拟环境与项目结构

为了保持环境整洁,建议使用 Python 虚拟环境。

  1. 创建项目目录

    mkdir ~/myproject
    cd ~/myproject
  2. 初始化虚拟环境

    python3 -m venv venv
    source venv/bin/activate

    激活后,命令行提示符前会出现 (venv) 字样。

  3. 安装 Django 和数据库驱动

    pip install django mysqlclient gunicorn

    MySQL 驱动说明:Django 推荐使用 mysqlclient (C扩展,性能好) 而不是 PyMySQL。如果遇到编译错误,可能需要先安装 default-libmysqlclient-dev (Ubuntu 22.04 中通常包含)。

  4. 启动 Django 项目

    django-admin startproject mysite .
    # 注意最后的点 "." 表示在当前目录创建 settings.py 等文件

第三阶段:配置 MySQL 数据库

我们需要创建一个专门的数据库用户供 Django 使用。

  1. 登录 MySQL

    sudo mysql -u root -p
  2. 创建数据库和用户
    在 MySQL 提示符下执行以下 SQL(请替换密码):

    CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
    GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';
    FLUSH PRIVILEGES;
    EXIT;
  3. 修改 Django 配置 (mysite/settings.py)
    打开配置文件:

    nano mysite/settings.py

    找到 DATABASES 部分,将其修改为:

    import os
    
    DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.mysql',
           'NAME': 'mydb',               # 上面创建的数据库名
           'USER': 'myuser',             # 上面创建的用户
           'PASSWORD': 'StrongPassword123!', # 上面的密码
           'HOST': 'localhost',          # 本地部署
           'PORT': '3306',
           'OPTIONS': {
               'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
           },
       }
    }

    保存并退出 (Ctrl+O, Enter, Ctrl+X)。

  4. 运行迁移

    python manage.py makemigrations
    python manage.py migrate
    python manage.py createsuperuser  # 可选:创建管理员账号
  5. 测试本地运行

    python manage.py runserver 0.0.0.0:8000

    在浏览器访问 http://你的IP:8000 确认页面能正常显示且无数据库连接错误。按 Ctrl+C 停止服务。


第四阶段:配置 Gunicorn (WSGI 服务器)

Gunicorn 用于将 Django 应用托管到生产环境,比自带的 runserver 更稳定、更快。

  1. 创建 systemd 服务文件

    sudo nano /etc/systemd/system/gunicorn.service

    粘贴以下内容(根据实际路径调整):

    [Unit]
    Description=gunicorn daemon for mysite
    After=network.target
    
    [Service]
    User=ubuntu
    Group=www-data
    WorkingDirectory=/home/ubuntu/myproject
    Environment="PATH=/home/ubuntu/myproject/venv/bin"
    ExecStart=/home/ubuntu/myproject/venv/bin/gunicorn 
             --access-logfile - 
             --workers 3 
             --bind unix:/home/ubuntu/myproject/gunicorn.sock 
             mysite.wsgi:application
    
    [Install]
    WantedBy=multi-user.target

    关键点

    • User 建议设置为当前登录用户(如 ubuntu),避免权限问题。
    • WorkingDirectory 指向项目根目录。
    • ExecStart 中的 mysite.wsgi:application 对应你项目文件夹下的 wsgi.py 文件中的 application 对象。
  2. 启动并设置开机自启

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

第五阶段:配置 Nginx (反向X_X)

Nginx 负责接收用户请求,并将其转发给 Gunicorn。

  1. 安装 Nginx

    sudo apt install nginx -y
  2. 配置 Nginx 站点

    sudo nano /etc/nginx/sites-available/mysite

    粘贴以下配置:

    server {
       listen 80;
       server_name your_domain_or_IP; # 替换为你的域名或 IP
    
       location /static/ {
           alias /home/ubuntu/myproject/staticfiles/; # 静态文件路径
       }
    
       location / {
           include proxy_params;
           proxy_pass http://unix:/home/ubuntu/myproject/gunicorn.sock;
       }
    }
  3. 收集静态文件
    在生产环境中,Django 需要将所有静态文件(CSS/JS/Images)收集到一个目录中:

    # 确保 settings.py 中 STATIC_ROOT 已设置
    # 例如:STATIC_ROOT = '/home/ubuntu/myproject/staticfiles/'
    
    python manage.py collectstatic
  4. 启用站点并重启 Nginx

    sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
    sudo nginx -t  # 检查配置语法
    sudo systemctl restart nginx

第六阶段:防火墙与安全 (UFW)

Ubuntu 默认开启 UFW 防火墙。

  1. 允许 SSH (防止被锁在外面)

    sudo ufw allow OpenSSH
  2. 允许 HTTP (Nginx)

    sudo ufw allow 'Nginx Full'
  3. 启用防火墙

    sudo ufw enable

验证与常见问题排查

  1. 访问网站
    在浏览器输入 http://你的服务器IP。你应该看到 Django 的欢迎页面或你的主页。

  2. 常见错误处理

    • Permission denied on socket: 检查 gunicorn.service 中的 UserGroup 是否与 Nginx 配置一致,或者确保 /home/ubuntu/myproject/gunicorn.sock 的权限允许 Nginx 读取。
    • Database connection refused: 检查 settings.py 中的密码、用户名是否正确,以及 MySQL 是否正在运行 (sudo systemctl status mysql)。
    • Static files not showing: 检查 collectstatic 是否成功运行,以及 alias 路径是否正确。
  3. 日志查看

    • Gunicorn 日志:journalctl -u gunicorn -f
    • Nginx 错误日志:sudo tail -f /var/log/nginx/error.log

至此,你的 Django + MySQL 生产环境已经部署完成。如果需要 HTTPS,可以结合 Let’s Encrypt (Certbot) 进行 SSL 证书配置。

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