nginx通过location路径匹配+proxy_pass实现多应用共用80端口,核心是按前缀(如/app1/、/api/)转发请求;需注意proxy_pass末尾斜杠控制路径重写,并设置host、x-real-ip等头及超时参数。

用 proxy_pass 让多个应用共用 80 端口,核心是靠 location 路径匹配 + 反向代理转发,而不是靠端口区分。Nginx 充当统一入口,把不同 URL 前缀的请求分发到各自后端服务。
按路径前缀区分应用
这是最常用、最清晰的方式。每个应用绑定一个唯一路径前缀(如 /app1/、/api/、/admin/),Nginx 根据 location 规则精准转发:
- 确保后端服务监听的是内网地址或本地端口(例如
http://127.0.0.1:3000、http://localhost:8081),不直接暴露在公网 -
location块中使用带尾斜杠的写法(如location /app1/),配合proxy_pass后也带尾斜杠,才能正确重写路径 - 示例配置片段:
listen 80;
server_name example.com;
location /app1/ {
proxy_pass http://127.0.0.1:3000/; # 注意末尾斜杠
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /api/ {
proxy_pass http://127.0.0.1:8081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
避免路径重写错误
路径转发容易出错的关键点在于 proxy_pass 末尾是否加斜杠,它直接影响 URL 传递行为:
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
-
location /blog/ { proxy_pass http://127.0.0.1:4000/; }→ 请求/blog/post会转发为http://127.0.0.1:4000/post(自动剥离/blog) -
location /blog/ { proxy_pass http://127.0.0.1:4000; }(无尾斜杠)→ 请求/blog/post会转发为http://127.0.0.1:4000/blog/post(原样拼接,常导致 404) - 若后端服务本身不接受带前缀的路径,务必用第一种写法,保持语义一致
补充关键代理头与超时控制
仅写 proxy_pass 不够,真实环境中必须设置基础代理头和合理超时,否则易出现 502/504 或身份识别异常:
-
proxy_set_header Host $host;:让后端知道原始域名,对生成绝对链接、日志记录很重要 -
proxy_set_header X-Forwarded-For $remote_addr;:透传客户端真实 IP - 针对慢接口(如报表、导出),显式加大超时:
proxy_connect_timeout 30s;<br>proxy_send_timeout 300s;<br>proxy_read_timeout 300s;
- 如果后端是 WebSocket 或长连接服务,还需添加:
proxy_http_version 1.1;<br>proxy_set_header Upgrade $http_upgrade;<br>proxy_set_header Connection "upgrade";
验证与调试建议
配置完别急着 reload,先做几项低成本验证:
- 运行
nginx -t检查语法是否正确 - 用
curl -v http://example.com/app1/health查看响应头和状态码,确认是否真正打到目标服务 - 查看 Nginx 错误日志(通常是
/var/log/nginx/error.log),502 错误里通常明确写着“Connection refused”还是“Connection timed out”,可快速定位是后端未启动,还是网络/超时问题 - 浏览器开发者工具 Network 面板中检查响应头,确认
X-Proxy-By或自定义标识是否存在,辅助判断是否走对了 location 分支










