通过Nginx的location ^~ /path/配合proxy_pass http://127.0.0.1:port/实现子路径反向代理,各Node.js应用监听不同端口并适配basename或挂载路径,同时透传真实IP、协议及WebSocket头字段。

在同一个域名下,通过子路径(如 /admin/、/api/、/shop/)挂载多个独立的 Node.js 应用,核心是用 Nginx 的 location 块做路径级反向代理,每个子路径对应一个后端服务实例,互不干扰。
每个子路径配独立 location + proxy_pass
这是最直接可靠的方式。Nginx 根据请求 URL 前缀精准匹配,把流量转发到对应端口的 Node.js 服务:
-
必须用
^~前缀:例如location ^~ /admin/,表示前缀匹配且优先于正则匹配,避免被其他规则覆盖 -
proxy_pass 末尾要加斜杠:写成
proxy_pass http://127.0.0.1:3001/;(注意结尾的/),这样 Nginx 会自动剥离/admin/前缀再转发,后端收到的是干净路径(如/dashboard而不是/admin/dashboard) -
各应用监听不同端口:比如
/admin/→3001,/shop/→3002,/user/→3003,用 PM2 或node cluster管理即可
确保后端能正确处理子路径路由
Node.js 应用本身需适配子路径上下文,否则前端路由或静态资源可能出错:
-
Express/Koa 静态资源:用
app.use('/admin', express.static(...))显式挂载,让/admin/favicon.ico等能命中 -
前端框架(React/Vue):若页面是 SPA,构建时需设
basename="/admin/"(React Router v6+)或base="/admin/"(Vue Router),否则history.pushState和刷新会 404 -
API 请求路径:前端调用接口时,统一走相对路径(如
/api/users),由 Nginx 的location /api/规则代理到后端服务,无需硬编码完整 URL
补充关键代理头与连接设置
仅 proxy_pass 不够,真实 IP、协议、WebSocket 等都依赖这些头字段:
-
透传客户端信息:
proxy_set_header X-Real-IP $remote_addr;、X-Forwarded-For、X-Forwarded-Proto必须设置,否则日志和鉴权会误判为本地请求 -
启用 HTTP/1.1 长连接:
proxy_http_version 1.1;+proxy_set_header Connection "";,减少 TCP 握手开销 -
支持 WebSocket:如果某个子应用用到 WebSocket(如实时通知),加上
proxy_set_header Upgrade $http_upgrade;和Connection "upgrade";
避免常见陷阱
配置看似简单,但几处细节错一个就导致白屏或 404:
-
不要混用 alias 和 proxy_pass:子路径挂载 Node.js 服务必须用
proxy_pass;alias只适用于静态文件(如 Vue 打包产物),不能用于转发动态服务 -
location 路径结尾斜杠要一致:定义
location /admin/,则访问必须带尾斜杠(/admin/xxx),否则匹配失败;若写成location /admin(无斜杠),则/admin和/adminxxx都会匹配,极易误伤 -
静态资源优先匹配:如果某个子应用有自己专属的
/admin/static/,可在其location内部再嵌套一层location ~* \.(js|css|png|jpg)$直接返回文件,避免全量走 Node.js


















