linux下ping、nslookup均正常但是在php环境下gethostname却无法解析出ip
1月30日晚,收到了glibc漏洞的通知,马上进行服务器更新,手上有五台linux服务器,很顺利每个没用2分钟就更新完了,收拾电脑,上传睡觉!
第二天是周六,一早还没睡醒就接到了电话,discuz论坛竟然无法登录。。。。。。马上开电脑进行检查,原来是dns的问题,检查了/etc/resolv.conf文件,nameserver配置没有问题,
检查了netstat -rn,也未发现异常。
检查:/etc/nsswitch.conf
其中host 配置的是host dns
这个也没有问题,ping ip可以通,nslookup 域名也不行。一律都报unknown host,连localhost也是这样报,抓狂呀!
查看网卡未发现异常,使用service network restart 终于发现了些问题,有个启动时报了类似file exist的错误,发现可能是nscd(网上有说是networkmanage服务)服务的问题,关闭服务,重启linux服务器,操作系统内终于可以正常的ping、nslookup了。本以为问题到此已经解决完毕,这时朋友告知论坛的微博登录等功能还是不好用,我测试发现确实不好用,查看论坛后台, 发现php中竟然还是无法获取域名的ip。。。。
于是自己写了一个简单的php文件进行测试,testdns.php,内容如下:
<?php
echo(gethostbyname('www.hongxuejing.com'));
?>
使用浏览器访问,竟然直接输出的是www.hongxuejing.com
修改文件为如下内容:
<?php
echo(gethostbyname('www.hongxuejing.com'));
echo(gethostbyname2('www.hongxuejing.com'));
function gethostbyname2($host, $timeout = 3) {
$query = `nslookup -timeout=$timeout -retry=1 $host`;
//$query=`ping www.baidu.com -c 3`;
// return $query;
if(preg_match('/ Address: (.*) /', $query, $matches))
return trim($matches[1]);
return $query;
}
?>
竟然依然返回的都是www.hongxuejing.com
在linux shell环境下执行测试一下:
/usr/loca/php/bin/php testdns.php
竟然两种方式均可以正常解析出域名,网上各种搜索倒是有几个这种情况的,都没有找到解决办法,或者更换了系统或者就无后续说明了。自己一步一步慢慢折腾,网上有提到可能是lib的问题,无奈我这个linux下根本没有类似libnss***的so,看来不是lib的问题了。不过有一点可以确定既然shell下可以,php服务下不可以(使用的php-fpm,由nobody用户执行),那十有八九也是权限问题,肯定是nobody执行的php-fpm无法执行nslookup方法用到的lib,顺着这个思路,给有相关lib的地方增加任意用户的读取权限,高兴的事终于发生,php终于恢复正常,可以正常解析域名了!
不过排查是哪个比较麻烦,这个有耐心的就逐个目录尝试吧,没耐心的就直接所有目录(chmod -R a+r /*)增加可读权限吧(之后需要再执行chmod a-r /etc/ssh/ssh_host_rsa_key,否则会造成ssh的服务无法启动,无法正常连接服务器),非常不推荐所有目录加可读。
- linux安装pcre库(8.44)(2021-01-27)
- linux下编译memcached(1.4.24)报错的解决(2016-04-28)
- 阿里云等linux云主机设置swap空间的方法(2016-01-31)
- 在阿里云linux 15.1 64位系统编译安装mysql 5.7.10(2016-01-30)
- 64位linux下载与安装cmake(2016-01-30)
- 卸载aliyun linux 15预装的java运行环境openjdk 1.6(2016-01-30)
- linux下安装memcached(1.4.24)服务(2015-09-09)
- aliyun linux配置vsftpd及配置iptables允许连接(2015-03-11)
- aliyun linux 5.7配置使用rsync和inotify实现集群配置时文件的自动同步(2015-03-07)
- 阿里云linux环境安装squid做正向代理服务(2015-02-28)