在 Ubuntu 22.04 上使用宝塔面板(Baota Panel)部署 Django 项目,通常有两种主流方案:
- 使用宝塔自带的“网站”功能(推荐):通过 Nginx + uWSGI/Gunicorn 反向X_X方式部署。这是最标准、性能最好且易于维护的方式。
- 使用宝塔的“容器/Docker"功能:如果你习惯 Docker 化开发,可以使用 Docker 容器运行 Django。
以下重点介绍方案一(Nginx + Gunicorn/uWSGI),这是生产环境最常用的方式。
前置准备
- 安装宝塔面板:确保已安装并登录宝塔(假设 IP 为
your_server_ip)。 - 安装 Python 环境:
- 进入宝塔面板 -> 软件商店。
- 搜索并安装 Python(建议选择 Python 3.9 或 3.10,与你的项目版本匹配)。
- 安装后,点击右侧的 设置,确认 Python 路径(通常是
/www/server/panel/venv/bin/python或类似路径)。
- 上传代码:
- 将你的 Django 项目源码上传到服务器目录,例如
/www/wwwroot/my_django_project。 - 或者直接在宝塔 文件 管理器中创建目录并上传压缩包解压。
- 将你的 Django 项目源码上传到服务器目录,例如
步骤一:配置虚拟环境 (Virtualenv)
虽然宝塔自带了 Python,但为了隔离依赖,建议在项目目录下创建虚拟环境。
-
打开宝塔 终端(SSH 连接)。
-
进入项目目录:
cd /www/wwwroot/my_django_project -
创建虚拟环境(假设使用系统安装的 Python 3.9):
python3 -m venv venv source venv/bin/activate -
安装项目依赖 (
requirements.txt):pip install -r requirements.txt # 如果项目没有 requirements.txt,请手动安装 django, gunicorn 等 pip install django gunicorn psycopg2-binary -
修改 settings.py:
- 确保
ALLOWED_HOSTS包含你的域名或 IP:ALLOWED_HOSTS = ['*'] # 生产环境建议指定具体域名 - 确保
STATIC_ROOT和MEDIA_ROOT已配置正确。 - 将
DEBUG设置为False。 - 配置数据库连接(MySQL/PostgreSQL),确保数据库用户权限正常。
- 确保
-
收集静态文件:
python manage.py collectstatic --noinput -
退出虚拟环境(可选,但在后续启动脚本中会重新激活):
deactivate
步骤二:在宝塔添加网站
- 进入宝塔面板 -> 网站 -> 添加站点。
- 填写域名(如果是测试可用 IP 代替),选择 PHP 类型(实际上我们主要用 Nginx 配置,类型选 PHP 不影响,因为不运行 PHP 代码),数据库类型根据需求选择(Django 需要独立数据库,这里先不建,后面去数据库管理里建)。
- 点击 提交。此时会在
/www/wwwroot/你的域名下生成目录。 - 替换代码:
- 将刚才上传的项目代码移动到该目录(或者直接在该目录操作)。
- 确保目录结构如下:
/www/wwwroot/你的域名 ├── my_django_project (你的源码根目录,包含 manage.py) ├── staticfiles (collectstatic 生成的) └── media (用户上传的文件) - 注意:如果代码在子文件夹,建议将代码中的
manage.py所在目录作为网站根目录。
步骤三:配置 Nginx 反向X_X
这是最关键的一步,让 Nginx 把请求转发给 Django 后端。
- 在网站列表中,找到刚创建的站点,点击 配置文件。
- 清空默认内容,粘贴以下配置(请根据实际情况修改
server_name和root路径):
server {
listen 80;
server_name your_domain.com; # 替换为你的域名
# 静态文件处理 (Django collectstatic 后的文件)
location /static/ {
alias /www/wwwroot/your_domain/staticfiles/; # 替换为你的实际路径
expires 30d;
log_not_found off;
access_log off;
}
# 媒体文件处理 (用户上传的文件)
location /media/ {
alias /www/wwwroot/your_domain/media/; # 替换为你的实际路径
expires 30d;
log_not_found off;
access_log off;
}
# 动态请求转发给 Django
location / {
proxy_pass http://127.0.0.1:8000; # 端口取决于你启动 gunicorn 的端口
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";
}
}
- 保存配置并重启 Nginx。
步骤四:启动 Django 应用 (Gunicorn/uWSGI)
Django 不能直接跑在 Nginx 上,需要一个 WSGI 服务器。推荐使用 Gunicorn。
方法 A:使用宝塔“进程管理” (推荐新手)
- 进入宝塔面板 -> 软件商店 -> 搜索并安装 Process Management (如果有) 或使用 PM2 (宝塔有时预装)。
- 更通用的方法是使用 Supervisor (宝塔自带) 或编写简单的启动脚本。
推荐使用 Supervisor 管理 (宝塔默认已安装):
- 在终端输入
supervisorctl status查看状态。 - 创建一个配置文件:
sudo nano /etc/supervisor/conf.d/django.conf - 填入以下内容(请根据你的实际路径修改):
[program:mydjango] command=/www/wwwroot/your_domain/venv/bin/gunicorn my_django_project.wsgi:application --bind 127.0.0.1:8000 directory=/www/wwwroot/your_domain/my_django_project user=www autostart=true autorestart=true stdout_logfile=/var/log/gunicorn/mydjango.log stderr_logfile=/var/log/gunicorn/mydjango_error.log environment=PYTHONPATH="/www/wwwroot/your_domain/my_django_project"注意:
user=www是宝塔默认的 Web 用户,确保该用户对项目目录有读写权限。 - 加载配置:
supervisorctl reread supervisorctl update supervisorctl start mydjango
方法 B:使用宝塔“计划任务”或“进程守护” (简化版)
如果不想用 Supervisor,可以在宝塔 计划任务 中设置一个开机启动脚本,或者使用宝塔自带的 PM2 插件(需安装)来管理 Node.js 风格的进程,但这对于 Python 不如 Supervisor 原生稳定。
推荐直接使用 Supervisor 方案,因为它能自动重启崩溃的进程。
步骤五:权限修复与测试
-
修复权限:
确保 Nginx 用户 (www) 有权读取项目文件和写入日志/临时目录。chown -R www:www /www/wwwroot/your_domain chmod -R 755 /www/wwwroot/your_domain # 特别注意 upload 目录 mkdir -p /www/wwwroot/your_domain/media/upload chown -R www:www /www/wwwroot/your_domain/media -
测试访问:
在浏览器访问http://your_domain.com。- 如果看到 Django 欢迎页或报错页面,说明 Nginx 和 Gunicorn 通信正常。
- 如果出现
403 Forbidden,检查 Nginx 配置中的alias路径是否正确,以及文件系统权限。 - 如果出现
502 Bad Gateway,说明 Gunicorn 没启动,检查supervisorctl status和日志/var/log/gunicorn/mydjango_error.log。
常见问题排查
- 数据库连接失败:
- 检查
settings.py中的数据库密码、主机名(通常是localhost)、端口(MySQL 3306, PG 5432)。 - 确保数据库防火墙允许本地连接。
- 检查
- 静态文件 404:
- 确认
collectstatic是否成功执行。 - 确认 Nginx 配置中的
alias路径与实际物理路径完全一致。 - 确认
STATIC_URL在settings.py中配置正确(如/static/)。
- 确认
- 内存不足:
- Django + Gunicorn 比较吃内存。如果服务器配置低(如 1GB 内存),请在 Gunicorn 启动参数中限制 worker 数量:
--workers 2或--threads 2。
- Django + Gunicorn 比较吃内存。如果服务器配置低(如 1GB 内存),请在 Gunicorn 启动参数中限制 worker 数量:
通过以上步骤,你的 Django 项目就可以稳定地运行在 Ubuntu 22.04 的宝塔面板上了。
CLOUD云计算