一、问题描述
在使用微信服务过程中(调用api.weixin.qq.com),经常会碰到如下这种问题:“java.net.UnknownHostException: api.weixin.qq.com: 未知的名称或服务”。如下图所示:
关键是这种问题不是必现,在Windows电脑上可能正常调用,但是部署到服务器(Linux系统)上却出现了,问题很难排查。查了好多方案都没有解决。最后通过不断分析实验,得出本文解决方法。
二、解决方案
Linux系统下的解决方案如下:
步骤1:找到resolv.conf配置文件
一般情况下此文件都会在 /etc/ 目录下
配置上如下内容:
> options timeout:1 attempts:1 rotate > #options single-request-reopen nameserver 119.29.29.29 nameserver 114.114.114.114 nameserver 180.76.76.76 nameserver 223.5.5.5
Tips:nameserver:dns服务器,分别采用了腾讯的、114的、百度的、阿里的dns服务器,总有一个是可行的。
步骤2:chattr + i /etc/resolv.conf
在有些Linux下,当网络重启后,/etc/resolv.conf会恢复到原来的状态。本命令是让文件编程只读。如果今后需要修改,用chattr -i /etc/resolv.conf
步骤3:vi /etc/sysconfig/network-scripts/ifcfg-eth0
删掉DNS1,DNS2参数,都用resolv.conf中的配置
步骤4:重新启动网络:service network restart
如果报错或者不生效,请找问题并重启网络
步骤5:可以用nslookup查看哪个DNS生效
三、参数说明
options 后面跟的是各种参数,每个参数意义如下:
timeout:设置等待dns服务器返回的超时时间,单位秒。默认值5。
attempts:向DNS服务器发起域名解析的请求次数。默认值2。采用多个dns服务器轮询
rotate:采用轮询方式访问nameserver
single-request-reopen:CentOS6/CentOS7总是需要等待AAAA(IPv6)的结果,即使关闭IPv6也没什么卵用。
CentOS 6/CentOS 7中的DNS解析器对于ipv4和ipv6都使用同一个socket接口,在同时发出ipv4和ipv6解析请求后,只会收到一个ipv4的解析响应,此时socket将一处于“等待”模式,等待ipv6的解析响应,故导致解析缓慢;添加single-request-reopen后就可以重新打开一个新的socket接收ipv6的解析响应,而不影响ipv4的解析响应。
四、补充说明
经验证关于 options single-request-reopen 配置在某些环境可以,但在某些环境下打开会导致错误如下:
java.net.UnknownHostException: www.xxxxx.com: 未知的名称或服务 at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
该种情况下,关闭该选项即可。
本文完结!