欢迎访问鸿雪径,这里介绍软件相关技术、动态以及鸿雪径杂谈,如有技术合作请与站长联系!邮费网 易食烤吧 特产大全网
首页 > Linux/Unix > linux下ping、nslookup均正常但是在php环境下gethostname却无法解析出ip

linux下ping、nslookup均正常但是在php环境下gethostname却无法解析出ip

发布时间:2015-02-04 作者: 点击:757

   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,ping,nslookup,php,gethostname 的信息
本站部分文章转载于网上,版权归原作者所有。如果侵犯您的权益,请Email和本站联系!
鸿雪径 www.HongXueJing.com  冀ICP备07017673号-4