最近发现某台 NGINX 服务器执行 nginx -t 的时候返回结果非常慢,其他机器非常快,今天决定解决一下,遂用 strace 打印了 nginx -t 执行时的系统调用,抓出来了几个慢的系统调用,类似于 https://i.v2ex.co/rvO8s03v.png 这种,然后我尝试在执行 nginx -t 的同时,循环执行 lsof -d 5 观察到了 NGINX 一直在连接 pdns.dnspod.cn 这个域名,查看了 resolve.conf ,确实首个配置是 nameserver 119.29.29.29 ( dnspod ),第二个是 nameserver 223.5.5.5 (阿里),对调了两者在配置文件中的位置后,nginx -t 变得非常快。现在有两个疑问,第一是为啥 nginx -t 的时候要去测试 DNS ?第二个就是为什么我在 /etc/resolve.conf 中明明写的是 IP 地址( 119.29.29.29 ),nginx 会解析到 pdns.dnspod.cn 这个域名呢?而且 pdns.dnspod.cn 解析出的 IP 也并不是 119.29.29.29 。
1
wy315700 2022-03-10 17:46:03 +08:00
DNS 反向解析
$ dig -x 119.29.29.29 ; <<>> DiG 9.11.26-RedHat-9.11.26-4.el8_4 <<>> -x 119.29.29.29 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15379 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: 40642852c08e1596 (echoed) ;; QUESTION SECTION: ;29.29.29.119.in-addr.arpa. IN PTR ;; ANSWER SECTION: 29.29.29.119.in-addr.arpa. 39637 IN PTR pdns.dnspod.cn. ;; Query time: 6 msec ;; SERVER: 119.29.29.29#53(119.29.29.29) ;; WHEN: Thu Mar 10 17:45:43 CST 2022 ;; MSG SIZE rcvd: 94 |
2
zhoudaiyu OP 但是为啥要反向解析呢?我都写的是 IP 啊
|
3
salmon5 2022-03-10 17:50:06 +08:00 1
nginx -t 会检测并缓存 proxy_pass 后的域名对应的 IP ,这里需要调用 DNS
|
4
salmon5 2022-03-10 17:53:48 +08:00 1
nginx 调用 DNS 直接连的是 IP ,lsof -d 5 对外连的 DNS 进行了反向解析,可以 lsof -d 5 -n 就是 IP 了。
|
5
zhoudaiyu OP @salmon5 #4 大佬,你说的对,加了-n 确实就不反向解析了,但是还有一点疑问,我看了一下 strace ,当时很多都是通过 dnspod 解析超时了,然后换了第二个位置的阿里 dns 解析出了 IP ,可是当时抓了一下包,看了确实可以用 dnspod 去解析域名的,所以还是觉得有点奇怪。
|
6
watcher 2022-03-11 10:31:02 +08:00
lsof 本着一切皆文件的原则 肯定优先展示的不是网络地址而是主机号然后会调用 gethostbyaddr
|