在 Ubuntu 22.04 上部署 Python + Django + MySQL 的 Web 服务器,通常采用 Nginx (反向X_X) + Gunicorn (应用服务器) + MySQL (数据库) 的经典架构。
以下是完整的分步指南:
第一阶段:系统更新与基础环境安装
首先更新软件源并安装必要的依赖工具(如 Git, Build tools)。
sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip python3-venv git build-essential libmysqlclient-dev -y
注意:
libmysqlclient-dev是编译 MySQL 驱动所需的开发库。如果后续遇到pip install mysqlclient报错,请确保此包已安装。
第二阶段:创建虚拟环境与项目结构
为了保持环境整洁,建议使用 Python 虚拟环境。
-
创建项目目录
mkdir ~/myproject cd ~/myproject -
初始化虚拟环境
python3 -m venv venv source venv/bin/activate激活后,命令行提示符前会出现
(venv)字样。 -
安装 Django 和数据库驱动
pip install django mysqlclient gunicornMySQL 驱动说明:Django 推荐使用
mysqlclient(C扩展,性能好) 而不是PyMySQL。如果遇到编译错误,可能需要先安装default-libmysqlclient-dev(Ubuntu 22.04 中通常包含)。 -
启动 Django 项目
django-admin startproject mysite . # 注意最后的点 "." 表示在当前目录创建 settings.py 等文件
第三阶段:配置 MySQL 数据库
我们需要创建一个专门的数据库用户供 Django 使用。
-
登录 MySQL
sudo mysql -u root -p -
创建数据库和用户
在 MySQL 提示符下执行以下 SQL(请替换密码):CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'StrongPassword123!'; GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost'; FLUSH PRIVILEGES; EXIT; -
修改 Django 配置 (
mysite/settings.py)
打开配置文件:nano mysite/settings.py找到
DATABASES部分,将其修改为:import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydb', # 上面创建的数据库名 'USER': 'myuser', # 上面创建的用户 'PASSWORD': 'StrongPassword123!', # 上面的密码 'HOST': 'localhost', # 本地部署 'PORT': '3306', 'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", }, } }保存并退出 (Ctrl+O, Enter, Ctrl+X)。
-
运行迁移
python manage.py makemigrations python manage.py migrate python manage.py createsuperuser # 可选:创建管理员账号 -
测试本地运行
python manage.py runserver 0.0.0.0:8000在浏览器访问
http://你的IP:8000确认页面能正常显示且无数据库连接错误。按Ctrl+C停止服务。
第四阶段:配置 Gunicorn (WSGI 服务器)
Gunicorn 用于将 Django 应用托管到生产环境,比自带的 runserver 更稳定、更快。
-
创建 systemd 服务文件
sudo nano /etc/systemd/system/gunicorn.service粘贴以下内容(根据实际路径调整):
[Unit] Description=gunicorn daemon for mysite 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 mysite.wsgi:application [Install] WantedBy=multi-user.target关键点:
User建议设置为当前登录用户(如 ubuntu),避免权限问题。WorkingDirectory指向项目根目录。ExecStart中的mysite.wsgi:application对应你项目文件夹下的wsgi.py文件中的 application 对象。
-
启动并设置开机自启
sudo systemctl daemon-reload sudo systemctl start gunicorn sudo systemctl enable gunicorn sudo systemctl status gunicorn
第五阶段:配置 Nginx (反向X_X)
Nginx 负责接收用户请求,并将其转发给 Gunicorn。
-
安装 Nginx
sudo apt install nginx -y -
配置 Nginx 站点
sudo nano /etc/nginx/sites-available/mysite粘贴以下配置:
server { listen 80; server_name your_domain_or_IP; # 替换为你的域名或 IP location /static/ { alias /home/ubuntu/myproject/staticfiles/; # 静态文件路径 } location / { include proxy_params; proxy_pass http://unix:/home/ubuntu/myproject/gunicorn.sock; } } -
收集静态文件
在生产环境中,Django 需要将所有静态文件(CSS/JS/Images)收集到一个目录中:# 确保 settings.py 中 STATIC_ROOT 已设置 # 例如:STATIC_ROOT = '/home/ubuntu/myproject/staticfiles/' python manage.py collectstatic -
启用站点并重启 Nginx
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/ sudo nginx -t # 检查配置语法 sudo systemctl restart nginx
第六阶段:防火墙与安全 (UFW)
Ubuntu 默认开启 UFW 防火墙。
-
允许 SSH (防止被锁在外面)
sudo ufw allow OpenSSH -
允许 HTTP (Nginx)
sudo ufw allow 'Nginx Full' -
启用防火墙
sudo ufw enable
验证与常见问题排查
-
访问网站
在浏览器输入http://你的服务器IP。你应该看到 Django 的欢迎页面或你的主页。 -
常见错误处理
- Permission denied on socket: 检查
gunicorn.service中的User和Group是否与 Nginx 配置一致,或者确保/home/ubuntu/myproject/gunicorn.sock的权限允许 Nginx 读取。 - Database connection refused: 检查
settings.py中的密码、用户名是否正确,以及 MySQL 是否正在运行 (sudo systemctl status mysql)。 - Static files not showing: 检查
collectstatic是否成功运行,以及alias路径是否正确。
- Permission denied on socket: 检查
-
日志查看
- Gunicorn 日志:
journalctl -u gunicorn -f - Nginx 错误日志:
sudo tail -f /var/log/nginx/error.log
- Gunicorn 日志:
至此,你的 Django + MySQL 生产环境已经部署完成。如果需要 HTTPS,可以结合 Let’s Encrypt (Certbot) 进行 SSL 证书配置。
云计算HECS