在 Ubuntu 22.04 上部署 Python + Django + MySQL 的 Web 服务器,通常采用 Nginx + Gunicorn + Supervisor/Systemd 的经典架构。这种组合性能稳定、易于维护,且是生产环境的标准配置。
以下是完整的分步部署指南:
第一步:更新系统并安装基础依赖
首先更新软件包列表,安装必要的开发工具和编译库(用于编译 Python 扩展和数据库驱动)。
sudo apt update
sudo apt upgrade -y
sudo apt install python3-pip python3-venv python3-dev libmysqlclient-dev default-libmysqlclient-dev build-essential libssl-dev zlib1g-dev -y
注意:
libmysqlclient-dev是编译mysqlclient(Django 的官方 MySQL 后端) 所必需的 C 语言库。如果安装失败,可能需要先安装default-libmysqlclient-dev。
第二步:创建虚拟环境并安装项目依赖
建议为每个项目创建独立的 Python 虚拟环境,避免依赖冲突。
# 进入你的项目目录
cd /var/www/your_project_name
# 创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 升级 pip 并安装核心依赖
pip install --upgrade pip
pip install django gunicorn mysqlclient psycopg2-binary requests
# 如果你使用 Redis 缓存等,也可以在此处安装
第三步:配置 MySQL 数据库
Django 需要连接 MySQL 数据库。我们需要创建数据库用户和权限。
-
安装 MySQL Server (如果尚未安装):
sudo apt install mysql-server sudo mysql_secure_installation # 按提示设置 root 密码和安全选项 -
创建数据库和用户:
登录 MySQL 命令行:sudo mysql -u root -p执行以下 SQL 语句(请替换为你自己的数据库名、用户名和密码):
CREATE DATABASE your_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'your_user'@'localhost' IDENTIFIED BY 'your_strong_password'; GRANT ALL PRIVILEGES ON your_db_name.* TO 'your_user'@'localhost'; FLUSH PRIVILEGES; EXIT; -
配置 Django 设置:
编辑你的settings.py文件,找到DATABASES部分并修改:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'your_db_name', 'USER': 'your_user', 'PASSWORD': 'your_strong_password', 'HOST': 'localhost', 'PORT': '3306', 'OPTIONS': { 'charset': 'utf8mb4', }, } } -
迁移数据库:
python manage.py makemigrations python manage.py migrate python manage.py createsuperuser
第四步:收集静态文件与测试运行
在生产环境中,Django 不应直接提供静态文件(CSS/JS/图片),而是由 Nginx 处理。
-
收集静态文件:
mkdir staticfiles python manage.py collectstatic确保
STATIC_ROOT在 settings.py 中已正确配置指向该目录。 -
本地测试 Gunicorn:
在后台启动 Gunicorn 进行临时测试,确保没有报错:gunicorn your_project_name.wsgi:application --bind 127.0.0.1:8000如果看到
Started server process [PID],说明服务正常。按Ctrl+C停止。
第五步:配置 Systemd 服务
为了让 Gunicorn 开机自启并在崩溃时自动重启,我们创建一个 Systemd 服务单元文件。
-
创建服务文件:
sudo nano /etc/systemd/system/gunicorn.service -
写入以下内容(请根据实际路径修改
WorkingDirectory和User):[Unit] Description=gunicorn daemon for your_project_name After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/var/www/your_project_name ExecStart=/var/www/your_project_name/venv/bin/gunicorn --access-logfile - --workers 3 --worker-class gevent --bind 127.0.0.1:8000 your_project_name.wsgi:application [Install] WantedBy=multi-user.target注意:
User和Group建议使用www-data(Ubuntu 默认 web 用户),或者创建一个新的专用用户。--bind绑定到127.0.0.1:8000,这样 Nginx 可以通过反向X_X访问它,而不是让 Gunicorn 直接暴露公网端口。
-
启动服务:
sudo systemctl daemon-reload sudo systemctl start gunicorn sudo systemctl enable gunicorn sudo systemctl status gunicorn
第六步:配置 Nginx 反向X_X
Nginx 将作为入口服务器,接收外部请求并将其转发给 Gunicorn,同时负责处理静态文件和 SSL 证书。
-
安装 Nginx:
sudo apt install nginx -y -
创建 Nginx 配置文件:
sudo nano /etc/nginx/sites-available/your_project_name -
写入配置:
server { listen 80; server_name your_domain.com www.your_domain.com; # 替换为你的域名或 IP # 静态文件配置 location /static/ { alias /var/www/your_project_name/staticfiles/; } # 媒体文件配置 (如果有 MEDIA_ROOT) location /media/ { alias /var/www/your_project_name/media/; } # 反向X_X到 Gunicorn location / { proxy_pass http://127.0.0.1:8000; 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; # WebSocket 支持 (如果需要) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # 安全头 add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; } -
启用站点并测试配置:
# 创建软链接到 sites-enabled sudo ln -s /etc/nginx/sites-available/your_project_name /etc/nginx/sites-enabled/ # 移除默认的 Nginx 配置(防止冲突) sudo rm /etc/nginx/sites-enabled/default # 测试配置语法 sudo nginx -t # 如果显示 "syntax is ok" 和 "test is successful",则继续 # 重启 Nginx sudo systemctl restart nginx
第七步:防火墙与安全 (UFW)
Ubuntu 默认安装了 UFW。我们需要开放 HTTP (80) 和 HTTPS (443) 端口。
sudo ufw allow 'Nginx Full'
sudo ufw allow 'OpenSSH'
sudo ufw enable
第八步:(可选但推荐) 配置 HTTPS (Let’s Encrypt)
为了安全性,强烈建议配置 SSL 证书。
-
安装 Certbot:
sudo apt install certbot python3-certbot-nginx -y -
获取并配置证书:
sudo certbot --nginx -d your_domain.com -d www.your_domain.comCertbot 会自动修改 Nginx 配置并重定向 HTTP 到 HTTPS,并设置自动续期。
常见问题排查
-
Permission Denied (权限问题):
- 如果 Nginx 无法读取静态文件或 Gunicorn 无法写入日志,检查目录所有权。
- 命令示例:
sudo chown -R www-data:www-data /var/www/your_project_name - 确保
/var/www/your_project_name/staticfiles对www-data用户可读写。
-
MySQL 连接错误:
- 确保
mysqlclient版本与 Python 版本匹配。 - 检查
settings.py中的HOST是否为localhost(本地部署)或正确的内网 IP。 - 确认 MySQL 用户有远程访问权限(如果是跨服务器部署)。
- 确保
-
Gunicorn 进程未运行:
- 查看日志:
sudo journalctl -u gunicorn -f - 检查是否有 Python 导入错误。
- 查看日志:
通过以上步骤,你的 Django 应用应该已经可以在 Ubuntu 22.04 上通过浏览器访问了。
轻量云Cloud