nginx 通过反向代理将不同域名或路径请求分发至独立运行的 python(如 flask+gunicorn)和 node.js(如 express)服务,每个服务监听本地不同端口,由 systemd 或 pm2 守护,nginx 仅负责流量调度与 ssl 终结。

Nginx 本身不直接运行 Python 应用,它也不能像托管静态前端那样直接“托管” Node.js 或 Python 后端。你提到的“在虚拟主机中托管多个 Python 应用”,实际是指:用 Nginx 作为反向代理,将不同域名或路径的请求,转发给各自独立运行的 Python 应用服务(如 Flask/FastAPI + Gunicorn/uWSGI);而 Node.js 应用同理——它也是被代理的目标,不是和 Python 混合部署在同一进程里。
所以问题本质是:
✅ 如何让 Nginx 的一个虚拟主机(server 块)或多个 server 块,分别代理多个 Python(和/或 Node.js)后端服务?
答案是:靠反向代理 + 独立进程管理 + 端口/域名/路径区分,而不是让 Nginx “运行”它们。
? 域名区分:最常用、最清晰的方式
适合多个独立项目(如 api.example.com、blog.example.com、node-app.example.com)
- 每个 Python/Node.js 应用各自监听不同本地端口(如
127.0.0.1:8000,127.0.0.1:8001,127.0.0.1:3000) - Nginx 配置多个
server块,用server_name区分域名,再用proxy_pass转发
# /etc/nginx/sites-available/api.example.com
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# /etc/nginx/sites-available/blog.example.com
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# /etc/nginx/sites-available/node-app.example.com
server {
listen 80;
server_name node-app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
✅ 启用方式:软链接到
sites-enabled,然后sudo systemctl reload nginx
? 路径区分(URL 前缀):适合同一域名下的子服务
比如 example.com/python-api/ 和 example.com/node-admin/
server {
listen 80;
server_name example.com;
# Python API 在 /python-api/
location /python-api/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 注意末尾斜杠:保证 /python-api/foo → 转发为 /foo
}
# Node.js 后台在 /node-admin/
location /node-admin/ {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 前端 SPA 主页(如 Vue/React)
location / {
root /var/www/example-frontend/dist;
try_files $uri $uri/ /index.html;
}
}
⚠️ 注意:proxy_pass 末尾加 / 才能正确剥离前缀;不加会导致路径透传错误。
根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。
⚙️ Python 应用需自行启动并守护(关键!)
Nginx 只负责转发,不启动、不管理 Python 进程。你需要:
-
用
gunicorn或uWSGI启动 Python 应用(推荐生产用 gunicorn)gunicorn --bind 127.0.0.1:8000 --workers 2 myapp:app
-
用
systemd或pm2(Node.js)守护进程,确保崩溃后自动重启
示例(Python systemd service):/etc/systemd/system/my-python-api.service[Unit] Description=My Python API Service After=network.target [Service] Type=simple User=www-data WorkingDirectory=/opt/myapp ExecStart=/usr/local/bin/gunicorn --bind 127.0.0.1:8000 --workers 2 myapp:app Restart=always [Install] WantedBy=multi-user.target
启用:
sudo systemctl daemon-reload && sudo systemctl enable --now my-python-api Node.js 同理,可用
pm2 start app.js --name "node-admin"+pm2 startup
❌ 不要混淆的概念
- Nginx 不能直接执行
.py文件(不像 PHP 有fastcgi_pass内置支持) - Nginx 没有内置 Python 解释器或 Node.js 运行时 —— 它只是 HTTP 流量调度器
- “虚拟主机”在 Nginx 中就是
server{}块,不是容器或沙箱,不隔离运行环境
这样配置后,你就能在一个 Nginx 实例下,干净分离地对外提供:
? 多个 Python Web 服务(Flask/Django/FastAPI)
? 多个 Node.js 服务(Express/NestJS)
? 多个静态前端站点
全部共用 80/443 端口,由域名或路径精准路由,互不干扰。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










