走啊走
加油

ubuntu22.04宝塔部署django项目?

服务器价格表

在 Ubuntu 22.04 上使用宝塔面板(Baota Panel)部署 Django 项目,通常有两种主流方案:

  1. 使用宝塔自带的“网站”功能(推荐):通过 Nginx + uWSGI/Gunicorn 反向X_X方式部署。这是最标准、性能最好且易于维护的方式。
  2. 使用宝塔的“容器/Docker"功能:如果你习惯 Docker 化开发,可以使用 Docker 容器运行 Django。

以下重点介绍方案一(Nginx + Gunicorn/uWSGI),这是生产环境最常用的方式。


前置准备

  1. 安装宝塔面板:确保已安装并登录宝塔(假设 IP 为 your_server_ip)。
  2. 安装 Python 环境
    • 进入宝塔面板 -> 软件商店
    • 搜索并安装 Python(建议选择 Python 3.9 或 3.10,与你的项目版本匹配)。
    • 安装后,点击右侧的 设置,确认 Python 路径(通常是 /www/server/panel/venv/bin/python 或类似路径)。
  3. 上传代码
    • 将你的 Django 项目源码上传到服务器目录,例如 /www/wwwroot/my_django_project
    • 或者直接在宝塔 文件 管理器中创建目录并上传压缩包解压。

步骤一:配置虚拟环境 (Virtualenv)

虽然宝塔自带了 Python,但为了隔离依赖,建议在项目目录下创建虚拟环境。

  1. 打开宝塔 终端(SSH 连接)。

  2. 进入项目目录:

    cd /www/wwwroot/my_django_project
  3. 创建虚拟环境(假设使用系统安装的 Python 3.9):

    python3 -m venv venv
    source venv/bin/activate
  4. 安装项目依赖 (requirements.txt):

    pip install -r requirements.txt
    # 如果项目没有 requirements.txt,请手动安装 django, gunicorn 等
    pip install django gunicorn psycopg2-binary
  5. 修改 settings.py

    • 确保 ALLOWED_HOSTS 包含你的域名或 IP:
      ALLOWED_HOSTS = ['*']  # 生产环境建议指定具体域名
    • 确保 STATIC_ROOTMEDIA_ROOT 已配置正确。
    • DEBUG 设置为 False
    • 配置数据库连接(MySQL/PostgreSQL),确保数据库用户权限正常。
  6. 收集静态文件

    python manage.py collectstatic --noinput
  7. 退出虚拟环境(可选,但在后续启动脚本中会重新激活):

    deactivate

步骤二:在宝塔添加网站

  1. 进入宝塔面板 -> 网站 -> 添加站点
  2. 填写域名(如果是测试可用 IP 代替),选择 PHP 类型(实际上我们主要用 Nginx 配置,类型选 PHP 不影响,因为不运行 PHP 代码),数据库类型根据需求选择(Django 需要独立数据库,这里先不建,后面去数据库管理里建)。
  3. 点击 提交。此时会在 /www/wwwroot/你的域名 下生成目录。
  4. 替换代码
    • 将刚才上传的项目代码移动到该目录(或者直接在该目录操作)。
    • 确保目录结构如下:
      /www/wwwroot/你的域名
        ├── my_django_project (你的源码根目录,包含 manage.py)
        ├── staticfiles (collectstatic 生成的)
        └── media (用户上传的文件)
    • 注意:如果代码在子文件夹,建议将代码中的 manage.py 所在目录作为网站根目录。

步骤三:配置 Nginx 反向X_X

这是最关键的一步,让 Nginx 把请求转发给 Django 后端。

  1. 在网站列表中,找到刚创建的站点,点击 配置文件
  2. 清空默认内容,粘贴以下配置(请根据实际情况修改 server_nameroot 路径):
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";
    }
}
  1. 保存配置并重启 Nginx。

步骤四:启动 Django 应用 (Gunicorn/uWSGI)

Django 不能直接跑在 Nginx 上,需要一个 WSGI 服务器。推荐使用 Gunicorn

方法 A:使用宝塔“进程管理” (推荐新手)

  1. 进入宝塔面板 -> 软件商店 -> 搜索并安装 Process Management (如果有) 或使用 PM2 (宝塔有时预装)。
  2. 更通用的方法是使用 Supervisor (宝塔自带) 或编写简单的启动脚本。

推荐使用 Supervisor 管理 (宝塔默认已安装):

  1. 在终端输入 supervisorctl status 查看状态。
  2. 创建一个配置文件:
    sudo nano /etc/supervisor/conf.d/django.conf
  3. 填入以下内容(请根据你的实际路径修改):
    [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 用户,确保该用户对项目目录有读写权限。

  4. 加载配置:
    supervisorctl reread
    supervisorctl update
    supervisorctl start mydjango

方法 B:使用宝塔“计划任务”或“进程守护” (简化版)

如果不想用 Supervisor,可以在宝塔 计划任务 中设置一个开机启动脚本,或者使用宝塔自带的 PM2 插件(需安装)来管理 Node.js 风格的进程,但这对于 Python 不如 Supervisor 原生稳定。

推荐直接使用 Supervisor 方案,因为它能自动重启崩溃的进程。


步骤五:权限修复与测试

  1. 修复权限
    确保 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
  2. 测试访问
    在浏览器访问 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_URLsettings.py 中配置正确(如 /static/)。
  • 内存不足
    • Django + Gunicorn 比较吃内存。如果服务器配置低(如 1GB 内存),请在 Gunicorn 启动参数中限制 worker 数量:
      --workers 2--threads 2

通过以上步骤,你的 Django 项目就可以稳定地运行在 Ubuntu 22.04 的宝塔面板上了。