在 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. 验证部署
- 检查状态:
sudo systemctl status myproject sudo systemctl status nginx - 浏览器访问:
在浏览器中输入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云枢