[macOS] 多播DNS服务器(MDNS)导致本地HTTP请求阻塞5秒钟问题的解决办法

陪她去流浪 桃子 2018年07月18日 阅读次数:5162

今天在 macOS 上发现一个奇怪的现象:访问搭建在本地的HTTP服务在连接时异常缓慢,大概5秒钟左右。

我已经在/etc/hosts文件中配置了本地域名:

127.0.0.1       phpmyadmin.local

在 nginx 里面是这样的:

1
2
3
4
5
server {
    listen      80;
    server_name phpmyadmin.local;
    return      200 'ok';
}

然后用 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。

packets.png

  • 从第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 文件的格式到底是怎样的?我以前见过这样写的,但是不知道这样写的目的是啥。

标签:nginx · macOS · MDNS