用好 nginx.conf 层级结构最直接有效:server 定边界、location 定行为、upstream 定依赖、include 和 map 定复用,通过职责分离与合理嵌套降低冗余、提升可维护性。

用好 nginx.conf 的层级结构,是管理复杂代理业务最直接有效的方式。核心在于理解 server、location、upstream 之间的职责分工,并通过合理嵌套与复用降低配置冗余和维护成本。
按业务域拆分 server 块
每个独立的对外服务(如 api.example.com、admin.example.com、static.example.com)应分配单独的 server 块。这样能天然隔离 SSL 配置、访问控制、日志路径等差异化设置。
- 同一域名不同端口或协议(HTTP/HTTPS)建议用两个 server 块分别定义,避免 if 判断
- 泛域名代理(如 *.example.com)可用 server_name _; 配合 map 指令做动态路由,但需谨慎评估安全性
- 不推荐在一个 server 块里堆砌多个 domain,否则 rewrite、return 等指令易相互干扰
用 location 分层匹配代理逻辑
location 不仅用于路径匹配,更是代理策略的执行单元。优先级由匹配精度决定(=、^~、~、~*、/),应按“精确→前缀→正则”顺序组织。
- /api/ → 代理到上游 API 集群,启用 proxy_buffering off 避免流式响应卡顿
- /ws/ → 匹配 WebSocket,必须添加 proxy_http_version 1.1 和 Upgrade/Connection 头
- /healthz → 内部健康检查,直接 return 200,不走 upstream
- 正则 location(如 ~* \.(js|css|png)$)适合静态资源缓存,配合 expires 和 add_header Cache-Control
upstream 做服务抽象与负载均衡
把后端服务定义为 named upstream,实现配置解耦。一个 upstream 可被多个 location 或 server 复用,修改节点只需改一处。
- 使用 ip_hash 或 hash $remote_addr 保持会话粘性(注意 IPv6 兼容性)
- 为关键服务配置 health_check interval=3 fails=2 passes=2,配合 max_fails 和 fail_timeout 实现自动摘除
- 跨机房场景可嵌套 upstream:主中心 upstream + 备中心 upstream,用 error_page 502 = @fallback 跳转
用 include 和 map 提升可维护性
单文件过大会导致排查困难。将通用段落抽离为独立文件,用 include 引入;将动态值(如 Host、路径前缀)映射为变量,减少重复判断。
- include /etc/nginx/conf.d/*.conf —— 按功能或团队划分子配置
- map $http_host $backend_group { hostnames; example.com api; admin.example.com admin; } —— 后续在 proxy_pass 中引用 $backend_group
- 公共 header、proxy_set_header、timeout 设置统一放在 /etc/nginx/common/proxy.conf,所有 location 中 include
结构清晰的 nginx.conf 不是靠堆参数,而是靠分层抽象和职责收敛。server 定边界,location 定行为,upstream 定依赖,include 和 map 定复用——四者配合,再复杂的代理场景也能保持可读、可测、可扩。

















