测试机域名不能访问ip却可以访问

最近在给测试机101.200.217.41 发送请求的时候碰到了问题。测试机的日志配置如下:Nginx服务器级别的日志:dev_error.log ,dev_access.log ;  Yii框架日志: request.log;

当我给dev.elliss.cn发送请求的时候,除了dev_access.log有日志记录外,其他两个大多数情况下没反应。

l 在app端看,appserver发送一个Get请求,希望获取 cookie 保存下来,但是总是获取失败。这就导致后续的请求由于请求数据不完整而不能被服务器验证;

l 从浏览器测试看,访问dev.elliss.cn也有问题,提示“暂时不能访问,可能网站需要备案”;

l 利用cmd ping 服务器的域名 dev.elliss.cn 也有问题,丢包率100%

解决思路:从server端的三个日志文件入手。首先看error.log中记录信息:

 

PHP message: PHP Warning:  Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/home/ileberry/session) in Unknown on line 0" while reading upstream, client: 122.72.53.12, server: dev.elliss.cn, request: "POST /r HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "dev.elliss.cn"

错误信息提示:会话信息写入 /home/ileberry/session 失败,可能是访问权限的问题。这个是PHP给我们提示消息,从php.ini 初始化文件入手:

session.save_path = "/home/ileberry/session"

上面指定了会话信息保存的位置,为了让该文件夹不再“拒绝”被写入,把文件夹以及里边的文件权限都改成 777 。测试了一下,还是出错。

 

2015/10/22 15:10:56 [error] 1741#0: *169 connect() failed (111: Connection refused) while connecting to upstream, client: 116.216.8.36, server: dev.elliss.cn, request: "POST /l HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "dev.elliss.cn"

这是error.log中的另一条可能帮助我解决问题的日志,网友的解释是:

It sounds like you haven't started and configured backend for Nginx. Start php-fpm and add the following to nginx.conf, in http context:

我试着重启php-fpm ,在我关闭php-fpm 后,果然又冒出了好多条以上的报错,开启之后就再也没有报错,所以上面的报错确实是和php-fpm 没有开启有关,但是没有帮助我解决目前的问题。

 

Error.log是指望不上了,这些报错都是好几天前的,我重新发送请求,error.log中并没有任何记录。那request.log呢?

试着在PHP的入口文件index.php中打印日志:

ob_start();

print_r($_POST);

$output = ob_get_clean();

\Yii::info("--------------------test cjw ".$output,__METHOD__);

Request.log中确实看到了我的日志,说明请求确实是进入了Yii框架当中被PHP处理了,不过$_POST一直是空的~~~

 

Request.log里边可以得到的线索也很有限,因为它总是接收不到日志记录,在接收到的异常日志中看,发现少了cookiepost请求也没有带上csrfToken ,我感觉是什么东西导致了请求端与server端无法建立正常的会话。

最后只能从 dev_access.log 入手了,每一次请求这里都有记录:

120.204.205.187 - - [23/Oct/2015:14:27:39 +0800] "GET / HTTP/1.1" 499 0 dev.elliss.cn "-" "DNSPod-Monitor/2.0" "120.204.200.21" 0.002 - 

日志的格式定义是在 nginx.conf 中配置的,从上面的日志文件可以看出状态码是499 ,请求页面大小是 0,这是解决问题的关键。

从网上搜索了一下499 ,这是nginx 自定义的异常,出现的原因可能是服务器处理的时间过长,客户端主动关闭了连接。也有说这个问题是 nginx 认为该连接不安全,从而限制了连接。解决的办法就是:

配置参数 proxy_ignore_client_abort on;表示代理服务端不要主要主动关闭客户端连接。

尝试了一下,重启了nginx,还是不行。

最后,尝试用浏览器访问服务器,结果竟然成功了~~~ 开始怀疑可能客户端和server端都没有错,是中间的某个环节出错了。为了验证想法,打开cmd ping ip地址,ping通了~~~ 那为什么域名访问出错,而ip访问正确呢?

脑补了一下输入url到访问到网页之间后台都干嘛了(以facebook为例)?

 

v  在浏览器中输入网址

v 浏览器查找域名的IP地址,导航的第一步是通过访问的域名找出其IP地址。(从浏览器缓存、系统缓存、路由器缓存、ISP DNS缓存中递归搜索)

v 浏览器给web服务器发一个HTTP请求(已经获取到了IP地址)

v facebook服务的永久重定向响应(把http://facebook.com/重定向到http://www.facebook.com/

v 浏览器跟踪重定向地址

v 服务器“处理”请求 ,涉及到Web服务器对除了ip地址以外的地址信息的解析(nginx,apache,IIS),映射到服务器上面的指定文件

v 服务器发挥一个HTML响应

v 浏览器开始显示HTML

v 浏览器发送获取嵌入在HTML中的对象(图片,CSS,JS),跟以上步骤类似

 

从上面可以看出,域名访问跟ip访问多了两个步骤,一个是通过缓存递归查找出DNS ,还有就是地址重定向的问题,我感觉问题就在这儿。可是又有说不通的地方,如果是DNS出问题了,那么server端根本不能通过域名访问到,也就是 dev_access.log 中不该出现日志。

 

到此已经不知道怎么办了,再次打开域名访问server,出现了如下网页:

 

原因:域名没在阿里云系统备案确用域名访问阿里云服务器~~~~~众里寻他千百度,暮然回首,那货却在灯火阑珊处。

 

总结:

第一:有问题要看日志,而且要很认真很系统的弄懂每一个关键的字段,你认为不重要的地方反而可能是解决问题的关键;

第二:百度上有很多报错可以参考,你需要弄懂的是该报错是什么意思,至于解决报错的方法,百度上面不一定适用;

第三:域名不能访问,可以试试看是否有其他方式可以替代域名访问?如果早点尝试ip访问,问题早就解决了。


版权声明:本文为mini_snail原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。