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

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

以下是完整的分步指南:

1. 系统更新与基础环境安装

首先更新软件源并安装必要的工具包(Python3, pip, 构建工具等)。

sudo apt update && sudo apt upgrade -y

# 安装 Python3, pip, git, build-essential (编译依赖), libmysqlclient-dev (MySQL 客户端开发库)
sudo apt install python3-pip python3-venv git build-essential libmysqlclient-dev nginx -y

注意:libmysqlclient-dev 是连接 MySQL 的关键依赖,如果缺少会导致安装 mysqlclient 或 pymysql 时出错。


2. 安装并配置 MySQL 数据库

Ubuntu 22.04 默认使用 MariaDB,但为了严格兼容 MySQL 协议,我们直接安装 MySQL Server。

# 安装 MySQL Server
sudo apt install mysql-server -y

# 运行安全初始化脚本(设置 root 密码,移除匿名用户等)
sudo mysql_secure_installation

按提示操作:输入新密码,回答 "Y" 以启用安全选项。

创建 Django 专用数据库和用户

登录 MySQL 控制台进行配置:

sudo mysql -u root -p

在 SQL 命令行中执行以下操作(请替换为你的实际数据库名、用户名和密码):

-- 创建数据库
CREATE DATABASE myproject_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建用户并授权
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON myproject_db.* TO 'myuser'@'localhost';
FLUSH PRIVILEGES;

-- 退出
EXIT;

3. 创建 Django 项目

建议使用虚拟环境隔离依赖。

# 创建项目目录
mkdir ~/myproject
cd ~/myproject

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

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

# 安装依赖 (Django, Gunicorn, MySQL 驱动)
pip install django gunicorn mysqlclient

初始化项目

django-admin startproject config .

(注意最后的点 . 表示在当前目录生成 manage.py)

修改配置文件 (config/settings.py)

打开 config/settings.py,找到 DATABASES 部分进行修改:

# config/settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject_db',      # 上面创建的数据库名
        'USER': 'myuser',           # 上面创建的用户
        'PASSWORD': 'StrongPassword123!', # 上面设置的密码
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'charset': 'utf8mb4',
        },
    }
}

同时,确保 INSTALLED_APPS 中包含 'django.contrib.admin' 等必要组件,并添加 'rest_framework' 或其他你需要的 app。

迁移数据库并创建超级用户

# 执行数据库迁移
python manage.py migrate

# 创建管理员账号
python manage.py createsuperuser

本地测试运行

# 启动开发服务器 (仅用于测试,生产环境不用这个)
python manage.py runserver 0.0.0.0:8000

此时可以通过浏览器访问 http://你的IP:8000/admin 确认 Django 和 MySQL 连接成功。


4. 配置 Gunicorn (WSGI 服务器)

Gunicorn 负责将 Django 应用暴露给 Nginx。

创建 Gunicorn 配置文件

在项目目录下创建 gunicorn.conf.py:

# gunicorn.conf.py
bind = "127.0.0.1:8000"  # 监听本地端口,不直接对外暴露
workers = 4              # 工作进程数,根据 CPU 核心数调整
worker_class = 'sync'    # 同步模型,简单稳定
timeout = 120            # 超时时间
proc_name = "myproject_gunicorn"
pidfile = "/var/run/gunicorn.pid"
accesslog = "/var/log/gunicorn/access.log"
errorlog = "/var/log/gunicorn/error.log"

测试 Gunicorn

gunicorn --config gunicorn.conf.py config.wsgi:application

如果无报错,按 Ctrl+C 停止。说明配置正确。


5. 配置 Systemd 服务 (开机自启)

为了让服务在后台运行并随系统启动,我们需要创建一个 systemd 服务文件。

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

写入以下内容(注意路径需根据你的实际情况修改):

[Unit]
Description=MyProject Gunicorn daemon
After=network.target

[Service]
User=ubuntu          # 当前登录的用户名,如果是 root 则写 root
Group=www-data       # 或者写 ubuntu,确保有权限读写日志
WorkingDirectory=/home/ubuntu/myproject
ExecStart=/home/ubuntu/myproject/venv/bin/gunicorn 
          --config /home/ubuntu/myproject/gunicorn.conf.py 
          config.wsgi:application
Restart=on-failure

[Install]
WantedBy=multi-user.target

保存后启动服务:

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

6. 配置 Nginx (反向X_X)

Nginx 作为 Web 服务器,接收用户请求并转发给 Gunicorn。

创建站点配置

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

写入以下内容(替换 your_domain.com 为域名或 IP):

server {
    listen 80;
    server_name your_domain.com or_public_ip;

    location = /favicon.ico { access_log off; log_not_found off; }

    # 静态文件处理 (可选,如果你需要 serve static files)
    location /static/ {
        alias /home/ubuntu/myproject/static/; 
    }

    location /media/ {
        alias /home/ubuntu/myproject/media/;
    }

    # 动态内容转发给 Gunicorn
    location / {
        include proxy_params;
        proxy_pass http://127.0.0.1:8000;

        # 关键:传递真实 IP
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

启用站点并重启 Nginx

# 创建软链接
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/

# 删除默认配置(防止冲突)
sudo rm /etc/nginx/sites-enabled/default

# 测试 Nginx 配置
sudo nginx -t

# 如果测试通过,重载 Nginx
sudo systemctl restart nginx

7. 防火墙与安全设置

Ubuntu 默认可能开启了 UFW 防火墙。

# 允许 SSH (22), HTTP (80)
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

8. 验证部署

  1. 检查状态:
    sudo systemctl status myproject
    sudo systemctl status nginx
  2. 浏览器访问:
    在浏览器中输入 http://你的服务器IP 或 http://你的域名。

    • 应该能看到 Django 的欢迎页面或登录页。
    • 如果看到 "Permission denied" 或 "Database connection failed",请检查:
      • settings.py 中的数据库密码是否正确。
      • Nginx 日志 /var/log/nginx/error.log。
      • Gunicorn 日志 /var/log/gunicorn/error.log。
      • 确保 MySQL 用户允许了远程连接(如果是跨服务器访问),或者检查 hosts 权限。

常见问题排查 Tips

  • MySQL 连接错误:最常见的是 libmysqlclient-dev 未安装,或者 settings.py 中密码有空格。
  • Static Files 无法加载:记得运行 python manage.py collectstatic 收集静态文件,并确保 Nginx 配置中的 alias 路径指向了正确的目录。
  • 权限问题:如果 Nginx 无法读取 Django 目录,可能需要 sudo chown -R www-data:www-data /home/ubuntu/myproject。

至此,你的 Django + MySQL 生产环境已部署完成!

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