分钟买不了吃亏系列: nginx动态域名解析
nginx.conf.template 三下五除二server {listen 80;location /api/asset/upload/ {proxy_pass https://asset.zlhub.com;proxy_set_header X-Track-Id $request_id;proxy_set_header Content-Type $content_type;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_ssl_server_name on;proxy_ssl_verify off;}}运行几个星期后出现持续的504超时。直连后端域名 没有问题 请求日志中的后端服务器ip 报超时错误。再次针对该域名做DNS解析 dig 114.114.114.114 asset.zlhub.cn; DiG 9.18.24-0ubuntu5-Ubuntu 114.114.114.114 asset.zlhub.cn; (1 server found);; global options: cmd;; Got answer:;; -HEADER- opcode: QUERY, status: NOERROR, id: 54487;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 512;; QUESTION SECTION:;asset.zlhub.cn. IN A;; ANSWER SECTION:asset.zlhub.cn. 476 IN CNAME alb-bd91a9vsooow8dv40otdle5l.cn-beijing.volcenginealb.com.alb-bd91a9vsooow8dv40otdle5l.cn-beijing.volcenginealb.com. 305 IN A 115.191.51.23alb-bd91a9vsooow8dv40otdle5l.cn-beijing.volcenginealb.com. 305 IN A 124.174.10.94;; Query time: 8 msec;; SERVER: 114.114.114.114#53(114.114.114.114) (UDP);; WHEN: Wed Jul 01 14:52:56 CST 2026;; MSG SIZE rcvd: 146发现域名asset.zlhub.cn对应的IP已经发生变化 nginx依旧使用原始ip发起请求于是超时。这才回想起proxy_pass 中如果配置的是域名地址Nginx 只有在 start / restart / reload 时才会连接一次域名服务器解析域名缓存解析的结果后续则不会根据解析结果的 TTL 进行自动更新”如果遇到了域名地址配置有多个 IP 且还在动态变化那就会出现 Nginx 把请求转发到一个过期的 IP 地址的情况产生连接超时的报错信息。nginx开源版本实现动态DNS服务发现nginx 动态解析域名http {resolver 114.114.114.114 valid300s ipv6off;resolver_timeout 10s;upstream backend {server backend1.example.com resolve;server backend2.example.com resolve;}server {location / {proxy_pass http://backend;}}}核心的是resolver指令 和resolver_timeout, 设置nginx的DNS解析服务器地址和解析超时时间。这还没完① 以上nginx配置nginx发起的代理请求的hostbackend, 这在共享的网关服务上会通过server_name 匹配“backend”字符串找不到会报503 Service Temporarily Unavailable, 所以我们还需要在nginx转发请求的时候强制让host等于原始域名proxy_set_header Host asset.zlhub.cn;② 本次我们的后端服务是强制https 我们除了proxy_pass https://backend 之后 在upstream backend要指定端口 server backend2.example.com:443 resolve;完整的配置如下resolver 114.114.114.114 valid30s;upstream backend {zone backend_dynamic 64k;server asset.zlhub.cn:443 resolve;}server {listen 80;error_log /dev/stderr debug;location /api/asset/upload/ {proxy_pass https://backend;proxy_set_header X-Track-Id $request_id;proxy_set_header Content-Type $content_type;proxy_set_header Host asset.zlhub.cn;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_ssl_server_name on;proxy_ssl_verify off;}}# 如果修改了nginx 模板文件 需要使用docker compose up -d --force-recreate上图左侧发起请求右侧tcpdump抓包显示 nginx发起了对于 asset.zlhub.cn主机的请求。