在 Ubuntu 22.04 上通过宝塔面板(Baota Panel)部署 Django 项目,通常有两种主流方案:
- 方案一(推荐): 使用宝塔自带的 Nginx + uWSGI 模式。这是最稳定、性能最好且符合 Django 官方最佳实践的方式。
- 方案二: 使用 Python 虚拟环境配合 Nginx 反向X_X(类似 WSGI),适合轻量级或特定需求。
以下是基于 Ubuntu 22.04 和 宝塔面板 (LNMP/LAMP) 的完整部署步骤(以方案一为主):
第一阶段:准备工作
1. 安装宝塔面板(如果尚未安装)
如果你还没有安装宝塔,请在终端执行以下命令(需要 root 权限):
# 下载并安装宝塔面板
wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec
安装完成后,访问 http://你的IP:端口,输入用户名密码登录面板。
2. 安装必要的软件源组件
进入宝塔面板 -> 软件商店,确保安装了以下核心组件(如果没有,请一键安装):
- Nginx (Web 服务器)
- Python (建议版本 3.8 或 3.9,Django 3.x/4.x 推荐 Python 3.8+)
- 注意:Ubuntu 22.04 默认可能没有预装 Python 3,请在“软件商店”搜索 Python 并安装最新版。
- MySQL / MariaDB (数据库)
- Redis (可选,用于缓存或 Celery)
第二阶段:配置 Django 项目
1. 创建网站目录与上传代码
- 在宝塔左侧菜单点击 网站 -> 添加站点。
- 域名:填写你的域名(或留空,后续用 IP 访问)。
- 根目录:例如
/www/wwwroot/myproject。
- 将你的 Django 项目代码上传到该目录(推荐使用 SFTP 工具如 FileZilla,或者在终端使用
scp/git clone)。- 假设项目结构如下:
/www/wwwroot/myproject ├── manage.py ├── myproject/ (settings.py 所在目录) └── venv/ (虚拟环境,稍后创建)
- 假设项目结构如下:
2. 创建 Python 虚拟环境
为了避免依赖冲突,建议在项目目录下创建虚拟环境。
在宝塔面板左侧点击 终端,执行:
cd /www/wwwroot/myproject
python3 -m venv venv
source venv/bin/activate
3. 安装依赖
激活虚拟环境后,安装 requirements.txt 中的依赖:
pip install -r requirements.txt
# 如果项目中没有 requirements.txt,手动安装 django 等包
pip install django uwsgi gunicorn psycopg2-binary redis
注意:如果数据库是 MySQL,通常需要安装 mysqlclient 或 psycopg2-binary (PostgreSQL)。
4. 修改 Django Settings (settings.py)
打开项目根目录下的 myproject/settings.py,进行以下关键修改:
A. 允许所有主机访问 (开发/测试环境)
ALLOWED_HOSTS = ['*', '你的域名', '你的IP']
B. 静态文件配置
Django 需要收集静态文件到指定目录,Nginx 负责直接提供这些文件。
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
# 静态文件目录
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATIC_URL = '/static/'
# 媒体文件目录 (用户上传的文件)
MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = '/media/'
C. 数据库配置
确保数据库连接信息正确(宝塔会自动生成数据库,需填入此处):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 或 postgresql
'NAME': '你的数据库名',
'USER': '你的数据库用户',
'PASSWORD': '你的数据库密码',
'HOST': 'localhost',
'PORT': '3306',
}
}
5. 收集静态文件并迁移数据库
在终端执行:
# 收集静态文件
python manage.py collectstatic --noinput
# 数据库迁移
python manage.py migrate
# (可选) 创建超级管理员
python manage.py createsuperuser
第三阶段:配置 Nginx 与 uWSGI (核心步骤)
这是 Django 部署最关键的一步,让 Nginx 把请求转发给 uWSGI 处理。
1. 在宝塔中配置网站
- 回到宝塔 网站 列表,点击你刚才创建的站点右侧的 设置。
- 选择 配置文件 标签页。
- 删除原有的
location / { ... }块,替换为以下内容(根据你的实际路径调整):
server {
listen 80;
server_name your_domain.com; # 替换为你的域名
root /www/wwwroot/myproject; # 替换为你的项目根目录
charset utf-8;
# 1. 静态文件配置 (由 Nginx 直接处理,速度快)
location /static/ {
alias /www/wwwroot/myproject/staticfiles/; # 对应 settings.py 中的 STATIC_ROOT
expires 7d;
access_log off;
}
# 2. 媒体文件配置 (用户上传的文件)
location /media/ {
alias /www/wwwroot/myproject/media/;
expires 30d;
}
# 3. Django 应用配置 (转发给 uWSGI)
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/myproject.sock; # 对应下方 uwsgi.ini 的配置
uwsgi_param HTTP_PROXY "$http_proxy";
}
# 错误日志
error_log /www/wwwlogs/myproject_error.log;
access_log /www/wwwlogs/myproject_access.log;
}
保存后点击“重载配置”。
2. 创建 uWSGI 配置文件
在项目根目录 /www/wwwroot/myproject/ 下新建一个文件 uwsgi.ini:
[uwsgi]
# 项目主目录
chdir = /www/wwwroot/myproject
# 启动时激活虚拟环境
virtualenv = /www/wwwroot/myproject/venv
# 模块路径 (格式:path.to.settings.wsgi_application)
module = myproject.wsgi:application
# 监听 socket 地址 (必须与 Nginx 配置一致)
socket = /tmp/myproject.sock
# Socket 权限 (确保 www 用户可读写)
chmod-socket = 666
# 进程数 (根据 CPU 核心数调整,通常 4-8)
workers = 4
# 线程数
threads = 2
# 缓冲大小
buffer-size = 32768
# 自动回收内存
max-requests = 5000
vacuum = true
# 守护进程
daemonize = /www/wwwlogs/uwsgi.log
注意:请将 myproject.wsgi:application 中的 myproject 替换为你实际的项目文件夹名称(即包含 settings.py 的那个文件夹名)。
3. 启动 uWSGI 服务
在终端执行:
cd /www/wwwroot/myproject
source venv/bin/activate
uwsgi --ini uwsgi.ini
此时,如果提示启动成功,说明后端已就绪。你可以按 Ctrl+C 停止它,稍后用后台运行方式启动,或者直接使用宝塔的“计划任务”来管理开机自启。
推荐:使用宝塔计划任务实现开机自启
- 宝塔左侧菜单 -> 计划任务。
- 类型选择 Shell 脚本。
- 周期选择 每天 (或自定义),时间填
00:00。 - 脚本内容填入启动命令(加上
nohup和&让它后台运行):cd /www/wwwroot/myproject && source venv/bin/activate && nohup uwsgi --ini uwsgi.ini &(注:更稳健的方式是使用 systemd 服务,但宝塔计划任务对新手最友好)
第四阶段:验证与优化
- 检查状态:
在终端输入ps -ef | grep uwsgi,如果有进程运行,说明启动成功。 - 访问测试:
浏览器访问http://你的域名或http://你的IP。- 如果能看到你 Django 的首页或报错页面(非 502 Bad Gateway),说明配置基本成功。
- 如果看到 502 Bad Gateway,通常是
uwsgi.ini中的socket路径不对,或者 Nginx 配置中的alias路径有误。
- 开启 HTTPS:
在宝塔网站设置中,点击 SSL,申请免费的 Let’s Encrypt 证书并开启强制跳转 HTTPS。 - 生产环境安全:
- 再次确认
DEBUG = False在settings.py中。 - 设置强密码的 SECRET_KEY。
- 确保数据库防火墙仅允许本地访问。
- 再次确认
常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 502 Bad Gateway | Nginx 无法连接 uWSGI socket | 检查 uwsgi.ini 中的 socket 路径与 Nginx 配置是否完全一致;检查文件权限 chmod 666。 |
| 404 Not Found (静态文件) | 静态文件未收集或路径错误 | 运行 python manage.py collectstatic;检查 Nginx alias 路径是否指向 STATIC_ROOT。 |
| 数据库连接拒绝 | 数据库未创建或密码错误 | 在宝塔“数据库”中添加对应数据库和用户,并在 settings.py 中更新信息。 |
| uWSGI 启动后立即退出 | 代码有语法错误或依赖缺失 | 查看 /www/wwwlogs/uwsgi.log 日志,定位具体报错。 |
按照以上步骤,你就可以在 Ubuntu 22.04 的宝塔面板上稳定运行 Django 项目了。
轻量云Cloud