web-dev-qa-db-ja.com

Linux PHP WindowsブラウザからアクセスするとWebサーバーがひどく遅い

Apache2とPHPを実行しているLinuxサーバー(Ubuntu 10.04)があります。別のLinuxマシンまたはMacから任意のブラウザからページにアクセスすると、すべてが正常に実行されます。しかし、Windowsマシンとブラウザの任意の組み合わせからページにアクセスしようとすると、ページが戻るまでに約30秒の遅延が発生します。 Windowsブラウザからプレーンな古いHTMLファイルにアクセスすると、lickitysplitが実行されます。つまり、PHPだけのようです。 MySQLはインストールされていますが、MySQLを使用しない単純なテストページはまだ遅いです。

URLにIPアドレスをハードコーディングしても何も変わらないので、DNSではないと思います。ログファイルには私が知ることができるものは何もないようです。

Windowsクライアントでこの動作を引き起こす原因は何ですか?

1
Ed Harcourt

更新:いくつかの「第3ベース」のデバッグのヒント。

デバッグを行うためのかなり残酷な方法は、実行中のApacheプロセスをstraceすることです。これは、プロセスがしばらくハングするため、実際には簡単です。

以下のこのコマンドは、Apacheがプリフォークモードの場合にのみ機能しますが、ワーカーモードでもほぼ同様に機能すると思います。 (ただし、スレッドIDを見つけるにはpsgrepの取得に時間をかける必要があります...)とにかく、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などのツールに移動して、クライアント側からさらに調査することができます。

enter image description here

1
Tom H