Apacheによるフォワードプロキシの構築

DMZなんかにプロキシサーバを立てて、外部サーバのAPIなんかを呼び出したい場合なんかに、Apacheフォワードプロキシを立てる。

構成

APサーバ⇒(DMZの)フォワードプロキシサーバ⇒外部APIサーバ

この構成にする理由

  • DMZをはさむことでネットワーク的なセキュリティを確保
  • 取得したコンテンツをキャッシュすることで負荷軽減

httpd.confの設定変更

下記の2つのモジュールをロードする。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so


proxy ディレクティブとして以下を設定。


# ここがOffだとリバースプロキシになるので注意!
ProxyRequests On


    Order deny,allow
    Deny from all
    # セキュリティの観点で、接続元IPの絞る。
    # ドメインでも可。複数の場合はスペース区切りで。
    Allow from 172


# HTTPリクエストヘッダーのViaを出力する。
ProxyVia On


※Viaは、リクエストを処理した中継者(プロキシ)や使用したプロトコルなどを示すために使用するHTTPヘッダ。
Viaは、プロキシを経由する場合は、基本的に必要だが、不特定多数の任意のサイトへプロキシする場合は、セキュリティの観点で除外するほうが望ましいかもしれない。
http://www.studyinghttp.net/header#Via

通信タイムアウト設定について(2010/10/07追記)

以下のような記述を、httpd.confに追記すれば、プロキシサーバと、外部サーバとの通信タイムアウト時間を明示的に設定できます。

ProxyTimeout  100*1

上記の設定の場合、100秒間、外部サーバとの通信が1byteも全くなかったらタイムアウトするよという意味になります。
これは、結構勘違いしやすいので、注意が必要です。つまり、例えProxyTimeoutを100秒と設定していても、外部サーバから100秒以内に1byteでもレスポンスがあれば、また100秒間は次のレスポンスを待ち続けるということになります。

ProxyPassのtimeoutは、backendに接続してからレスポンスが帰ってくるまでの全体の時間ではなくて、接続中にtimeout秒間データの送受信がなかったらタイムアウトするためのもの。

mod_proxy - ProxyPass、BalancerMemberのパラメータのdocumentを読んだのでまとめた - うまいぼうぶろぐ

バックエンドからbodyがちょろちょろ返ってくる(2秒おきにbodyのデータを返す)場合は、ProxyTimeoutやTimeoutは効きませんでした。

フロント/バックのreverse proxy構成で、指定秒数以内に必ずレスポンスを返す方法 - (ひ)メモ

ということを考えると、このタイムアウト時間はもっと短く設定しておいてもいい気がしています。但し、バッチなどである程度大きなファイルを取得する場合などは、5秒や10秒ではタイムアウトが頻発する可能性があるので、100〜300秒でもいいかなと思っています。

*1:デフォルト値は300秒。ちなみに、2.2.4以前のApacheでは、「グローバルのTimeoutディレクティブの値がProxyTimeoutより優先されてしまう」というApache mod_proxyのバグがあるらしいです。⇒株式会社アンタス - 次の時代のマーケティングテクノロジーを