web-dev-qa-db-ja.com

Apacheは、ローカルホストよりもローカルエリアネットワーク上の他のコンピューターで低速です。

ネットワークに接続されているコンピューターがほとんどありません。そのネットワーク内にWAMPをホストするサーバーがあります(Windows + Apache + PHP + MySQL)。Windows7x32Proがインストールされています。ワイヤレス接続されたサーバーからそのサーバーにpingを実行できます。すべてpingは1ミリ秒です。興味深いことに、サーバー自体でWebアプリケーションを参照すると、瞬く間に読み込まれます。切り替えたばかりの画像のようにサブページを閲覧できます。

ただし、他のコンピューターでは動作が遅くなります。悲劇的ではありませんが、著しく遅くなります。場合によっては、ブラウザに「待機中…」と表示されますが、これには1〜2秒かかりますが、これが最も苦痛です。

リモートデスクトップ経由で接続しているときに、他のどのコンピューターよりもサーバーでアプリケーションを使用する方がはるかに高速であることがわかりました。私がそれらに同じ効果を得ることができれば、それは素晴らしいでしょう。

chromeで開発者コンソールを調べると、次のことがわかります。DOMContentLoadedは、サーバーでは400〜600ミリ秒、他のすべてのコンピューターでは1400ミリ秒です。

その状況で私は何ができますか?

3
Dawid

ApacheでHostnameLookupsがOffに設定されていることを確認してください。

サーバーがWAMP(Windows版のLAMP)セットアップを介してApacheを実行しているとおっしゃっていますか?その場合は、httpd.confまたはApache2.confを開いて(すべてセットアップでのインストール方法によって異なります。どちらのファイルも基本的に同じです)、HostnameLookupsが含まれる構成行を探します。デフォルトでは、HostnameLookupsOffに設定されています。これは、そのファイルのHostnameLookups設定のすぐ上にあるはずのコメントで説明されています。大胆な強調は私のものです:

HostnameLookups:クライアントの名前またはIPアドレスのみをログに記録します(例:www.Apache.org(オン)または204.62.129.132(オフ))。 デフォルトはオフです。これを有効にすると、各クライアントリクエストの結果がATネームサーバーへのルックアップリクエストが少なくとも1つあります。

そして 公式のApacheドキュメント もより詳細に説明します。再び大胆な強調は私のものです:

逆引き参照を実際に実行する必要がないサイトのネットワークトラフィックを保存するために、デフォルトはオフです。 ルックアップに伴う余分な遅延を被る必要がないため、エンドユーザーにとっても優れています。負荷の高いサイトはこのディレクティブをオフのままにしておく必要があります、DNSルックアップにはかなりの時間がかかる可能性があるためです。

Allow from/Deny fromディレクティブにはホスト名を使用しないでください。

また、Apache Basic Authを使用するディレクトリまたはディレクティブはありますか? Apacheで設定できる単純なパスワード保護はどれですか? Allow fromなどのAllow from localhostフィールドに接続されたホスト名ルックアップに関連する速度低下があったことを思い出します。 Allow from localhostをコメントアウトするか、それをAllow from 127.0.0.1 ::1に設定してから、Apacheを再起動すると、それがクリアされます。

公式のApacheドキュメント で説明されているように、Allow from/Deny fromディレクティブで完全なホスト名を使用してHostnameLookupsOffに設定しても、アクセスを遅くする可能性のあるDNSルックアップのチェーン全体がトリガーされます。大胆な強調は私のものです:

名前がこの文字列と一致するか、この文字列で終わるホストは、アクセスが許可されます。完全なコンポーネントのみが一致するため、上記の例はfoo.Apache.orgと一致しますが、fooapache.orgとは一致しません。 この構成により、Apacheは、HostnameLookupsディレクティブの設定に関係なく、クライアントIPアドレスに対して二重逆引きDNSルックアップを実行します。 IPアドレスに対して逆引きDNSルックアップを実行して関連するホスト名を見つけ、次にホスト名に対して逆引きルックアップを実行して、元のIPアドレスと一致することを確認します。順方向DNSと逆引きDNSに一貫性があり、ホスト名の一致が許可される場合のみ。

これ ブログ投稿でもうまく説明されています 生のIPアドレスではなくホスト名を持つAllow from/Deny fromエントリがどのように遅くなるかについての詳細を読みたい場合複数のDNSルックアップによるApacheアクセス:

ただし、最近、HostnameLookupsを明示的に有効にせずに、誤って同等の処理を行っていたという状況に遭遇しました。どうやって?リモートホスト名に基づいてアクセスを制限することによって! 「A(部分)ドメイン名」セクションのAllowディレクティブに関するドキュメントをお読みください。

この構成により、Apacheは、HostnameLookupsディレクティブの設定に関係なく、クライアントIPアドレスに対して二重逆引きDNSルックアップを実行します。 IPアドレスに対して逆引きDNSルックアップを実行して関連するホスト名を見つけ、次にホスト名に対して逆引きルックアップを実行して、元のIPアドレスと一致することを確認します。順方向DNSと逆引きDNSに一貫性があり、ホスト名の一致が許可される場合にのみ。これは完全に理にかなっていますが、次のようなものを使用すると、予想外の大きな副作用になる可能性があります。

Allow from .example.com

私たちの場合、ホスト名についてまったく考えさせられなかったのは、さらに明白ではありませんでした。

Allow from localhost

ここでは、ローカルホストが作成されました。これは、127.0.0.1(IPv4)と:: 1(IPv6)を書き出すよりも、労力を節約したり、わかりやすくしたりするためです。精神的には、「localhost」は127.0.0.1と:: 1の直接のエイリアスであるため、「localhost」という名前は単なる慣例であり、他の名前と同様にルックアップが必要であることを忘れることができます。 MySQLデータベースに精通している人は、それが実際にWord「localhost」に特別な紛らわしい意味を割り当てて、127.0.0.1またはその他の「localhost」へのTCP接続の代わりにUNIXソケット接続を確立することを知っているかもしれません。システム上で定義されています!

また、127.0.0.1の検索は、通常/ etc/hostsの「localhost」にマップされているため、高速であると考えているかもしれません。本当ですが、/ etc/hostsにいない他のすべての訪問者は、代わりに遅いDNS PTRルックアップを取得します!また、オペレーティングシステムによっては、/ etc/hostsに「ip6-localhost」または「ip6-loopback」(Debian 7、Ubuntu 12.04)、「localhost6」(RHEL 5/6、Fedora 19)などが表示される場合があります。 。したがって、アドレスを詳しく説明することが重要です。

Allow from 127.0.0.1
Allow from ::1

そうすることで、暗黙のHostnameLookupsの動作が即座に停止し、Webサイトが高速化されます。この場合、最初にファイアウォールの通過を許可されていない人がまったくアクセスできないプライベートな内部Webサイト用であり、トラフィックレベルが比較的低かったため、問題はありませんでした。そのアクセス制御は、ローカルホストを最初に許可する必要がある理由の一部です。しかし、トラフィックの処理が遅くなるため、公共の本番システムでは非常に悪かったでしょう。

1
JakeGould