在 Ubuntu 22.04 上使用宝塔面板(BT Panel)部署 Django 项目,虽然宝塔原生支持 PHP/Python 的简单配置,但 Django 作为全栈框架,通常需要更精细的环境配置(如 Gunicorn、Nginx 反向X_X、静态文件处理等)。
以下是基于宝塔面板(推荐安装 宝塔专业版 或 社区版 的 Python 管理功能)部署 Django 项目的完整步骤。
前置准备
- 服务器环境:Ubuntu 22.04 LTS。
- 宝塔面板:已安装并运行正常。
- Django 项目代码:已上传至服务器(建议通过 Git 拉取或上传压缩包解压)。
- 数据库:建议在宝塔“网站” -> “数据库”中创建一个 MySQL 或 PostgreSQL 数据库。
第一步:创建 Python 站点
宝塔对 Python 的支持主要通过“网站”功能中的 Python 选项实现。
- 登录宝塔面板,进入左侧菜单 【网站】。
- 点击 【添加站点】。
- 填写域名(如果无域名可填 IP),选择 【Python】 类型。
- 版本选择:建议选择
3.9或3.10(需与你的 Django 项目兼容版本一致)。 - 根目录:系统会自动生成一个文件夹,后续我们将把项目代码放入此目录。
- 版本选择:建议选择
- 点击 【提交】。
注意:此时宝塔会初始化一个基础的 Python 环境。如果你需要特定的 Python 版本,可以在【软件商店】搜索 "Python" 进行多版本管理,或者在后续步骤中手动指定。
第二步:配置项目环境与依赖
假设你创建的网站根目录为 /www/wwwroot/your_domain.com。
1. 上传项目代码
将你的 Django 项目源码上传到该目录。确保目录结构如下:
/www/wwwroot/your_domain.com/
├── manage.py
├── your_project_name/ (包含 settings.py, wsgi.py 等)
├── static/ (静态文件目录)
└── media/ (用户上传文件目录,可选)
2. 激活虚拟环境 (Virtualenv)
Django 强烈建议使用虚拟环境来隔离依赖。
- 在宝塔面板左侧菜单点击 【终端】(或 SSH 连接服务器)。
- 进入项目目录:
cd /www/wwwroot/your_domain.com - 创建虚拟环境(以 Python 3.10 为例,请根据实际安装的版本调整):
python3.10 -m venv venv - 激活虚拟环境:
source venv/bin/activate - 安装依赖包:
pip install -r requirements.txt如果没有
requirements.txt,则手动安装:pip install django gunicorn psycopg2-binary等。
3. 修改 Django 配置 (settings.py)
打开项目目录下的 your_project_name/settings.py,进行以下关键修改:
- ALLOWED_HOSTS: 允许访问的域名/IP。
ALLOWED_HOSTS = ['your_domain.com', '127.0.0.1', 'localhost'] -
STATIC_ROOT: 收集静态文件的目录路径(必须是绝对路径)。
import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # 建议新建一个目录专门存放收集后的静态文件 # 确保静态文件路径正确 STATIC_URL = '/static/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/' - DEBUG: 生产环境必须关闭。
DEBUG = False - DATABASES: 连接到你在宝塔创建的数据库。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 或 postgresql 'NAME': '你的数据库名', 'USER': '你的数据库用户', 'PASSWORD': '你的数据库密码', 'HOST': 'localhost', 'PORT': '3306', } }
第三步:迁移数据与收集静态文件
在终端中执行以下命令:
- 数据库迁移:
python manage.py migrate - 创建超级管理员:
python manage.py createsuperuser - 收集静态文件(这一步至关重要,否则 Nginx 无法提供 CSS/JS):
python manage.py collectstatic --noinput此时,
staticfiles目录下会生成所有合并后的静态文件。
第四步:配置 Nginx 反向X_X与 Gunicorn
Django 本身不建议直接对外服务,通常使用 Gunicorn 作为应用服务器,Nginx 作为反向X_X。
1. 启动 Gunicorn
你需要编写一个启动脚本或直接在终端测试。
# 假设项目名为 myproject
gunicorn --bind 127.0.0.1:8000 --chdir=/www/wwwroot/your_domain.com myproject.wsgi:application
注意:请将 myproject 替换为你实际的 wsgi.py 所在目录名。
2. 宝塔面板配置 Nginx
- 回到宝塔面板,进入 【网站】 -> 点击你的站点 -> 【配置文件】。
- 找到
location /部分,将其替换为标准的 Django + Gunicorn 配置模板。
参考配置代码如下:
server {
listen 80;
server_name your_domain.com; # 替换为你的域名
root /www/wwwroot/your_domain.com; # 确保路径正确
# 静态文件处理 (收集后的静态文件)
location /static/ {
alias /www/wwwroot/your_domain.com/staticfiles/;
expires 30d;
add_header Cache-Control "public, immutable";
}
# 媒体文件处理 (用户上传的文件)
location /media/ {
alias /www/wwwroot/your_domain.com/media/;
expires 30d;
}
# 反向X_X到 Gunicorn
location / {
proxy_pass http://127.0.0.1:8000; # 对应上面 gunicorn 绑定的端口
# 设置 WebSocket 支持 (如果需要)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 传递真实 IP 和 Host
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;
# 超时时间设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# 安全设置
location ~ /.ht {
deny all;
}
}
- 保存后,点击 【重载配置】 按钮。
第五步:设置开机自启 (Systemd 服务)
为了让 Gunicorn 在服务器重启后自动运行,我们需要创建一个 Systemd 服务。
-
在终端创建服务文件:
sudo nano /etc/systemd/system/django-project.service -
粘贴以下内容(请根据实际情况修改路径和用户名):
[Unit] Description=Django Project After=network.target [Service] User=root Group=www WorkingDirectory=/www/wwwroot/your_domain.com ExecStart=/www/wwwroot/your_domain.com/venv/bin/gunicorn --workers 3 --bind unix:/www/wwwroot/your_domain.com/gunicorn.sock myproject.wsgi:application Restart=always [Install] WantedBy=multi-user.target注意:这里我改用了 Unix Socket (
gunicorn.sock) 方式,这比 TCP 端口更高效,且安全性更好。如果是这种方式,上面的 Nginx 配置中的proxy_pass需要改为proxy_pass http://unix:/www/wwwroot/your_domain.com/gunicorn.sock;。如果你坚持使用 TCP 端口 (8000),则保持上面的
ExecStart不变,并确保 Nginx 配置中的proxy_pass http://127.0.0.1:8000;。 -
启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable django-project.service sudo systemctl start django-project.service sudo systemctl status django-project.service
第六步:SSL 证书与防火墙
- 防火墙:确保宝塔面板的防火墙已放行 80 和 443 端口(通常默认已开)。
- SSL 证书:
- 在宝塔面板 【网站】 -> 点击你的站点 -> 【SSL】。
- 申请免费 Let’s Encrypt 证书(需域名解析到服务器 IP)。
- 申请成功后,开启 "HTTPS 强制跳转"。
常见问题排查
- 502 Bad Gateway:
- 检查 Gunicorn 是否正在运行 (
systemctl status django-project.service)。 - 检查 Nginx 配置中的
proxy_pass地址是否与 Gunicorn 监听地址一致。 - 查看 Nginx 错误日志:
tail -f /www/wwwlogs/your_domain.com_error.log。
- 检查 Gunicorn 是否正在运行 (
- 静态文件 404:
- 确认是否执行了
collectstatic。 - 确认 Nginx 配置中的
alias路径是否正确指向了staticfiles目录。
- 确认是否执行了
- 权限问题:
- 确保项目目录属于
www用户:chown -R www:www /www/wwwroot/your_domain.com。
- 确保项目目录属于
通过以上步骤,你的 Django 项目即可在 Ubuntu 22.04 + 宝塔面板环境下稳定运行。
云知识CLOUD