You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于通过Passenger部署Django的WSGI与ASGI配置困惑

Django部署问题解答

一、Passenger是否忽略项目的wsgi.py?

Passenger并非完全忽略项目的wsgi.py,而是遵循一套默认的文件查找规则:

  • 如果你的Django项目根目录下存在wsgi.py,且Passenger能识别到项目路径(需确保Python虚拟环境配置正确),它会自动加载该文件中的application对象。
  • 若项目的wsgi.py不在默认查找路径,或你需要自定义加载逻辑,可在网站的文档根目录创建passenger_wsgi.py,手动导入项目的WSGI应用:
import sys, os
# 将项目根目录添加到Python路径
sys.path.insert(0, os.path.abspath('/path/to/your/django/project'))
# 导入项目的WSGI应用
from myproject.wsgi import application

简言之,Passenger会优先使用自定义的passenger_wsgi.py,若无则尝试加载项目默认的wsgi.py。

二、ASGI部署方案(带域名)

ASGI部署需要处理异步请求(如WebSocket),无论用哪种方式,Nginx都是必要的——它负责转发请求、处理静态文件、做反向代理。下面提供两种适配Plesk环境的方案:

方案1:Passenger 6+ 部署ASGI

Passenger 6及以上版本原生支持ASGI,步骤如下:

  1. 确认Passenger版本:执行passenger --version,确保版本≥6.0.0。
  2. 在Django项目根目录创建passenger.asgi.py,内容示例:
import os
import sys
from django.core.asgi import get_asgi_application

# 设置Django环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
# 将项目根目录添加到Python路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
# 获取ASGI应用对象
application = get_asgi_application()
  1. Plesk配置:
    • 进入网站的“设置”→“Apache & Nginx”,启用Passenger。
    • 指定Python版本为你的项目虚拟环境版本。
    • 将文档根目录设置为Django项目的static目录(或创建空的public目录,Passenger需要一个可访问的根目录)。
    • 添加静态文件规则:将/static/指向项目的static目录,/media/指向media目录。

方案2:Nginx + Uvicorn/Daphne 反向代理

若不想用Passenger,可直接用Nginx反向代理到ASGI服务器:

  1. 安装ASGI服务器:
pip install uvicorn daphne
  1. 创建systemd服务后台运行ASGI服务器
    • 新建/etc/systemd/system/django-asgi.service:
[Unit]
Description=Django ASGI Application
After=network.target

[Service]
User=your-ssh-user
Group=www-data
WorkingDirectory=/path/to/your/django/project
Environment="PATH=/path/to/venv/bin"
ExecStart=/path/to/venv/bin/uvicorn myproject.asgi:application --host 127.0.0.1 --port 8000 --workers 2

[Install]
WantedBy=multi-user.target
  • 启动并启用服务:
systemctl daemon-reload
systemctl enable django-asgi
systemctl start django-asgi
  1. Nginx配置(Plesk自定义配置)
    在网站的“Apache & Nginx设置”中,添加自定义Nginx规则(server块内):
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";
}

location /static/ {
    alias /path/to/your/django/project/static/;
    expires 30d;
}

location /media/ {
    alias /path/to/your/django/project/media/;
    expires 30d;
}
  1. 重启Nginx生效:systemctl restart nginx

内容的提问来源于stack exchange,提问作者Patrick Smit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:47:45