最近同事说,放置在阿里云的一台服务器上的网站登录后台及前端接口调用都很缓慢,一直没找到原因,让我上去看看。解决完了之后,发现问题确实有点少见,这里留个记录,希望能帮到遇到同样问题的朋友。
首先,响应缓慢具体来说就是,登录后台需要等待很久才能加载完毕,前端微信下单支付也要很久才能完成回调。
SSH上去之后,先是检查了可用内存、负载、磁盘、CPU以及宽带占用这些,发现这些占用都不高,系统资源还很充足,可以确定,不是服务器资源不足导致的。
然后是检查PHP的慢日志,发现了一些信息:
[18-Sep-2018 11:19:55] [pool www] pid 21316
script_filename = /path/to/file/seller.php
[0x00007f89e743c140] curl_exec() /path/to/file/Common/function.php:1097
看日志,我猜可能是由于curl调用第三方服务器资源导致的,查看代码,发现确实是有相关的调用,因为涉及到公司代码,代码我就不贴了,只说说解决过程。
拿到对应的代码之后,打印出实际的请求地址,想手动访问试试,但是发现,即使是手动访问,结果还是要好久才出来,但是本地访问却很快就能得到结果,不像是对方服务器挂了。
于是打算到服务器上看看具体解析到的是哪个IP,dig命令一下果然发现问题了,以本站域名来说:
root@xxxx:~# dig zocodev.com
; <<>> DiG 9.10.3-P4-Ubuntu <<>> zocodev.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17960
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;zocodev.com. IN A
;; ANSWER SECTION:
zocodev.com. 600 IN A 111.231.230.249
;; Query time: 38 msec
;; SERVER: 223.5.5.5#53(223.5.5.5)
;; WHEN: Thu Sep 20 10:57:19 CST 2018
;; MSG SIZE rcvd: 45
real 0m21.011s
user 0m0.004s
sys 0m0.004s
解析个域名就花了20多秒,怎么可能不慢。
于是看了下resolv.conf文件,发现里面默认就是两个10开头的内网IP地址,我猜应该是阿里云系统模板自带的内网DNS解析IP:
root@xxxx:~# cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.143.22.118
nameserver 10.143.22.116
options timeout:2 attempts:3 rotate single-request-reopen
然后在服务器上ping了下这两个内网IP,发现两个IP都ping不通,这就很尴尬了。
然后上网搜了一把,发现10.143.22.118和10.143.22.116这两个DNS服务器根本就不是服务器所在深圳区域的DNS解析服务器,网上倒是有相关信息显示这两个IP是杭州、香港、美国的。
我就好奇了,怎么阿里这种大公司,会出这种低级错误?这么把DNS给搞错了,和域名相关的服务几乎都会受影响,阿里云也是够了。
解决办法也很简单,更改下默认的DNS解析IP就行:
vim /etc/resolvconf/resolv.conf.d/tail
nameserver 100.100.2.138
nameserver 100.100.2.136
改这两行就好了。
PS:网上收集了下阿里云相关内网DNS解析IP:
青岛:
10.202.72.116
10.202.72.118
杭州:
10.143.22.116
10.143.22.118
上海:
100.100.2.136
100.100.2.138
香港:
10.143.22.116
10.143.22.118
美国:
10.143.22.116
10.143.22.118
北京:
10.202.72.116
10.202.72.118
深圳:
100.100.2.138
100.100.2.136
新加坡:
100.100.2.136
100.100.2.138
设置之前建议先用dig命令测试一下该IP是否可用,命令如下:
dig zocodev.com @100.100.2.138