Nginx 反向代理完整教程:从单站点到多服务转发
Nginx 反向代理几乎是每个技术站点都会碰到的基础能力,但很多问题都出在“看起来只差一行配置”。这篇文章不追求把所有指令列一遍,而是从真实部署场景出发,解释哪些配置必须加,为什么会 502,WebSocket 为什么经常断,以及多服务转发时最容易犯什么错。
反向代理最小可用配置是什么
一个最小可用的反向代理,至少要解决三件事:请求如何转发、上游服务如何识别原始 Host、以及客户端真实 IP 如何透传。很多配置能跑起来,但一旦登录、回调、鉴权或绝对链接依赖域名,就会因为 Host 头没转发而出现奇怪问题。
如果你的上游应用需要识别 HTTPS、记录真实访客地址,记得同时设置 X-Forwarded-Proto、X-Real-IP 与 X-Forwarded-For,否则应用日志和回调地址往往不准确。
- proxy_pass 指向上游服务地址
- proxy_set_header Host $host 保留原域名
- proxy_set_header X-Real-IP $remote_addr 透传访客 IP
- proxy_set_header X-Forwarded-Proto $scheme 透传协议
为什么经常出现 502 Bad Gateway
502 大多不是 Nginx 本身坏了,而是上游服务不可达。常见原因包括:服务没启动、监听地址错了、容器内部端口和宿主机端口搞混、或者 SELinux、防火墙、Unix socket 权限导致 Nginx 连不上。
排查时不要只盯着浏览器页面。更有效的方法是:先用 curl 直接请求上游地址;再看应用进程是否在监听对应端口;最后查看 Nginx error.log。很多人一上来就改配置,结果问题其实出在 Node 服务崩了。
WebSocket 代理为什么需要额外配置
WebSocket 和普通 HTTP 请求不同,升级连接时需要 Upgrade 和 Connection 头。如果没配,很多实时功能会表现为:页面能打开,但消息推送、终端连接或管理后台实时刷新失效。
凡是涉及在线终端、聊天、实时日志和管理面板的服务,都应该检查这两个头是否正确透传。
- proxy_http_version 1.1
- proxy_set_header Upgrade $http_upgrade
- proxy_set_header Connection "upgrade"
多服务站点怎么规划更稳妥
如果一台服务器上要跑官网、API、管理后台和对象存储代理,最稳妥的方式通常不是把所有东西都塞进一个巨大的 location 树,而是先按域名分,再按路径分。越早把站点边界划清楚,后续维护越轻松。
小项目最怕一开始图快,把所有服务都混在一个 server 块里。等后面证书、缓存、跨域和登录都叠起来后,配置很快就难以理解。
作者说明
长期维护小型网站和服务器,关注真正能解决问题的技术教程、部署经验与排障方法。