nginx代理配置须匹配实际网络拓扑:http/https用http模块,非http流量用stream模块;proxy_pass须写真实内网地址并设置host、x-real-ip等头;多集群分流需geo/map+upstream分组;动态拓扑需resolver或服务发现支持。

按流量方向选择 http 或 stream 模块
HTTP/HTTPS 类请求(网页、API、静态资源)走 http 模块,用 proxy_pass + location;非 HTTP 流量(MySQL、Redis、SSH 跳板、IoT TCP 心跳)必须走 stream 模块,它不解析内容,只转发原始 TCP/UDP 包。
启用 stream 需在主配置中取消注释:include /etc/nginx/stream-enabled/*.conf;,并在 stream { } 块内定义 server 和 upstream。
外网访问内网服务:反向代理要通路、传头、写对地址
前提是 Nginx 服务器能直连目标内网 IP(路由可达、防火墙放行)。常见错误是 proxy_pass 写成 localhost 或 127.0.0.1,结果流量没出去,而是打到本机。
- proxy_pass 必须写真实内网服务地址,如
http://192.168.10.50:8080/ - 务必设置
proxy_set_header Host $host,否则后端应用可能无法正确生成跳转链接 - 加上
X-Real-IP和X-Forwarded-For,让日志和业务逻辑能拿到真实客户端 IP - 若后端依赖 HTTPS 协议标识,需补
proxy_set_header X-Forwarded-Proto $scheme
内网多集群分流:用 geo/map + upstream 分组
跨地域或混合环境(如北京 IDC + 广州 K8s + 新加坡 Serverless)不能简单轮询。应按拓扑约束分组,避免跨域延迟、专线拥塞或故障扩散。
- 用
geo指令识别客户端地理位置,或用map解析请求头(如X-Region)映射到不同 upstream 变量 - 为每个逻辑组单独定义 upstream,例如
upstream bj_api、upstream gz_static - 每个 upstream 至少含 2 台后端,并配
least_conn或ip_hash(注意 session 粘性需配套方案) - 内网直连服务(如 DB 代理层)禁用
proxy_next_upstream_timeout,公网服务则启用重试与超时熔断
动态拓扑适配:支持自动扩缩容与 DNS 变更
静态 upstream 列表无法应对服务发现变化。需运行时解析、缓存并刷新后端列表。
- 在
http或stream块中配置resolver 114.114.114.114 valid=30s;,启用异步 DNS 解析 -
proxy_pass改用变量,如proxy_pass http://$backend;,配合map或 Lua 动态赋值 - 结合 OpenResty 的
lua-resty-consul或lua-resty-etcd,从注册中心拉取实例列表,写入 shared dict 缓存 - 健康检查要主动+分级:对 API 接口调
/health,对静态资源只 ping/ping,失败立即摘除,恢复后平滑加回











