nginx通过反向代理配合python应用服务器实现多应用托管,支持按域名、路径或端口三种方式:域名区分用server_name匹配独立server块;路径区分用location前缀并注意proxy_pass末尾斜杠;端口区分则监听不同listen端口。

Nginx 本身不直接运行 Python 代码,它需要配合 Python 应用服务器(如 uWSGI 或 Gunicorn)来托管多个 Python 应用。在虚拟主机(即 server 块)中实现多应用托管,核心是按域名、路径或端口区分请求,并反向代理到对应的应用服务进程。
下面分三种主流方式说明,每种都聚焦“如何在 Nginx 虚拟主机配置中体现”,并给出关键配置逻辑和注意事项:
按域名区分(推荐用于生产环境)
每个 Python 应用绑定独立子域(如 api.example.com、admin.example.com),Nginx 根据 server_name 匹配对应 server 块,再反向代理到不同后端。
- 确保每个应用已用 Gunicorn/uWSGI 启动在不同端口(如 api 用
127.0.0.1:8001,admin 用127.0.0.1:8002) - 为每个域名单独写一个
/etc/nginx/sites-available/app1.conf,启用时软链到sites-enabled/ - 示例配置片段:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}按 URL 路径区分(适合同一域名下的子应用)
所有请求走同一个域名(如 example.com),但通过路径前缀(如 /blog/、/shop/)路由到不同 Python 应用。
- 后端应用需支持
SCRIPT_NAME或配置FORCE_SCRIPT_NAME(Django)等,避免静态资源或重定向出错 - Nginx 需用
proxy_pass带路径,并去除匹配前缀(注意末尾斜杠) - 示例:
location /blog/ {
proxy_pass http://127.0.0.1:8003/; # 注意末尾的 /,会剥离 /blog/
proxy_set_header Host $host;
}
location /shop/ {
proxy_pass http://127.0.0.1:8004/;
proxy_set_header Host $host;
}按端口区分(适合开发或测试环境)
不依赖域名解析,直接用不同端口暴露不同应用(如 example.com:8081 → blog,example.com:8082 → api)。
- 每个
server块监听不同listen端口,root不适用(Python 是动态服务),仍需proxy_pass - 需确保防火墙放行对应端口(如
sudo ufw allow 8081) - 配置简洁,但对外暴露非标准端口,一般不用于正式上线
共性关键点
无论哪种方式,都要注意:
-
每个 Python 应用必须独立运行:不能共用同一个 Gunicorn/uWSGI 进程;建议用 systemd 管理各应用服务(如
gunicorn@blog.service) -
静态文件处理交给 Nginx:如果应用含静态资源(如 Django 的
static/),应在对应location中直接alias,避免经 Python 处理 -
避免配置冲突:多个
server块不能有相同listen + server_name组合;路径区分时注意location优先级(最长前缀匹配) -
测试后重载配置:
sudo nginx -t && sudo systemctl reload nginx,不要用 restart
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











