You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Nginx的proxy_pass支持按DNS TTL动态解析可变域名

根因说明

你用变量传入proxy_pass的修改思路是正确的,配置不生效的常见原因有三个:

  1. resolver未显式配置valid参数,部分云厂商的DNS默认返回的TTL长达数小时,会导致解析结果长时间不更新;
  2. 未关闭IPv6解析,环境中不支持IPv6时,IPv6解析失败会触发Nginx的解析重试逻辑,反而复用旧的IPv4解析结果;
  3. HTTPS场景未开启SNI,域名解析更新后,新IP对应的HTTPS证书校验失败,请求无法正常转发,看起来像是解析没有生效。

解决方案

按以下要求修改配置即可实现按TTL动态解析域名:

  1. 修正resolver配置:显式指定解析结果的缓存时间,可根据业务场景调整valid参数值,如果你的环境没有启用IPv6,加上ipv6=off避免解析出IPv6地址导致访问异常。
  2. 补充HTTPS场景的必要配置:如果${ONBOARDING_URL}是HTTPS协议,需要在location块中添加proxy_ssl_server_name on;开启SNI支持,避免证书校验失败。
  3. 清理重复配置:删除冗余的一条proxy_set_header Host $proxy_host;配置。

修改后的完整配置示例:

server {
  listen                443 ssl;
  server_name           localhost;
  # 显式指定解析缓存时间,关闭IPv6解析
  resolver ${AWS_DNS} valid=30s ipv6=off;

  location  ~ ^/onboarding/?(.*)$ {
    proxy_cache onboarding;
    proxy_cache_valid 200 10m;
    proxy_cache_key $cacheKey;
    # HTTPS场景需要开启SNI,HTTP场景可删除该行
    proxy_ssl_server_name on;
    proxy_set_header Host $proxy_host;
    set $onboardingUrl ${ONBOARDING_URL};
    proxy_pass $onboardingUrl/api-users/$1;
  }
}

验证测试方案

  • 日志校验法:修改Nginx的access_log格式,添加$upstream_addr字段,每次请求都会打印实际转发的上游IP。修改配置重载Nginx后,第一次请求后记录日志中的IP,修改域名的解析记录后等待你设置的valid时间,再发请求看日志中的IP是否更新即可。
  • 本地DNS模拟法:在Nginx所在服务器上部署轻量DNS服务(比如dnsmasq),自定义测试域名的解析记录和TTL,将resolver指向本地DNS地址,修改本地DNS的解析记录后,观察Nginx请求的上游IP是否按预期更新,这种方式可以完全模拟真实场景,不受公网DNS缓存的影响。
  • 抓包校验法:在Nginx服务器上执行tcpdump -i any port 53抓DNS请求包,可直接观察到Nginx是否按设定的时间间隔主动发起域名解析请求。

内容的提问来源于stack exchange,提问作者theherk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:06:03