- 错误预览
- DNS
- 分析原因
- 1,DNS设置问题
- 2,防火墙与端口开放问题
- 3,DNS缓存服务nscd问题
- NSCD
- 结果
可ping IP地址但无法直接ping域名。初步确定为服务器的域名解析有问题,无法正确的访问DNS服务器,来解析域名。
ping api.weixin.qq.com
[root@iZv61ak4bj68kuZ ~]# ping api.weixin.qq.com ping: unknown host api.weixin.qq.com
ping 140.207.135.108
[root@iZv61ak4bj68kuZ ~]# ping 140.207.135.108 PING 140.207.135.108 (140.207.135.108) 56(84) bytes of data. From 140.207.73.25 icmp_seq=26 Packet filtered ^Z [1]+ Stopped ping 140.207.135.108DNS
DNS(Domain Name System)是域名解析服务器的意思,它在互联网的作用是把域名转换成为网络可以识别的IP地址。当用户在浏览器中输入网址域名时,首先就会访问系统设置的DNS域名解析服务器(通常由ISP运营商如电信、网通提供)。如果该服务器内保存着该域名对应的IP信息,则直接返回该信息供用户访问网站。否则,就会向上级DNS逐层查找该域名的对应数据。
分析原因 1,DNS设置问题检查服务器是否正确的设置了DNS服务器,即查看vim /etc/resolv.conf 文件是否有DNS服务器的IP地址,它是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序。默认的DNS服务器的IP地址是电信运营商的DNS服务器,目前国内电信运营商普遍采用DNS劫持的方法,干扰用户正常上网。
Google为他们的DNS服务器选择了两个非常简单易记的IP地址:“8.8.8.8”和“8.8.4.4”。用户只要在系统的网络设置中选择这两个地址为DNS服务器即可。
[root@iZv61ak4bj68kuZ ~]# vim /etc/resolv.conf
nameserver 8.8.8.8 nameserver 8.8.4.4
再重启网络服务
[root@iZv61ak4bj68kuZ ~]# service network restart2,防火墙与端口开放问题
在阿里云服务器控制台查看安全组,是否http和https端口开放。
我们再来检查防火墙iptables,看看是否有拦截端口的相关规则。可以输入下面的命令关闭防火墙,进行对比测试。
service iptables stop
如果存在iptables规则,则尝试删除DENY策略或修改规则为ACCEPT策略。
3,DNS缓存服务nscd问题在最终的检查过程中,我所遇到的问题便是nscd缓存服务问题。
NSCDNSCD(name service cache daemon)是GLIBC关于网络库的一个组件,配置文件为/etc/nscd.conf,服务基于glibc开发的各类网络服务,基本上来讲我们能见到的一些编程语言和开发框架最终均会调用到glibc的网络解析的函数(如GETHOSTBYNAME or GETHOSTBYADDR等),因此绝大部分程序能够使用NSCD提供的缓存服务。当然如果是应用端自己用socker编写了一个网络client就无法使用NSCD提供的缓存服务,比如DNS领域常见的dig命令不会使用NSCD提供的缓存,相反ping得到的DNS解析结果将使用NSCD提供的缓存。
在需要通过域名与外界进行数据交互的时候,dns缓存就派上用场了,它可以减少域名解析的时间,提高效率。例如以下情况
- 使用爬虫采集网络上的页面数据,
- 使用auth2.0协议从其他平台(如微博或QQ)获取用户数据,
- 使用第三方支付接口,
- 使用短信通道下发短信等。
开启NSCD DNS缓存服务的优点和缺点:
- 优点
本地缓存DNS解析信息,提供解析速度。
DNS服务挂了也没有问题,在缓存服务时间范围内,解析依旧正常。 - 缺点
DNS解析信息会滞后,如域名解析更改需要手动刷新缓存,NSCD不适合做实时的切换的应用,目前对于依赖DNS切换的服务,建议不要开启DNS缓存。DNS Cache作为普通的DNS解析Cache那是没问题的,如果你使用RDS云服务器,也不建议使用DNS缓存服务。
在解析超时或者出错时,这个服务会导致一些很难发现的错误。当解析超时没有得到结果时,nscd将依据negative-time-to-live参数缓存一段时间,导致后续一段时间的请求都直接被nscd返回失败应答,导致程序没有机会重新去尝试向远端的DNS服务器解析。
当dns解析失败时,对失败结果做缓存也不是毫无道理,这是避免dns雪崩的一种手段,但是可能这个配置并不适合大多数人,我们希望的还是失败后下一次解析可以重新执行,而不是继续得到一个nscd缓存的失败结果。
NSCD命令选项
$ nscd --help
用法: nscd [选项...]
Name Service Cache Daemon.
-d, --debug Do not fork and display messages on the current
tty
-f, --config-file=名称 从NAME中读取配置数据
-g, --statistics Print current configuration statistics
-i, --invalidate=TABLE Invalidate the specified cache
-K, --shutdown 关闭服务器
-t, --nthreads=NUMBER 启动 NUMBER 个线程
-?, --help 给出该系统求助列表
--usage 给出简要的用法信息
-V, --version 打印程序版本号
长选项的强制或可选参数对对应的短选项也是强制或可选的。
For bug reporting instructions, please see:
.
NSCD配置文件
NSCD配置文件为/etc/nscd.conf,NSCD程序在启动的时候会读取/etc/nscd.conf文件,每一行指定一个属性和对应的值,或者指定一个服务和对应的值,#表示注释。有效的服务设定是:passwd, group, hosts, services, or netgroup五个。
#设置日志文件 logfile debug-file-name #设置debug记录的级别,默认是0 debug-level value #程序启动时,等待进去请求的处理线程数,至少5个 threads number #最大线程数,默认32 max-threads number #nscd程序以哪个用户运行,如果设置了该选项,nscd将作为该用户运行,而不是作为root。如果每个用户都使用一个单独的缓存(-S参数),将忽略该选项。 server-user user #哪个用户可以请求统计用户 stat-user user #在一个缓存项被删除之前允许使用的次数,默认是5 reload-count unlimited | number #是否启用偏执模式,启用会导致nscd周期性重启,默认是no paranoia#如果启用偏执模式,设置的定期重启nscd的时间间隔,默认是3600秒 restart-interval time #开启或者关闭服务缓存,默认是no enable-cache service #为成功请求的元素设置缓存TTL,单位是秒,值越大缓存命中率越高,降低平均响应时间,但会增加缓存的一致性问题 positive-time-to-live service value #为失败查询元素设置缓存TTL,单位是秒,应保持小值,减小缓存一致性问题 negative-time-to-live service value #内部的散列表大小,value应该保持一个素数以达到优化效果。默认值是211 suggested-size service value #启用或者禁用检查文件是否属于指定的服务,这些文件是/etc/passwd、/etc/group、/etc/hosts、/etc/services、/etc/netgroup等 check-files service #设置缓存在服务器重启后,仍旧能提供缓存服务,在使用偏执模式时有用,默认是no persistent service #为客户端共享nscd数据库在内存中做的映射,使客户端可以直接搜索,而不用每次都查询守护进行,默认是no shared service #该数据库的最大大小,单位是bytes,默认是33554432 max-db-size service bytes #此选项仅使用于passwd和group服务 auto-propagate service
NSCD服务查看和清除
NSCD缓存DB文件在/var/db/nscd下。可以通过nscd -g查看统计的信息,这里列出部分:
$ nscd -g
nscd 配置:
0 服务器调试级别
4s server runtime
5 current number of threads
32 maximum number of threads
0 number of times clients had to wait
no paranoia mode enabled
3600 restart internal
5 reload count
... 省略输出信息若干 ...
hosts cache:
yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
0 used data pool size
60 seconds time to live for positive entries
20 seconds time to live for negative entries
0 cache hits on positive entries
0 cache hits on negative entries
0 cache misses on positive entries
0 cache misses on negative entries
0% cache hit rate
0 current number of cached values
0 maximum number of cached values
0 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/hosts for changes
... 省略输出信息若干 ...
清除指定类型缓存
$ nscd -i passwd $ nscd -i group $ nscd -i hosts
除了上面的方法,重启NSCD服务同样可以达到清理Cache的目的。–本人验证无效~
所有要么清除缓存,要么直接关闭NSCD服务,NSCD域名解析大概率就能够成功。
关闭NSCD服务
[root@iZv61ak4bj68kuZ ~]# service nscd stop Stopping nscd: [ OK ]结果
通过以前方法进行排除后,已经可以正确的解析域名了。
[root@iZv61ak4bj68kuZ ~]# ping api.weixin.qq.com PING api.weixin.qq.com (101.91.34.103) 56(84) bytes of data. 64 bytes from 101.91.34.103: icmp_seq=1 ttl=51 time=6.10 ms 64 bytes from 101.91.34.103: icmp_seq=2 ttl=51 time=6.10 ms 64 bytes from 101.91.34.103: icmp_seq=3 ttl=51 time=6.11 ms 64 bytes from 101.91.34.103: icmp_seq=4 ttl=51 time=6.10 ms 64 bytes from 101.91.34.103: icmp_seq=5 ttl=51 time=5.92 ms 64 bytes from 101.91.34.103: icmp_seq=6 ttl=51 time=5.94 ms 64 bytes from 101.91.34.103: icmp_seq=7 ttl=51 time=6.10 ms 64 bytes from 101.91.34.103: icmp_seq=8 ttl=51 time=5.93 ms ^Z [2]+ Stopped ping api.weixin.qq.com



