在 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 方式申请域名证书)
常见问题排查
- 权限错误 (Permission Denied):
- 确保
gunicorn.service中的User和Group对项目目录有读写权限。 - 检查 Nginx 日志:
sudo tail -f /var/log/nginx/error.log。
- 确保
- MySQL 连接失败:
- 检查
settings.py中的密码是否正确。 - 确认
mysqlclient已正确安装 (pip show mysqlclient)。 - 确保 MySQL 服务正在运行 (
sudo systemctl status mysql)。
- 检查
- 静态文件不显示:
- 确保在
manage.py collectstatic收集了静态文件,并且 Nginx 的alias路径指向了正确的collectstatic输出目录。
- 确保在
至此,你的 Django + MySQL 生产环境已经搭建完成。
云知识CLOUD