如何在Ubuntu 22.04上使用宝塔面板部署Django项目?

在 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 虚拟环境 & 安装依赖

  1. 登录宝塔 → 「文件」 → 进入你的项目目录(如 /www/wwwroot/mydjango
  2. 打开终端(可通过宝塔「终端」功能),执行:
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
  1. 配置 settings.py
    • 设置 DEBUG = False
    • 配置 ALLOWED_HOSTS = ['your-domain.com', 'localhost']
    • 设置正确的数据库连接(DATABASES
    • 配置 STATIC_ROOTMEDIA_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-decoupledjango-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 脚本(推荐新手)

  1. 宝塔 → 「计划任务」 → 添加任务

    • 类型: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 的目录)

  2. 手动测试启动:

    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 加密(强烈推荐)

  1. 宝塔 → 「网站」 → 你的站点 → 「SSL」
  2. 申请 Let’s Encrypt 免费证书(自动签发)
  3. 勾选「强制 HTTPS」
  4. 重启 Nginx

✅ 完成后访问 https://your-domain.com 即生效


🔍 常见问题排查

问题 解决方案
Permission denied 检查目录权限:chown -R www-data:www-data /www/wwwroot/mydjango
ModuleNotFoundError 确认 source venv/bin/activatewhich python 指向 venv
数据库连接失败 检查 settings.pyHOST 是否为 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技术博 » 如何在Ubuntu 22.04上使用宝塔面板部署Django项目?