最終更新日: 2014年1月13日
Squid Home / FAQトップ

SquidによるReverse Proxyの構築

このページでは、リバースプロキシ(Reverse Proxy)を使った、Webサーバのパフォーマンス改善について示します。 このページは次のような章立てになっています。
1章ではリバースプロキシの概要、2章では普通のリバースプロキシと透過モードでのリバースプロキシの比較、3章ではリバースプロキシでのキャッシュの働き、4章ではSquidをリバースプロキシとして機能させる設定

1章、リバースプロキシの概要
2章、普通のリバースプロキシと透過モードでのリバースプロキシの比較
3章、リバースプロキシのキャッシュの動き
4章、Squidをリバースプロキシとして機能させる設定

補足:

リバースプロキシやアクセラレータ(透過プロキシ)において認証機能を使う場合の注意についてはこちらも参照してください。


1章、リバースプロキシの概要

1.1 リバースプロキシ (Reverse Proxy)とは?

リバースプロシキキャッシュはWebサーバの加速器(アクセラレータ)として知られており、インターネットとWebサーバの間に入れることで、Webサーバのロードによるビジー状態を削減する方法です。また別の利点としてはセキュリティの強化も可能です。
これらは、複雑にすることなくスケーラビリティを改善する方法を提供します。 リバースプロキシの良い使い方としては、静的・動的の両方のコンテンツを提供するWebサーバの負荷を緩和させることです。 静的なコンテンツはキャッシュにより処理されるため、Webサーバは動的コンテンツの為により多くの処理時間をつかう事ができます。

■リバースプロキシ(アクセラレータ)を経由してサイトを配置する例と効果。


  • サーバを増やすことによる経費を削減できます。
  • より多くの静的コンテンツのリクエストに対応できます。
  • Webサーバはより多くの動的コンテンツに対応できます。
  • Webサイトの訪問者により早い応答でコンテンツを提供し、ダウンロード時間を加速します。
  • Webサーバの見た目の容易に性能をあげる事ができます。
  • Webサーバ単体の障害が発生しても、リクエストを処理することができます。

リバースプロキシを構築するにあたって、基となるサーバのコンテンツはプロキシを考慮して書かれるべきです。すなわちこれらは「キャッシュし易い」ようになっているべきです。もし基となるサーバのコンテンツがキャッシュの事を考慮していないなら、リバースプロキシを最大限に活用することは出来ないでしょう。

リバースプロキシモードでは、SquidプロキシサーバはクライアントにとってWebサーバのように振る舞います。
内部からのプロキシの利用と違い、外部のクライアントがプロキシのための設定をする必要はありません。 プロキシをWebサーバようにアクセスするだけです。 
実際のWebサーバはURLによって経路が決定されます。
プロキシのキャッシュによって、オリジナルサーバや内部ネットワークをファイヤーウォールで守られた背後に置く事で、基となるWebサーバを外部クライアントに晒すことなくコンテンツを送る事ができます。 

このページの目的は、SquidのWebアクセラレータおよびにリバースプロキシの実装について説明する事です。

1.2 Squidとは?

Squidは、Unixシステム上で動作するようにデザインされたオープン・ソースのハイ・パフォーマンス プロキシーです。National Science Foundation(NSF:米国立科学財団)は、Squidプロジェクトに資金を供給しています。 Squidは、たくさんのISPと世界中の会社で利用されています。 Squidほとんどのプロキシ・サーバーがすることができるl事よりも遙かに多くをすることが実現できます。

・Squidでのサポート

2章、普通のリバースプロキシと透過モードでのリバースプロキシの比較

ネットワークに構成できるプロキシの3つの機能があります。

■標準的なプロキシキャッシュ

標準のプロキシキャッシュ機能で、静的なコンテンツ(htmlイメージ)をキャッシュし、クライアントからのリクエストに1/2の時間で応答する事ができます。 HTTPリクエストは目的のWebサーバではなくプロキシを経由することをブラウザに明示的に指示する必要があります。

■透過キャッシュ(Transparent Cache)

透過キャッシュ機能は、ブラウザに標準的なプロキシと同じ機能を提供します。 ただし、標準的なプロキシではクライアント側でプロキシを利用することを明示的に指示する必要がありましたが、透過キャッシュではプロキシを使うことをブラウザ側で指示する必要がありません。 透過キャッシュではクライアントからのHTTPリクエストをHTTPトラフィックフィルター(ポート80)でネットワークの途中で捕まえて、その要求がキャッシュにあるかを確認し処理します。 もし要求されたものがキャッシュになければオリジナルサーバへ要求を転送します。
Linuxにおいては、iptablesやipchainsといったネットワークフィルタと一緒によく利用されます。 透過キャッシュは、クライアント側での設定が不要ということでISPにとっては非常に有用です。 
透過プロキシについては、FAQ-17を参照してください。

■リバースプロキシキャッシュ(アクセラレータ)

リバースプロキシは、クライアント要求による上流ネットワークの帯域削減よりもむしろ、オリジナルサーバの処理(ロード)削減を目的においており、標準や透過のキャッシュとは異なります。 リバースプロキシはクライアントからのWebサーバへの静的コンテンツへのリクエストを処理します。 リバースプロキシはWebサーバへのリクエストをすべて途中で捕まえて、キャッシュされている内容への要求である場合にはWebサーバへリクエストを転送せずに、リバースプロキシだけで処理させます。

3章、リバースプロキシのキャッシュの動き

クライアントブラウザがHTTPをリクエストした時、DNSは実際のWebサーバではなくリバースプロキシを指し示すようにしておく。
リバースプロキシは要求されたアイテムがキャッシュに無いかを確認する。もし本当にキャッシュにない場合には実際のWebサーバに要求を転送し、その内容をダウンロードします。

CGIスクリプトやアクティブサーバページズなどの動的なコンテンツはキャッシュする事ができません。 プロキシは静的なページのコンテンツのみをキャッシュできます。

リバースプロキシにおいてブラウザに返すコンテンツを、オリジナルサーバとするかキャッシュとするかの判断に使われる4つの重要なヘッダータグが存在します。

例: デフォルトでアクティブサーバページズが戻すヘッダーには「Cache-control: private.」が付いてきます。 このため、このページはキャッシュされません。

4章、Squidをリバースプロキシ(HTTPアクセラレータ)として機能させる設定

4.1 Webサーバが1台だけで、そのアクセラレータとして上位にSquidを配置する場合

HTTPアクセラレータとしてSquidを機能させるのは、squid.confをほんの少し修正するだけで簡単です。 大抵の場合このファイルはRedHatなどの場合には /etc/squid か /usr/local/etc/squid のどちらかで見つけられる事でしょう。 ソースコードらSquidをコンパイルした場合には、/etc/squid にあると思います。 squid.confを編集するためにrootになった後、以下の項目を修正することで、リバースプロキシ(HTTPアクセラレータ)とることができます。

■ リバースプロキシと別のマシンでWebサーバが動いている場合:

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サーバが動いている場合:

もし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     # ローカルサーバ
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

4.2 複数のドメインのためのアクセラレータとしてSquidを配置する場合

以下のような方法で、複数のドメインのサーバ(www.aaa.jp, www.bbb.com, www.ccc.org)のためのアクセラレータを構築できます。

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.aaa.jp 202.xxx.xxx.1
www.bbb.com 202.xxx.xxx.1
www.ccc.org 202.xxx.xxx.1

というように、リクエストが単一のアクセラレータに集まるようにします。
そしてリバースプロキシでは、自身でDNSを起動するか/etc/hostsを参照するように設定し、これらにおいて

www.aaa.jp 192.168.100.10
www.bbb.com 192.168.100.11
www.ccc.org 192.168.100.12

というようにする事で、実際のWebサーバのアドレスがリバースプロキシ上で解決できるようにしてください。

尚、SSLを使ったリバースプロキシの構築についてはこちらをご覧ください。

Squid Home / FAQトップ

参考: