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 的关键依赖,如果缺少会导致安装 mysqlclientpymysql 时出错。


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://你的服务器IPhttp://你的域名

    • 应该能看到 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?