在 Ubuntu 22.04 上部署 Python + Django + MySQL 的 Web 服务器,通常采用 Nginx + Gunicorn (WSGI) + MySQL 的经典架构。这种组合稳定、高效且易于维护。
以下是完整的分步部署指南:
1. 系统更新与基础环境安装
首先更新软件包列表并安装必要的依赖(Python3, pip, MySQL 客户端库等)。
sudo apt update && sudo apt upgrade -y
# 安装 Python3, pip, git, 编译工具以及 MySQL 开发库
sudo apt install python3-pip python3-venv python3-dev libmysqlclient-dev nginx mysql-server mysql-client -y
注意:Ubuntu 22.04 默认已预装较新的 Python 版本,但为了安全起见,建议通过
apt安装python3-venv来创建虚拟环境。
2. 配置 MySQL 数据库
启动 MySQL 服务并初始化安全设置:
sudo systemctl start mysql
sudo systemctl enable mysql
sudo mysql_secure_installation
按照提示设置 root 密码,并删除匿名用户、禁止远程 root 登录等。
创建项目数据库和用户
登录 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 项目
使用虚拟环境隔离项目依赖,避免污染系统 Python。
# 创建项目目录
mkdir ~/myproject
cd ~/myproject
# 创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 升级 pip
pip install --upgrade pip
# 安装 Django 和 MySQL 驱动 (mysqlclient)
# 注意:如果安装 mysqlclient 报错,确保已安装 libmysqlclient-dev
pip install django mysqlclient gunicorn
生成 Django 项目
django-admin startproject myproject .
python manage.py migrate
python manage.py createsuperuser
配置 settings.py
编辑 myproject/settings.py,找到 DATABASES 部分进行修改:
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = 'your-secret-key-here' # 生产环境请使用随机生成的密钥
DEBUG = False # 生产环境必须为 False
ALLOWED_HOSTS = ['your_domain.com', 'localhost', '127.0.0.1'] # 替换为你的域名或 IP
# ... 其他配置 ...
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'",
},
}
}
收集静态文件(Django 生产环境必备):
python manage.py collectstatic
4. 配置 Gunicorn (应用服务器)
Gunicorn 负责将 Django 请求转发给 Nginx。我们需要创建一个 systemd 服务文件以便后台运行。
sudo nano /etc/systemd/system/gunicorn.service
填入以下内容(路径需根据实际调整):
[Unit]
Description=gunicorn daemon
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
myproject.wsgi:application
[Install]
WantedBy=multi-user.target
重要:请将
User=ubuntu替换为你当前的 Linux 用户名。
启动并启用服务:
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn
5. 配置 Nginx (反向X_X)
Nginx 作为前端 Web 服务器,处理静态文件并将动态请求转发给 Gunicorn。
创建站点配置
sudo nano /etc/nginx/sites-available/myproject
填入以下配置(注意修改域名和静态文件路径):
server {
listen 80;
server_name your_domain.com www.your_domain.com; # 替换为你的域名或 IP
location /static/ {
alias /home/ubuntu/myproject/staticfiles/; # 对应 collectstatic 后的目录
}
location /media/ {
alias /home/ubuntu/myproject/media/; # 如果有上传媒体文件
}
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";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
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 nginx -t
# 如果测试通过,重启 Nginx
sudo systemctl restart nginx
6. 防火墙与安全配置
Ubuntu 默认可能未开启防火墙,建议使用 ufw 管理。
# 允许 SSH, HTTP (80), HTTPS (443)
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
# 如果只使用 HTTP,也可以只允许 Nginx HTTP
# sudo ufw allow 'Nginx HTTP'
# 启用防火墙
sudo ufw enable
7. 验证部署
- 检查服务状态:
sudo systemctl status gunicorn sudo systemctl status nginx - 浏览器访问:
在浏览器中输入http://your_server_ip或http://your_domain.com。你应该能看到 Django 的欢迎页面或你自定义的首页。 - 测试数据库连接:
确保settings.py中的数据库配置正确,且能正常迁移数据。
8. 进阶:HTTPS (SSL 证书)
生产环境强烈建议使用 HTTPS。可以使用 Certbot 免费获取 Let’s Encrypt 证书。
# 安装 Certbot 插件
sudo apt install certbot python3-certbot-nginx
# 自动申请并配置证书
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
运行过程中按提示输入邮箱,Certbot 会自动修改 Nginx 配置并重载服务,同时强制跳转 HTTPS。
常见问题排查
- MySQL 连接失败:
- 检查
settings.py中的HOST是否为localhost。 - 确认 MySQL 用户是否有
localhost权限('myuser'@'localhost'),而不是'myuser'@'%'。 - 如果是 Docker 环境,
HOST应改为容器名称或宿主机 IP。
- 检查
- Permission Denied (权限错误):
- 确保
gunicorn运行的用户(通常是当前登录用户)对/home/ubuntu/myproject目录有读写权限。 - 命令:
sudo chown -R $USER:$USER /home/ubuntu/myproject
- 确保
- Gunicorn 无法启动:
- 查看日志:
sudo journalctl -u gunicorn -f - 检查虚拟环境是否激活,路径是否正确。
- 查看日志:
至此,你的 Ubuntu 22.04 Django + MySQL 生产环境已部署完成。
云服务器