在 Ubuntu 22.04 上使用宝塔面板(BT Panel)部署 Django 项目,需要结合 Python 虚拟环境、Gunicorn/Nginx 反向X_X以及数据库配置。以下是完整步骤:
✅ 前提条件
- 已安装宝塔面板(推荐安装 宝塔 Linux 面板,非宝塔的“宝塔云”或旧版)
- 系统为 Ubuntu 22.04 LTS
- 已创建网站目录并配置好域名(可选)
- 已安装 Python 3.10+(宝塔默认支持)
📌 第一步:安装必要依赖
通过宝塔面板的 「软件商店」 安装以下组件:
| 组件 | 说明 |
|---|---|
| Python | 选择 Python 3.10 或更高版本(宝塔会自动管理多版本) |
| Nginx | 用于反向X_X和静态文件服务 |
| MySQL / MariaDB | 或 PostgreSQL(根据项目需求) |
| Redis(可选) | 若项目需缓存/任务队列 |
| Supervisor(可选) | 进程守护(但 Django + Gunicorn 通常由 Nginx 直接调用即可) |
💡 建议:在宝塔中进入「网站」→「设置」→「PHP版本」确保未启用 PHP-FPM 干扰;Django 应使用独立 Python 环境。
📌 第二步:创建 Python 虚拟环境 & 安装依赖
- 登录宝塔 → 「文件」 → 进入你的项目目录(如
/www/wwwroot/mydjango) - 打开终端(可通过宝塔「终端」功能),执行:
cd /www/wwwroot/mydjango
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install django gunicorn psycopg2-binary redis # 根据实际依赖调整
🔔 注意:
- 若用 MySQL,建议安装
mysqlclient而非pymysql(性能更好);若用 PostgreSQL,则用psycopg2-binary- 将
requirements.txt上传后运行:pip install -r requirements.txt
- 配置
settings.py:- 设置
DEBUG = False - 配置
ALLOWED_HOSTS = ['your-domain.com', 'localhost'] - 设置正确的数据库连接(
DATABASES) - 配置
STATIC_ROOT和MEDIA_ROOT
- 设置
示例(settings.py 片段):
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'change-me-in-prod')
DEBUG = False
ALLOWED_HOSTS = ['your-domain.com', '127.0.0.1', '[::1]']
# 静态/媒体文件
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
# 数据库(以 PostgreSQL 为例)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydb',
'USER': 'myuser',
'PASSWORD': os.environ.get('DB_PASSWORD'),
'HOST': 'localhost',
'PORT': '5432',
}
}
✅ 建议将敏感信息(如
SECRET_KEY, DB 密码)放入.env文件,并用python-decouple或django-environ读取。
📌 第三步:收集静态文件 & 迁移数据库
python manage.py collectstatic --noinput
python manage.py migrate
python manage.py createsuperuser # 可选
⚠️ 确保
collectstatic成功生成staticfiles/目录(路径与STATIC_ROOT一致)
📌 第四步:在宝塔中添加站点 & 配置 Nginx
1. 添加网站
- 宝塔 → 「网站」 → 「添加站点」
- 输入域名(或 IP),根目录设为
/www/wwwroot/mydjango - 数据库类型选 MySQL/PostgreSQL,创建对应数据库和用户
2. 配置 Nginx 反向X_X(关键!)
点击该站点 → 「设置」 → 「配置文件」,替换为以下内容(示例):
server {
listen 80;
server_name your-domain.com;
root /www/wwwroot/mydjango;
index index.html index.htm;
# 静态文件(由 Nginx 直接提供,提速)
location /static/ {
alias /www/wwwroot/mydjango/staticfiles/;
expires 30d;
add_header Cache-Control "public, immutable";
}
location /media/ {
alias /www/wwwroot/mydjango/media/;
expires 7d;
}
# 所有其他请求转发给 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";
add_header X-XSS-Protection "1; mode=block";
}
✅ 保存后点击 「重载配置」
📌 第五步:启动 Gunicorn(作为后台服务)
方法一:使用宝塔「计划任务」+ Shell 脚本(推荐新手)
-
宝塔 → 「计划任务」 → 添加任务
- 类型:Shell 脚本
- 执行周期:
@reboot(开机自启) - 执行内容:
cd /www/wwwroot/mydjango source venv/bin/activate nohup gunicorn myproject.wsgi:application --bind 127.0.0.1:8000 --workers 3 --timeout 120 --access-logfile /www/wwwlogs/gunicorn_access.log --error-logfile /www/wwwlogs/gunicorn_error.log > /dev/null 2>&1 & echo $! > /tmp/gunicorn.pid替换
myproject为你的主应用名(含wsgi.py的目录)
-
手动测试启动:
source venv/bin/activate gunicorn myproject.wsgi:application --bind 127.0.0.1:8000访问
http://your-ip:8000应返回页面(若无 Nginx X_X时)
方法二:使用 Systemd(更规范,适合生产)
创建服务文件:
sudo nano /etc/systemd/system/django-gunicorn.service
内容:
[Unit]
Description=Gunicorn instance to serve mydjango
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/www/wwwroot/mydjango
Environment="PATH=/www/wwwroot/mydjango/venv/bin"
ExecStart=/www/wwwroot/mydjango/venv/bin/gunicorn
--workers 3
--bind unix:/run/gunicorn.sock
myproject.wsgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.target
🔁 修改
myproject为你实际的 WSGI 模块名
🔧 若用 socket 通信,Nginx 中改为proxy_pass http://unix:/run/gunicorn.sock;
启用服务:
sudo systemctl daemon-reload
sudo systemctl enable django-gunicorn
sudo systemctl start django-gunicorn
sudo systemctl status django-gunicorn
✅ 验证:
curl http://127.0.0.1:8000 # 或直接访问域名
📌 第六步:HTTPS 加密(强烈推荐)
- 宝塔 → 「网站」 → 你的站点 → 「SSL」
- 申请 Let’s Encrypt 免费证书(自动签发)
- 勾选「强制 HTTPS」
- 重启 Nginx
✅ 完成后访问
https://your-domain.com即生效
🔍 常见问题排查
| 问题 | 解决方案 |
|---|---|
Permission denied |
检查目录权限:chown -R www-data:www-data /www/wwwroot/mydjango |
ModuleNotFoundError |
确认 source venv/bin/activate 且 which python 指向 venv |
| 数据库连接失败 | 检查 settings.py 中 HOST 是否为 localhost;防火墙是否放行端口 |
| 404 on static files | 确认 collectstatic 成功,且 Nginx alias 路径正确 |
| Gunicorn 启动后立即退出 | 查看日志:cat /www/wwwlogs/gunicorn_error.log |
✅ 最终验证清单
- [ ] 域名可正常访问(HTTP → HTTPS 重定向)
- [ ] 静态资源加载正常(浏览器 Network 面板查
/static/) - [ ] 表单提交、登录等功能正常
- [ ] 错误页面友好(自定义 404/500)
- [ ] 日志轮转正常(宝塔自动管理
/www/logs/)
需要我为你提供:
- 一个完整的
gunicorn.conf.py模板? - Docker 化部署方案(兼容宝塔)?
- CI/CD 自动化部署脚本(Git + SSH + 自动重启)?
欢迎告诉我你的具体场景,我可以进一步定制优化!
CLOUD技术博