可行,但需确保uWSGI≥2.0.21、Python≥3.8,禁用socket改用http模式直连,Nginx补全X-Forwarded-Proto等header,并正确配置STATIC_ROOT与静态路径映射。

宝塔面板部署 Django 4.0 项目时,uWSGI 和 Nginx 的组合是可行的,但必须注意 Django 4.0 已**正式弃用 Python 3.7 及更早版本**,且对 uWSGI 的最低兼容版本有隐性要求——低于 2.0.21 的 uWSGI 在处理 ASGI 兼容层或某些信号行为时容易静默崩溃,尤其在 reload 或多进程场景下。
确认 Python 版本与 uWSGI 兼容性
Django 4.0 要求 Python ≥ 3.8,而宝塔默认提供的 Python 3.8.5/3.9 是安全起点。但很多用户在“Python项目管理器”里点安装后,实际运行的是系统级旧版 uwsgi(比如 2.0.18),它不识别 --die-on-term 等新参数,导致服务启动后立即退出,日志里只显示 *** Starting uWSGI *** 就没了。
实操建议:
- 进终端,激活项目虚拟环境:
source /www/wwwroot/your_project/venv/bin/activate - 检查当前
uwsgi版本:uwsgi --version,若低于2.0.21,立刻升级:pip install --upgrade uwsgi - 别依赖宝塔插件自动装的
uwsgi,它常走系统包管理路径,和虚拟环境脱节 - 升级后验证是否能加载 Django:
uwsgi --http :8000 --module your_project.wsgi:application --master --processes 2 --threads 2 --die-on-term
配置 uwsgi.ini 时绕开常见陷阱
宝塔的“Python项目管理器”会自动生成 uwsgi.ini,但它默认用 socket 模式 + chmod-socket,而 Nginx 若未显式配置 user 或权限组,会因无法读取 socket 文件报 502 Bad Gateway,错误日志里出现 connect() to unix:///tmp/your_project.sock failed (13: Permission denied)。
更稳的做法是改用 http 模式直连,并关闭 socket 相关字段:
[uwsgi] module = your_project.wsgi:application chdir = /www/wwwroot/your_project home = /www/wwwroot/your_project/venv http = 127.0.0.1:8080 master = true processes = 2 threads = 2 die-on-term = true vacuum = true logto = /www/wwwroot/your_project/uwsgi.log
关键点:
- 删掉
socket、chmod-socket、uid、gid字段,避免权限纠缠 -
http = 127.0.0.1:8080让 uWSGI 启一个内部 HTTP server,Nginx 用proxy_pass http://127.0.0.1:8080转发即可 -
logto必须设,否则出错时看不到真实 traceback
Nginx 配置中必须补全的 header 项
宝塔网站设置里的“反向代理”功能会生成基础配置,但 Django 4.0 默认启用 SECURE_PROXY_SSL_HEADER 检查,如果 Nginx 没传 X-Forwarded-Proto,Django 会把所有重定向强制转成 http://,即使你开了 HTTPS;同时 ALLOWED_HOSTS 校验失败也会返回 400 Bad Request,但错误页面不提示具体原因。
进入网站 → 配置文件,手动补全以下三行(放在 location / 块内):
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;
另外确认 server_name 和 Django 的 ALLOWED_HOSTS 完全一致,比如 Nginx 写了 server_name example.com;,Django settings.py 就得写:ALLOWED_HOSTS = ['example.com', 'www.example.com'],不能只写 IP 或留空。
collectstatic 不生效?检查 STATIC_ROOT 是否指向正确路径
宝塔部署后常出现 CSS/JS 404,表面看是静态文件没加载,根源往往是 STATIC_ROOT 指向了错误位置,或 Nginx 没配静态路径映射。Django 4.0 要求 STATIC_ROOT 必须是绝对路径,且不能和 STATICFILES_DIRS 重叠。
标准做法:
- 在
settings.py中设:STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') - 执行
python manage.py collectstatic --noinput(注意不是static目录) - 在宝塔网站配置中,点击“网站目录”,把“静态文件目录”填为
/www/wwwroot/your_project/staticfiles - 确保该目录存在且 Nginx 进程有读权限:
chown -R www:www /www/wwwroot/your_project/staticfiles
最后重启 Nginx 和 uWSGI 服务——别只点“重载配置”,要真重启进程,否则旧内存里的路径缓存还在。
最易被忽略的一点:Django 4.0 的 DEBUG=False 下,runserver 不再自动提供静态服务,而宝塔的“Python项目管理器”默认就设 DEBUG=False,所以一旦漏配 STATIC_ROOT 或 Nginx 静态映射,样式就必然丢失,且错误极难定位到源头。











