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

在 Ubuntu 22.04 上部署 Python + Django + MySQL 的 Web 服务器,最标准且生产环境的方案是使用 Gunicorn(WSGI 应用服务器)配合 Nginx(反向X_X),并使用 MySQL 作为数据库。

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

1. 系统更新与基础依赖安装

首先更新软件源并安装必要的工具包(包括 Python3、pip、编译工具和 MySQL 客户端)。

sudo apt update
sudo apt upgrade -y

# 安装 Python, pip, git, build-essential (用于编译 mysqlclient)
sudo apt install python3 python3-pip python3-venv git build-essential libmysqlclient-dev -y

# 安装 Nginx 和 Gunicorn
sudo apt install nginx gunicorn -y

2. 创建 Django 项目

建议创建一个独立的虚拟环境以隔离依赖。

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

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

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

# 安装 Django 和 MySQL 驱动 (mysqlclient 需要编译,所以先装好上面的 libmysqlclient-dev)
pip install django mysqlclient gunicorn

初始化项目(假设项目名为 mysite):

django-admin startproject mysite .
python manage.py migrate

3. 配置 MySQL 数据库

Ubuntu 22.04 默认不预装 MySQL 服务端,我们需要安装它并创建数据库。

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

# 启动 MySQL 并运行安全脚本(设置 root 密码等)
sudo mysql_secure_installation

进入 MySQL 命令行创建数据库和用户:

sudo mysql -u root -p

在 MySQL 提示符下执行以下 SQL(请替换为你自己的密码):

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

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

-- 退出
EXIT;

4. 配置 Django 连接 MySQL

编辑 mysite/settings.py 文件,修改数据库配置部分:

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': 'your_strong_password',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'charset': 'utf8mb4',
        },
    }
}

注意:确保 ALLOWED_HOSTS 包含你的域名或 IP 地址。

# settings.py
ALLOWED_HOSTS = ['your_domain_or_ip', '127.0.0.1']

最后运行迁移命令同步数据库结构:

python manage.py migrate
# 如果需要测试登录,可以创建一个超级用户
python manage.py createsuperuser

5. 配置 Gunicorn (WSGI 服务)

Gunicorn 负责将 Django 请求转换为 WSGI 格式并传递给 Nginx。

创建一个 systemd 服务文件,以便开机自启和管理进程:

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

写入以下内容(注意路径需根据你的实际路径调整):

[Unit]
Description=gunicorn daemon for mysite
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/home/ubuntu/myproject
Environment="PATH=/home/ubuntu/myproject/venv/bin"
ExecStart=/home/ubuntu/myproject/venv/bin/gunicorn 
          --workers 3 
          --bind unix:/home/ubuntu/myproject/gunicorn.sock 
          mysite.wsgi:application

[Install]
WantedBy=multi-user.target

启用并启动服务:

sudo systemctl enable gunicorn
sudo systemctl start gunicorn
sudo systemctl status gunicorn

6. 配置 Nginx (反向X_X)

Nginx 将静态文件和动态请求转发给 Gunicorn。

创建 Nginx 配置文件:

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

写入以下内容:

server {
    listen 80;
    server_name your_domain_or_ip; # 替换为你的域名或 IP

    # 静态文件处理 (可选,如果 Django 有 static 需求)
    location /static/ {
        alias /home/ubuntu/myproject/static/;
    }

    # 动态请求转发给 Gunicorn
    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/myproject/gunicorn.sock;

        # 解决 WebSocket 或长连接问题 (可选)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

启用站点并重启 Nginx:

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

# 测试 Nginx 配置
sudo nginx -t

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

7. 防火墙与安全组配置

Ubuntu 22.04 默认使用 UFW 防火墙。需要放行 HTTP 端口。

# 允许 Nginx HTTP
sudo ufw allow 'Nginx Full'

# 或者只允许 80 和 443 (如果你后续配置了 SSL)
# sudo ufw allow 80/tcp
# sudo ufw allow 443/tcp

# 启用防火墙
sudo ufw enable

8. 验证部署

在浏览器访问 http://your_domain_or_ip

  • 如果看到 Django 的欢迎页面,说明部署成功。
  • 尝试访问 /admin 页面,使用刚才创建的超级用户登录。

9. (进阶) 配置 HTTPS (SSL)

生产环境强烈建议使用 HTTPS。可以使用 Let’s Encrypt 免费证书。

# 安装 Certbot
sudo apt install certbot python3-certbot-nginx -y

# 获取并自动配置证书
sudo certbot --nginx -d your_domain_or_ip

(如果是纯 IP 访问,Certbot 可能无法颁发证书,此时通常需要使用 DNS 方式申请域名证书)


常见问题排查

  1. 权限错误 (Permission Denied)
    • 确保 gunicorn.service 中的 UserGroup 对项目目录有读写权限。
    • 检查 Nginx 日志:sudo tail -f /var/log/nginx/error.log
  2. MySQL 连接失败
    • 检查 settings.py 中的密码是否正确。
    • 确认 mysqlclient 已正确安装 (pip show mysqlclient)。
    • 确保 MySQL 服务正在运行 (sudo systemctl status mysql)。
  3. 静态文件不显示
    • 确保在 manage.py collectstatic 收集了静态文件,并且 Nginx 的 alias 路径指向了正确的 collectstatic 输出目录。

至此,你的 Django + MySQL 生产环境已经搭建完成。

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