关于通过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,步骤如下:
- 确认Passenger版本:执行
passenger --version,确保版本≥6.0.0。 - 在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()
- Plesk配置:
- 进入网站的“设置”→“Apache & Nginx”,启用Passenger。
- 指定Python版本为你的项目虚拟环境版本。
- 将文档根目录设置为Django项目的
static目录(或创建空的public目录,Passenger需要一个可访问的根目录)。 - 添加静态文件规则:将
/static/指向项目的static目录,/media/指向media目录。
方案2:Nginx + Uvicorn/Daphne 反向代理
若不想用Passenger,可直接用Nginx反向代理到ASGI服务器:
- 安装ASGI服务器:
pip install uvicorn daphne
- 创建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
- 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; }
- 重启Nginx生效:
systemctl restart nginx
内容的提问来源于stack exchange,提问作者Patrick Smit
相关产品推荐
相关产品推荐

