1分钟买不了吃亏系列: nginx动态域名解析

最近利用nginx做了一个反向网站, 转发请求到后端域名。

nginx.conf.template 三下五除二:

ini 复制代码
 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

yaml 复制代码
; <<>> 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.23
alb-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 动态解析域名:

ini 复制代码
http {
    resolver 114.114.114.114 valid=300s ipv6=off;
    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解析服务器地址和解析超时时间。

相关推荐
武子康1 分钟前
低延迟不是更快地猜:EOU / Barge-in / Turn Protocol 必须统一(4 种结束 + Generation Fencing + 9 类可复现场景)
人工智能·后端·llm
颜进强7 分钟前
Ollama 从入门到实践:本地模型运行、API 调用
前端·后端·ai编程
颜进强11 分钟前
Embedding 基础使用:用 Ollama 和 LangChain.js 生成文本向量
前端·后端·ai编程
颜进强15 分钟前
Vector Store 入门:什么是向量数据库,主流产品如何选择
前端·后端·ai编程
PH = 727 分钟前
SpringBoot使用自动装配编写Start包
java·spring boot·后端
canonical_entropy1 小时前
Mission Driver:Loop Engineering 的一种通用参考实现
后端·aigc·ai编程
一路向北North1 小时前
Spring AI(5) :对话机器人-会话记忆
java·后端·spring
CappuccinoRose1 小时前
Rust学习文档(二)
开发语言·后端·学习·rust
Dovis(誓平步青云)3 小时前
《如何在CentOS 7中添加Plex官方软件源:解决文件磁盘难管理难题》
linux·运维·服务器·后端·生成对抗网络·centos
IT_陈寒3 小时前
Python的线程池把我CPU跑满了,原来少传了个参数
前端·人工智能·后端