Apache はローカル エリア ネットワーク上の他のコンピュータではローカルホストよりも遅くなります

Apache はローカル エリア ネットワーク上の他のコンピュータではローカルホストよりも遅くなります

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

しかし、他のコンピュータでは動作が遅くなります。悲惨なほどではありませんが、明らかに遅くなります。場合によっては、ブラウザに「待機中...」と表示され、1、2 秒かかることがあり、これが最も苦痛です。

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

Chrome の開発者コンソールを見ると、DOMContentLoaded はサーバー上で 400 ~ 600 ミリ秒、その他のすべてのコンピューター上で 1400 ミリ秒程度であることがわかります。

そのような状況では何ができるでしょうか?

答え1

OffApache でHostnameLookups が設定されていることを確認します。

サーバーは WAMP (Windows 版の LAMP) セットアップ経由で Apache を実行しているとのことですが、正しいでしょうか? そうだとしたら、httpd.confまたはapache2.conf(すべてはセットアップでのインストール方法によって異なります。どちらのファイルも基本的に同じです) を開いて、HostnameLookupsその中にある構成行を探します。デフォルトでは、そのファイルの設定のすぐ上にあるコメントで説明されているようにHostnameLookupsに設定されています。太字は私が強調したものです。OffHostnameLookups

HostnameLookups: クライアントの名前またはその IP アドレスのみをログに記録します (例: www.apache.org (オン) または 204.62.129.132 (オフ))。デフォルトではオフになっています。この機能を有効にすると、各クライアント要求に対してネームサーバーへの検索要求が少なくとも 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の公式ドキュメント/ディレクティブで完全なホスト名を使用するHostnameLookupsように設定しても、アクセスが遅くなる可能性のある DNS ルックアップのチェーン全体がトリガーされます。太字の強調は私によるものです。OffAllow fromDeny from

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

これブログ記事でもわかりやすく説明されているAllow from生の IP アドレスではなくホスト名を持つ/Deny fromエントリが、複数の DNS ルックアップのために Apache アクセスを遅くする仕組みについて、さらに詳しく知りたい場合は、以下を参照してください。

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

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

Allow from .example.com

私たちの場合、それはホスト名についてまったく考えさせない、さらにわかりにくいケースでした。

Allow from localhost

ここで localhost と書かれていますが、これはおそらく、127.0.0.1 (IPv4) と ::1 (IPv6) と書くよりも手間が省けるか、または明確さを増すためでしょう。精神的には、「localhost」は 127.0.0.1 と ::1 の直接の別名であると見なすのは非常に簡単なので、「localhost」という名前は単なる慣例であり、他の名前と同様に検索が必要であることを忘れがちです。MySQL データベースに詳しい人なら、実際には「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 サイトであったため、トラフィック レベルは比較的低かったため、問題にはなりませんでした。このアクセス制御は、そもそも localhost を許可する必要があった理由の 1 つです。ただし、トラフィックの処理速度が低下するため、パブリックな実稼働システムでは非常に悪い結果になっていたでしょう。

関連情報