Apache2とPHPを実行しているLinuxサーバー(Ubuntu 10.04)があります。別のLinuxマシンまたはMacから任意のブラウザからページにアクセスすると、すべてが正常に実行されます。しかし、Windowsマシンとブラウザの任意の組み合わせからページにアクセスしようとすると、ページが戻るまでに約30秒の遅延が発生します。 Windowsブラウザからプレーンな古いHTMLファイルにアクセスすると、lickitysplitが実行されます。つまり、PHPだけのようです。 MySQLはインストールされていますが、MySQLを使用しない単純なテストページはまだ遅いです。
URLにIPアドレスをハードコーディングしても何も変わらないので、DNSではないと思います。ログファイルには私が知ることができるものは何もないようです。
Windowsクライアントでこの動作を引き起こす原因は何ですか?
更新:いくつかの「第3ベース」のデバッグのヒント。
デバッグを行うためのかなり残酷な方法は、実行中のApacheプロセスをstraceすることです。これは、プロセスがしばらくハングするため、実際には簡単です。
以下のこのコマンドは、Apacheがプリフォークモードの場合にのみ機能しますが、ワーカーモードでもほぼ同様に機能すると思います。 (ただし、スレッドIDを見つけるにはps
とgrep
の取得に時間をかける必要があります...)とにかく、phpにはプリフォークが必要だと思います...
まず、サーバーがプリフォークモードになっていることを確認します...
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
遅いウィンドウズボックスでページリクエストを実行し、その出力をすべて Pastebin に貼り付けて、リンクをコメントに入れます。
これに満足できない場合は、phpのデバッグとhttpd Loglevelをオンにして、すべてをデバッグして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
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(google public dns server)に変更して、機能させる
/ etc/resolve.conf
nameserver 8.8.8.8
nameserver 8.8.8.4
Php.logファイルとApacheログファイルで接続が遅いかどうかを確認することから始めます。問題はログにある可能性があります。
ただし、これがDNSの問題ではなく(nslookupコマンドラインツールを使用して確認できます)、サーバー側に明らかなものがない場合は、google chrome in-built」を使用します。ページ読み込みのタイムラインを確認するための開発者ツール。
これにより、ページ内のどの項目に非常に時間がかかっているか、遅延が接続中か、リソースの読み込み中かなどがわかります。
Wget、curl in cygwin、またはプレーンtelnetなどのツールに移動して、クライアント側からさらに調査することができます。