我有一个运行apache2和PHP的Linux服务器(Ubuntu 10.04)。 从另一台Linux机器或Mac的任何浏览器访问页面时,一切正常。 但是当我尝试从Windows机器和浏览器的任何组合中访问一个页面时,在页面返回之前,我得到了大约30秒的延迟。 从Windows浏览器访问一个普通的旧HTML文件运行lickity拆分。 所以它似乎只是PHP。 MySQL已经安装,但是一个简单的不使用MySQL的testing页仍然很慢。
我不认为这是DNS,因为如果我硬编码在URL中的IP地址没有任何变化。 我可以告诉的日志文件中似乎没有任何东西。
什么可能导致Windows客户端上的这种行为?
更新:一些“第三基地”debugging技巧;
进行一些debugging的一个相当残酷的方法是对运行的apache进程进行压缩,而这实际上更容易,因为这些进程将被挂起一段时间。
下面的这个命令只有在你的apache处于prefork模式的情况下才能正常工作,但是我认为它在工作模式下会有相似的效果。 (但是你将不得不花费一些时间得到一个ps和grepfind线程ID …)无论如何,我认为PHP需要prefork …
首先检查服务器是prefork模式…
root@server-72839:/home/ubuntu# apachectl -V | grep MPM Server MPM: Prefork <----------- prefork mode works with php -D APACHE_MPM_DIR="server/mpm/prefork"
安装strace
root@server-72839:/home/ubuntu# apt-get install strace
向服务器发出一些请求,然后运行以下命令来跟踪挂起进程所产生的系统调用;
root@server-72839:~# netstat -antp | grep "ESTABLISHED" | grep 80 | while read _ _ _ _ client _ proc; do strace -f -p ${proc#/*} & done root@server-72839:~# Process 21570 attached - interrupt to quit restart_syscall(<... resuming interrupted call ...>) = 0 chdir("/") = 0 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fabb16b0000 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fabb16ae000
让页面请求在缓慢的windoze框中运行,然后将所有的输出粘贴到pastebin中 ,并将链接放在注释中。
如果你对此没有任何喜悦,那么打开php的debugging,然后httpd Logleveldebugging并粘贴到一个pastebin,并提供链接….
编辑:(确定也许不是绝对)可能是在Apache服务器上的反向DNS问题。 尝试以下….
确保你已经在你的apache服务器上设置了HostnameLookups Off 。
http://httpd.apache.org/docs/2.2/mod/core.html#hostnamelookups
还要检查你的resolv.conf是否指定了工作名称服务器;
[root@workstation001 /root]# cat /etc/resolv.conf .... nameserver 192.168.1.254 <---- this must work. test it with dig
用digtesting域名服务器;
[root@workstation001 /root]# dig @192.168.1.254 www.google.co.uk +short www-cctld.l.google.com. 173.194.67.94
使名称服务器工作,通过将其更改为8.8.8.8(谷歌公共DNS服务器)
在/etc/resolv.conf
nameserver 8.8.8.8 nameserver 8.8.8.4
首先检查php.log和apache日志文件,查看缓慢的连接,问题可能在日志中。
但是,如果您确定这不是一个DNS问题(您可以使用nslookup命令行工具来检查),并且没有明显的服务器端,那么我会使用谷歌浏览器内置的开发人员工具来查看页面的时间线加载。
这会告诉你页面中的哪个项目需要这么长时间,以及延迟是在连接期间还是在资源加载期间等等。
您可以继续使用wget,curg in cygwin或简单的telnet工具来进一步从客户端进行调查。
