今天在 macOS 上发现一个奇怪的现象:访问搭建在本地的HTTP服务在连接时异常缓慢,大概5秒钟左右。
我已经在/etc/hosts
文件中配置了本地域名:
127.0.0.1 phpmyadmin.local
在 nginx 里面是这样的:
1 2 3 4 5 |
|
然后用 curl 在本地发起请求:
$ date && time curl -v phpmyadmin.local
Wed Jul 18 22:30:41 CST 2018
* Rebuilt URL to: phpmyadmin.local/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to phpmyadmin.local (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: phpmyadmin.local
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.15.0
< Date: Wed, 18 Jul 2018 14:30:47 GMT
< Content-Type: application/octet-stream
< Content-Length: 2
< Connection: keep-alive
<
* Connection #0 to host phpmyadmin.local left intact
ok
real 0m5.548s
user 0m0.006s
sys 0m0.005s
可以看到,real 时间是 5.5 秒,几乎每次都是如果,非常接近。
并且从 date 时间 22:30:41 CST
与 nginx 的时间 14:30:47 GMT
来看,大概是 6 秒钟。
也就是说,nginx 「花」了 5 秒钟的时间来处理这个请求。至于是不是nginx的原因,暂时我没办法知道。于是抄起了 WireShark。
- 从第7行(绿色开始行)可以看到,此时
SYN
包才真正发送。而此时的时间是 5.5 秒,正好是请求被阻塞的时间; - 而在这之前,有一个「莫名其妙」的
MDNS
协议耽搁了大概5秒钟。是在干嘛了呢??
在维基百科上查了一下这个MDNS,多播DNS。这玩意儿大概是用来在小型的网络不依靠域名服务器(DNS)进行域名解析的一种手段。
网上也有不少人遇到这个问题,而且表现非常相似。而且是在 macOS 上出现得多。为什么?因为 macOS 要和 iPhone、iPad 进行一些服务通信,比如设备发现。而且是默认运行的。
解决办法可以参考这里:php - Mac OS X slow connections - mdns 4-5 seconds - bonjour slow - Stack Overflow,但这个问题不一定是这个原因造成的。
我参看一楼的回答解决了。
把 /etc/hosts
文件改成了下面这样:
127.0.0.1 localhost phpmyadmin.local
注意:是在原来的基础上中间加入一段localhost
,而不是把localhost
那一行和phpmyadmin.local
两行合并。
至此,问题得以解决。
话说,hosts 文件的格式到底是怎样的?我以前见过这样写的,但是不知道这样写的目的是啥。