molesignal.example.com,内网 DNS 解析到 nginx 的内网地址 10.0.0.10,公网 DNS 解析到公网地址 203.0.113.10。两个 server 用同一张证书,按监听地址区分。只保留实际用到的 location。
公共部分
把上游、公网日志格式和限流区放在http 块里,例如 /etc/nginx/conf.d/molesignal.conf 的开头:
/etc/nginx/snippets/molesignal-proxy.conf:
内网入口
内网入口转发全部路径,与没有公网入口时一样。实时查询是流式响应,不能缓冲:公网入口
公网入口只列出要开放的路径,每个路径只收它用到的方法,最后的location / 对其他一切返回 404:
limit_except GET 同时放行 HEAD。要按来源地址收紧某条路径,在它的 location 里加 allow 和 deny all;,例如只允许 Azure 服务标记 AzureBotService 里的地址段访问 Teams 的回调。
状态页的自定义域名
状态页绑定了status.example.org 时,为它加一个公网 server,只放行状态页的根路径、接口和网页文件:
stream 模块按 SNI 直通,看不到路径,也就不能只放行状态页。要在入口上限制路径,就把证书放在 nginx 上管理。
只有一个入口时
nginx 只有一个监听地址时,用来源地址区分:公网server 里的开放路径保持不变,把最后的 location / 换成只允许公司网络和 VPN 的地址段,再补上实时查询的流式设置:
server,client_max_body_size 要放宽到 10m,访问日志也会记下内网请求的路径。nginx 前面还有负载均衡时,用 set_real_ip_from 和 real_ip_header 取到原始地址,否则 allow 看到的都是负载均衡的地址。
检查
检查配置并重新加载:404:
401,说明请求到了 MoleSignal:
_sys 组织的 设置 → 客户端 IP 识别 里,把 nginx 的地址列为受信任的代理,见客户端 IP 识别。