ubuntu22.04宝塔部署django项目?

在 Ubuntu 22.04 上使用宝塔面板(BT Panel)部署 Django 项目,虽然宝塔原生支持 PHP/Python 的简单配置,但 Django 作为全栈框架,通常需要更精细的环境配置(如 Gunicorn、Nginx 反向X_X、静态文件处理等)。

以下是基于宝塔面板(推荐安装 宝塔专业版社区版 的 Python 管理功能)部署 Django 项目的完整步骤。

前置准备

  1. 服务器环境:Ubuntu 22.04 LTS。
  2. 宝塔面板:已安装并运行正常。
  3. Django 项目代码:已上传至服务器(建议通过 Git 拉取或上传压缩包解压)。
  4. 数据库:建议在宝塔“网站” -> “数据库”中创建一个 MySQL 或 PostgreSQL 数据库。

第一步:创建 Python 站点

宝塔对 Python 的支持主要通过“网站”功能中的 Python 选项实现。

  1. 登录宝塔面板,进入左侧菜单 【网站】
  2. 点击 【添加站点】
  3. 填写域名(如果无域名可填 IP),选择 【Python】 类型。
    • 版本选择:建议选择 3.93.10(需与你的 Django 项目兼容版本一致)。
    • 根目录:系统会自动生成一个文件夹,后续我们将把项目代码放入此目录。
  4. 点击 【提交】

注意:此时宝塔会初始化一个基础的 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 强烈建议使用虚拟环境来隔离依赖。

  1. 在宝塔面板左侧菜单点击 【终端】(或 SSH 连接服务器)。
  2. 进入项目目录:
    cd /www/wwwroot/your_domain.com
  3. 创建虚拟环境(以 Python 3.10 为例,请根据实际安装的版本调整):
    python3.10 -m venv venv
  4. 激活虚拟环境:
    source venv/bin/activate
  5. 安装依赖包:
    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',
        }
    }

第三步:迁移数据与收集静态文件

在终端中执行以下命令:

  1. 数据库迁移
    python manage.py migrate
  2. 创建超级管理员
    python manage.py createsuperuser
  3. 收集静态文件(这一步至关重要,否则 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

  1. 回到宝塔面板,进入 【网站】 -> 点击你的站点 -> 【配置文件】
  2. 找到 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;
    }
}
  1. 保存后,点击 【重载配置】 按钮。

第五步:设置开机自启 (Systemd 服务)

为了让 Gunicorn 在服务器重启后自动运行,我们需要创建一个 Systemd 服务。

  1. 在终端创建服务文件:

    sudo nano /etc/systemd/system/django-project.service
  2. 粘贴以下内容(请根据实际情况修改路径和用户名):

    [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;

  3. 启用并启动服务:

    sudo systemctl daemon-reload
    sudo systemctl enable django-project.service
    sudo systemctl start django-project.service
    sudo systemctl status django-project.service

第六步:SSL 证书与防火墙

  1. 防火墙:确保宝塔面板的防火墙已放行 80 和 443 端口(通常默认已开)。
  2. 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
  • 静态文件 404
    • 确认是否执行了 collectstatic
    • 确认 Nginx 配置中的 alias 路径是否正确指向了 staticfiles 目录。
  • 权限问题
    • 确保项目目录属于 www 用户:chown -R www:www /www/wwwroot/your_domain.com

通过以上步骤,你的 Django 项目即可在 Ubuntu 22.04 + 宝塔面板环境下稳定运行。

未经允许不得转载:云知识CLOUD » ubuntu22.04宝塔部署django项目?