最終更新日:2004年10月21日
【Squid Homeへ】
このページでは、リバースプロキシ(Reverse Proxy)を使った、Webサーバのパフォーマンス改善について示します。 このページは次のような章立てになっています。
1章ではリバースプロキシの概要、2章では普通のリバースプロキシと透過モードでのリバースプロキシの比較、3章ではリバースプロキシでのキャッシュの働き、4章ではSquidをリバースプロキシとして機能させる設定
1章、リバースプロキシの概要
2章、普通のリバースプロキシと透過モードでのリバースプロキシの比較
3章、リバースプロキシのキャッシュの動き
4章、Squidをリバースプロキシとして機能させる設定
補足:
リバースプロキシやアクセラレータ(透過プロキシ)において認証機能を使う場合の注意についてはこちらも参照してください。
リバースプロシキキャッシュはWebサーバの加速器として知られており、インターネットとWebサーバの間に入れることで、Webサーバのロードによるビジー状態を削減する方法です。また別の利点としてはセキュリティの強化も可能です。
これらは、複雑にすることなくスケーラビリティを改善する方法を提供します。 リバースプロキシの良い使い方としては、静的・動的の両方のコンテンツを提供するWebサーバの負荷を緩和させることです。 静的なコンテンツはキャッシュにより処理されるため、Webサーバは動的コンテンツの為により多くの処理時間をつかう事ができます。
|
リバースプロキシを構築するにあたって、基となるサーバのコンテンツはプロキシを考慮して書かれるべきです。すなわちこれらは「キャッシュし易い」ようになっているべきです。もし基となるサーバのコンテンツがキャッシュの事を考慮していないなら、リバースプロキシを最大限に活用することは出来ないでしょう。
リバースプロキシモードでは、プロキシサーバはクライアントにとってWebサーバのように振る舞います。
内部からのプロキシの利用と違い、外部のクライアントがプロキシのための設定をする必要はありません。
プロキシをWebサーバようにアクセスするだけです。 実際のWebサーバはURLによって経路が決定されます。
プロキシのキャッシュによって、オリジナルサーバや内部ネットワークをファイヤーウォールで守られた背後に置く事で、外部クライアントに晒すことなくコンテンツを送る事ができます。
このページの目的は、SquidのWebアクセラレータおよびにリバースプロキシの実装について説明する事です。
Squidは、Unixシステム上で動作するようにデザインされたオープン・ソースのハイ・パフォーマンス プロキシーです。National Science Foundation(NSF:米国立科学財団)は、Squidプロジェクトに資金を供給しています。 Squidは、たくさんのISPと世界中の会社で利用されています。 Squidほとんどのプロキシ・サーバーがすることができるl事よりも遙かに多くをすることが実現できます。
・Squidでのサポート
ネットワークに構成できるプロキシの3つの機能があります。
標準のプロキシキャッシュ機能で、静的なコンテンツ(htmlイメージ)をキャッシュし、クライアントからのリクエストに1/2の時間で応答する事ができます。 HTTPの要求は目的のWebサーバではなくプロキシを経由することをブラウザに明示的に指示する必要があります。
透過キャッシュ機能は、ブラウザに標準的なプロキシと同じ機能を提供します。 ただし、標準的なプロキシではクライアント側でプロキシを利用することを明示的に指示する必要がありましたが、透過キャッシュではプロキシを使うことをブラウザ側で指示する必要がありません。 透過キャッシュではクライアントからのHTTPリクエストをHTTPトラフィックフィルター(ポート80)でネットワークの途中で捕まえて、その要求がキャッシュにあるかを確認し処理します。 もし要求されたものがキャッシュになければオリジナルサーバへ要求を転送します。
Linuxにおいては、iptablesやipchainsといったネットワークフィルタと一緒によく利用されます。 透過キャッシュは、クライアント側での設定が不要ということでISPにとっては非常に有用です。
透過プロキシについては、FAQ-17を参照してください。
リバースプロキシは、クライアント要求による上流ネットワークの帯域削減よりもむしろ、オリジナルサーバの処理(ロード)削減という目的において標準や透過のキャッシュとは異なります。 リバースプロキシはクライアントからのWebサーバへの静的コンテンツへのリクエストを処理します。 リバースプロキシはWebサーバへのリクエストをすべて途中で捕まえて、キャッシュされている内容への要求である場合にはWebサーバへリクエストを転送せずに、リバースプロキシだけで処理させます。
クライアントブラウザがHTTPをリクエストした時、DNSは実際のWebサーバではなくリバースプロキシを指し示すようにしておく。リバースプロキシは要求されたアイテムがキャッシュに無いかを確認する。もし本当にキャッシュにない場合には実際のWebサーバに要求を転送し、その内容をダウンロードします。 CGIスクリプトやアクティブサーバページズなどの動的なコンテンツはキャッシュする事ができません。 プロキシは静的なページのコンテンツのみをキャッシュできます。 |
4つの尤も重要なヘッダーのタグは:
例: デフォルトでアクティブサーバページズの戻すヘッダーには「Cache-control: private.」が付いてきます。 このため、このページはキャッシュされません。
HTTPアクセラレータとしてSquidを機能させるのは、squid.confをほんの少し修正するだけで簡単です。 大抵の場合このファイルはRedHatなどの場合には /etc/squid か /usr/local/etc/squid のどちらかで見つけられる事でしょう。 ソースコードらSquidをコンパイルした場合には、/etc/squid にあると思います。 squid.confを編集するためにrootになった後、以下の項目を修正することで、リバースプロキシ(HTTPアクセラレータ)とることができます。
http_port 80 # Squidのポート cache_dir ufs /usr/local/squid/var/cache 100 16 256 cache_effective_user squid visible_hostname www.hogehoge.jp httpd_accel_host 172.16.1.115 # オリジナルWebサーバのIPアドレス
httpd_accel_port 80 # オリジナルWebサーバのポート
httpd_accel_single_host on # ノーキャッシュリクエストをホストへフォワード
httpd_accel_with_proxy on # 普通のProxy(キャッシュ)として機能させる場合はon
httpd_accel_uses_host_header off # 透過モードで使うときはon acl all src 0.0.0.0/0.0.0.0 http_access allow all
もしWebサーバと同じマシンでHTTPアクセラレータを機能させる場合、クライアントの要求を受け付ける80のポートはSquidで用意して、Webサーバでは別のポートを使うように設定します。 たとえばApacheでは、httpd.confの中で待ちうけポートを例えば81とかにして起動するようにします。
http_port 80 # Squidのポート cache_dir ufs /usr/local/squid/var/cache 100 16 256 cache_effective_user squid visible_hostname www.hogehoge.jp httpd_accel_host localhost # オリジナルWebサーバのIPアドレス httpd_accel_port 81 # オリジナルWebサーバのポート httpd_accel_single_host on # ノーキャッシュリクエストをホストへフォワード httpd_accel_with_proxy on # 普通のProxy(キャッシュ)として機能させる場合はon httpd_accel_uses_host_header off # 透過モードで使うときはon acl all src 0.0.0.0/0.0.0.0 http_access allow all
以下のような方法で、複数のドメインのサーバ(www.abc.com, www.ijk.com, www.opq.com)のためのアクセラレータを構築できます。
http_port 80 # Squidのポート cache_dir ufs /usr/local/squid/var/cache 100 16 256 cache_effective_user squid visible_hostname www.hogehoge.jp httpd_accel_host virtual httpd_accel_port 80 # Webサーバのポート httpd_accel_single_host off # 1つのホストに集中しないようにするためにoff httpd_accel_with_proxy on # 普通のProxy(キャッシュ)として機能させる場合はon httpd_accel_uses_host_header on # マルチサーバに対応するためon acl all src 0.0.0.0/0.0.0.0 http_access allow all |
このような構成の場合、インターネット上の公開DNSにおいて、
www.abc.com 192.168.1.2
www.ijk.com 192.168.1.2
www.opq.com 192.168.1.2
というように、リクエストが単一のマシンに集まるようにします。
続いて、リバースプロキシのアドレスを 192.168.1.2 に変更します。
そして、リバースプロキシでは自身でDNSを起動するか/etc/hostsを参照するように設定し、これらにおいて
www.abc.com 172,16.1.3
www.ijk.com 172.16.1.4
www.opq.com 172.16.1.5
というようにする事で、実際のWebサーバのアドレスがリバースプロキシ上で解決できるようにしてください。
尚、SSLを使ったリバースプロキシの構築についてはこちらをご覧ください。
【Squid Homeへ】
Copyright© 1998-2003 ROBATA.ORG