我有一台运行 apache2 和 PHP 的 Linux 服务器(Ubuntu 10.04)。从另一台 Linux 机器或 Mac 上的任何浏览器访问页面时,一切都运行良好。但是当我尝试从 Windows 机器和浏览器的任意组合访问页面时,页面返回之前大约有 30 秒的延迟。从 Windows 浏览器访问普通的旧 HTML 文件运行非常快。所以这似乎只是 PHP。MySQL 已安装,但不使用 MySQL 的简单测试页面仍然很慢。
我不认为这是 DNS,因为如果我在 URL 中硬编码 IP 地址,则不会发生任何变化。日志文件中似乎没有任何我能看出的东西。
什么原因导致 Windows 客户端出现此行为?
答案1
更新:一些“第三基础”的调试技巧;
进行一些调试的一个相当残酷的方法是 strace 正在运行的 apache 进程,这实际上更容易,因为进程将会挂起一段时间。
下面的命令仅当您的 apache 处于 prefork 模式时才会按所述工作,但我认为它在工作模式下的工作方式大致相同。(但您必须花费一些时间获取ps
并grep
找到线程 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
让页面请求在较慢的 windows 框上运行,然后将所有输出粘贴回粘贴箱并将链接放在评论中。
如果您对此不满意,请打开 php 和 httpd Loglevel 的调试以进行调试,并将所有内容粘贴到 pastebin 中并提供链接......
编辑:(好吧,也许不一定)可能是 Apache 服务器上存在反向 DNS 问题。请尝试以下操作......
确保您已HostnameLookups Off
在 apache 服务器上进行设置。
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
使用 dig 测试名称服务器;
[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 命令行工具进行检查)并且服务器端没有明显的问题,那么我会使用 Google Chrome 内置的开发人员工具来查看页面加载的时间线。
这会告诉您页面中的哪个项目花费了这么长时间,以及延迟是在连接期间还是在资源加载期间等。
您可以继续使用 wget、cygwin 中的 curl 或普通 telnet 等工具从客户端进行进一步调查。