サーバを安全にするまで
このモジュールは Apache のプロキシ/ゲートウェイ機能を実装しています。
AJP13
(Apache JServe Protocol version 1.3),
FTP
, CONNECT
(SSL 用),
HTTP/0.9
, HTTP/1.0
, HTTP/1.1
のプロキシ機能を実装しています。これらのプロトコルやその他のプロトコル用の
プロキシ機能を持った、他のモジュールに接続するようにも設定できます。
Apache のプロキシ機能は
これに加えて、他のモジュールによって拡張機能が提供されています。
キャッシュは SSLProxy*
ディレクティブで
提供されています。これらの機能を利用するためには、該当するモジュールを
組み込んで設定しなければなりません。
Apache はフォワードプロキシとしても、 リバースプロキシとしても設定することができます。
通常のフォワードプロキシはクライアントと
オリジンサーバ
フォワードプロキシの一般的な使用方法は、ファイアウォールによって
制限されている内部のクライアントにインターネットへのアクセスを
提供するものです。フォワードプロキシはネットワークの使用量を
減らすために (
フォワードプロキシは
一方リバースプロキシは、クライアントには普通の ウェブサーバのように見えます。クライアント側に特別な設定は必要ありません。 クライアントはリバースプロキシの名前空間に対して通常のコンテンツへの リクエストを行ないます。プロキシはリクエストをどこに送れば良いかを判定し、 あたかも自分自身がオリジンサーバであったかのようにクライアントに コンテンツを返します。
リバースプロキシのよくある利用方法は、インターネットユーザに ファイアウォールの中にあるサーバにアクセスを与えるというものです。 リバースプロキシは複数のバックエンドサーバへ負荷分散をするために 使ったり、遅いバックエンドエンドサーバのためにキャッシュ機能を提供したり するために使えます。また、リバースプロキシは複数のサーバを 同じ URL 空間にまとめるために使うこともできます。
リバースプロキシは [P]
フラグを使うことで有効になります。リバースプロキシの
設定のために
以下の例は手始めの簡単な例です。個々のディレクティブの意味は それぞれの説明をお読みください。
またキャッシュ機能を有効にしたい場合は、
プロキシのアクセスは以下のように
アクセス制御のためのディレクティブのより詳しい情報は
(ProxyRequests Off
にして
おそらく、プロキシの mime.types 設定ファイルでそのファイルタイプが
application/octet-stream
であると定義されていないのでしょう。
以下のようなものが役に立つかもしれません:
application/octet-stream bin dms lha lzh exe class tgz taz
別の方法として、すべてのデフォルトをバイナリにすることもできます:
DefaultType application/octet-stream
まれに、(デフォルトの転送は binary
モードで) 特定の
ファイルのみ FTP の ASCII
転送方法を使わなければならない
場合には、リクエストの最後に ;type=a
を付けることで
現時点では、mod_proxy の FTP サポートは GET のみです。もちろん Apache の プロキシを使って HTTP のアップロード (POST や PUT) を することはできます。
FTP URI はログインしているユーザのホームディレクトリからの
相対パスとして扱われます。残念なことに、/../ はブラウザにより解釈され、
実際に FTP サーバには送られないため、/../ を使って上位のディレクトリに
到達することはできません。この問題を解決するために、いわゆる
Squid %2f ハック を Apache の FTP プロキシは実装しています。
これは Squid Proxy キャッシュ のような
他のよく使われているプロキシサーバでも取られている方法です。
リクエストのパスの先頭に /%2f
を付けることで、プロキシに
FTP の開始ディレクトリを (ホームディレクトリの代わりに) /
に変えることができます。例えば、/etc/motd
を取得するためには
次の URL を使います:
FTP サーバにユーザ名とパスワードを使ってログインするために、 Apache は異なる方法を使います。URL にユーザ名とパスワードがまったく ない場合は、Apache は FTP サーバに anonymous ログインを送ります。 つまり、
これは anonymous アクセスが設定された すべての FTP サーバに対して動作します。
ユーザ名を使った個人別のログインには、URL にユーザ名を入れることが できます:
このユーザ名が与えられたときに、FTP サーバがパスワードを要求すれば
(もちろんそうすべきなのですが)、Apache は 401
(Authorization required) を返します。これにより、ブラウザはユーザ名
パスワードの入力ダイアログを表示します。パスワードが入力された後、
再び接続を試み、成功すればリクエストしたリソースが表示されます。
この方法の利点はブラウザがパスワードを平文で表示しないことです。
(もし最初から
と入力した場合には表示されてしまいます。)
送信されるパスワードは、暗号化されて送られるわけではありません。 ブラウザと Apache プロキシサーバは base64 で符号化された 文字列として、Apache プロキシと FTP サーバの間は平文として送られます。 ですから、HTTP を使って HTTP をアクセスする前 (もしくは、そもそも 個人的なファイルを FTP でアクセスする前) によく考える必要があります。 安全でない通信路を使った場合は、盗聴者に途中でパスワードを盗まれる 可能性があります。
イントラネットにある Apache プロキシサーバは外部へのリクエストを
会社のファイアウォールを通して送らなければなりません。(このためには
個々の scheme についてそれぞれ、ファイアウォールの
プロキシにフォワードされるように
イントラネット内のユーザは WWW のリクエストでローカルドメインを
省略することがよくあります。http://somehost.example.com/
というリクエストの代わりに "http://somehost/" をリクエストしたりします。
このようなリクエストを受け付け、サーバに設定されているローカルドメインが
暗黙のうちに使われていると解釈して、単純にリクエストを処理するものも
商用プロキシサーバの中にはあります。
サーバが プロキシのサービス用に設定されていて
Keepalive や HTTP/1.1 を適切に実装していないアプリケーションサーバが
ある状況で、HTTP/1.0 で keepalive を無しにしてリクエストを送るための
環境変数が二つあります。これらは
force-proxy-request-1.0
と proxy-nokeepalive
がその環境変数です。
例えば、次の設定は yournetwork.example.com
の
ホストにのみプロキシサーバを経由したアクセスを許可します:
次の例は example.com
の foo
ディレクトリの
すべてのファイルに対して、プロキシサーバを通して送られたときには
INCLUDES
フィルタを通して送るように設定します:
IsError
Ignore
StartBody
このオプションが有効になっている場合、
このオプションは通常は Off
に設定してください。
ほとんどの場合、これは大量の名前ベースのバーチャルホスティングを行なっていて、
元々の Host ヘッダをバックエンドサーバが解釈する必要のあるときのような、
特別な設定が必要な場合にのみ有用です。
これは Apache のフォワードプロキシサーバとしての動作を
有効もしくは無効にします。(ProxyRequests を Off
に
設定しても、
通常のリバースプロキシの設定では、このオプションは Off
に設定してください。
HTTP や FTP サイトへのプロキシの機能を有効にしたい場合は、
サーバを安全にするまで
このディレクティブはこのプロキシに対するリモートプロキシを定義します。
match はリモートサーバがサポートする URL スキーム、
リモートサーバが使うはずの URL の一部分、サーバがすべての
リクエストに使われることを示す *
のどれかになります。
remote-server はリモートサーバの部分 URL です。構文:
scheme は実際上リモートサーバとの通信に使われるプロトコルを
決定します。このモジュールでは http
だけがサポートされて
います。
この例では、プロキシは FTP リクエストを別の HTTP リクエストで包んで そのようなリクエストを扱える別のプロキシに転送します。
このオプションはリバースプロキシの設定もサポートします。 サーバが別のフォワードプロキシの後ろに隠されている場合でも バックエンドウェブサーバをバーチャルホストの URL 空間に入れることが できます。
このディレクティブはリモートサーバをローカルサーバの名前空間に マップできるようにします。ローカルサーバは通常の意味でのプロキシと しては動作せず、リモートサーバのミラーとして振る舞います。 path はローカルの仮想パスの名前です。url は リモートサーバの部分 URL になり、クエリー文字列を含むことはできません。
ローカルサーバのアドレスが http://example.com/
であると
します。すると、
と設定すると http://example.com/mirror/foo/bar
への
リクエストが内部的に http://backend.example.com/bar
への
プロキシリクエストに変換されることになります。
サブディレクトリをリバースプロキシしたくないときに !
は
役に立ちます。例えば、
は /mirror/foo/i
を除く
/mirror/foo
へのすべてのリクエストを
backend.example.com
にプロキシします。
順番は重要です。一般的な
2.1 の新機能で、バックエンドサーバとの接続にプールされたコネクションを
使えるようになりました。key=value
形式のパラメータで
このコネクションプーリングの調整ができます。Hard Maximum
のデフォルト値は、有効になっている MPM でのプロセス当たりのスレッド数と
同じ数のコネクション数です。prefork MPM では通常は 1 で、worker MPM では
min
の設定で、バックエンドサーバとの間に何本のコネクションを
常時開くかが決まります。Soft Maximum smax
の数に
達するまで必要に応じてコネクションは生成されます。smax
を超えた数のコネクションは、生存時間 ttl
で切断されます。
バックエンドサーバと Hard Maximum max
の数以上のコネクションを
生成することはありません。
パラメータ | デフォルト値 | 説明 |
---|---|---|
min | 0 | バックエンドサーバとの接続で 常に開いているコネクション数の最小値 |
max | 1...n | バックエンドサーバとの接続数の Hard Maximum
|
smax | max | 接続数の Soft Maximum smax を超えた数のコネクションは生存時間 ttl
で切断されます。
|
ttl | - | smax 数を超えた非活動状態のコネクションの生存時間を、
秒で指定します。この期間内に使用されなかったコネクションは、
全て閉じられます。
|
timeout | コネクションタイムアウトを秒で指定します。特に指定されなければ、
フリーなコネクションを取得できるまで待ちます。このディレクティブは
max パラメータと合わせて使うことで、バックエンドサーバとの
接続数を制御するのに使います。
| |
acquire | - | 設定すると、コネクションプールからフリーのコネクションを取得するために
待機する待ち時間の最大値になります。フリーのコネクションがプールになかった場合は、
SERVER_BUSY ステータスがクライアントに返されます。
|
keepalive | Off | バックエンドサーバと Apache の間にファイアーウォールがある場合には、
このパラメータを使ってください。ファイアウォールは往々にして、
非活動状態のコネクションを落とそうとします。
このフラグは OS に指示して、KEEP_ALIVE メッセージを非活動状態の
コネクションでも送るようにします (間隔は OS のグローバル設定に依存し、
通常は 120ms 間隔) 。これによってファイアウォールによってコネクションが
落とされることを防げます。keepalive を有効にするには、このプロパティを
On にしてください。
|
retry | 60 | コネクションをプーリングするための、リトライのタイムアウトを秒で 指定します。バックエンドサーバへのコネクションプーリングが失敗した場合は、 タイムアウトの期間が過ぎるまで、そのサーバにリクエストをフォワードしません。 この機能を使うと、バックエンドサーバをメンテナンスのためにシャットダウンし、 後でオンラインに復帰させるといったことができます。 |
loadfactor | 1 | ワーカーあたりの負荷係数です。BalancerMember で使います。 1 から 100 までの数字でそのワーカーに対する正規化された負荷率を指定します。 |
route | - | ロードバランサで使った場合、ワーカーのルーティングをします。 ルートはセッション ID に付加された値になります。 |
redirect | - | ワーカーのリダイレクション経路です。この値は通常は、 安全にクラスタからノードを取り去る設定を動的に入れるために使います。 セッション ID の無いリクエスト全てを指定した場合は、 この値と同じルーティングパラメータを持つ BalancerMember にリダイレクトされます。 |
Proxy ディレクティブのスキームが balancer://
になっている場合は、
バックエンドサーバと実際には通信しない仮想ワーカーが生成されます。
このワーカーは幾つかの "本物の" ワーカーの管理をつかさどります。
この場合パラメータは、この仮想ワーカーに対して設定されます。
パラメータ | デフォルト値 | 説明 |
---|---|---|
lbmethod | - | Balancer のロードバランス方法。使用するロードバランスの
スケジューリング方法を選びます。処理したリクエストの数で重み付けする
byrequests か、転送量のバイト数で重み付けする
bytraffic を設定できます。デフォルトは
byrequests です。
|
stickysession | - | バランサーのスティッキーセッション名です。通常はこの値は JSESSIONID
や PHPSESSIONID といったものになりますが、この値は
バックエンドアプリケーションのサポートするセッションに依存します。
|
nofailover | Off | On になっていると、ワーカーがエラーを起こしたり
無効になっている場合にセッションが切れます。
バックエンドサーバがセッションレプリケーションをサポートしていない場合は、
On にしてください。
|
timeout | 0 | バランサーのタイムアウトを秒で指定します。 この値を設定すると、フリーのワーカーを取得するまでの最大待機時間になります。 デフォルトでは待機しません。 |
maxattempts | 1 | フェイルオーバーを試みる最大の回数を指定します。 |
より柔軟なリバースプロキシの設定が必要な場合は、[P]
フラグ付きの
このディレクティブは Apache に HTTP リダイレクト応答の
Location
, Content-Location
, URI
ヘッダの調整をさせます。これは、Apache がリバースプロキシとして使われている
ときに、リバースプロキシを通さないでアクセスすることを防ぐために
重要です。これによりバックエンドサーバの HTTP リダイレクトが
リバースプロキシとバックエンドの間で扱われるようになります。
ディレクティブで明示されている HTTP 応答ヘッダのみが書き換えられます。 Apache は他の応答ヘッダを書き換えたり、HTML ページの中の URL 参照を 書き換えたりすることはありません。HTML の中を見て、URL 参照を書き換える モジュールに Nick Kew さんの mod_proxy_html があります。
path はローカル仮想パスの名前です。url は
リモートサーバの部分 URL です。これらは
例えば、ローカルサーバのアドレスが http://example.com/
だとします。すると
という設定をすると、http://example.com/mirror/foo/bar
へのローカルリクエストが http://backend.example.com/bar
へのプロキシリクエストに内部でリダイレクトされるだけではありません
(これは ProxyPass
の機能です)。backend.example.com
が送るリダイレクトの面倒もみます。http://backend.example.com/bar
が http://backend.example.com/quux
にリダイレクトされたとき、
Apache は HTTP リダイレクト応答をクライアントに送る前に、
http://example.com/mirror/foo/quux
に変更します。
URL を構成するのに使われるホスト名は
RewriteRule ... [P]
) と併せて使用することができます。
使用法は基本的に
Set-Cookie
ヘッダの
domain
文字列を書き換えます。
使用法は基本的に
Set-Cookie
ヘッダの
path
文字列を書き換えます。
CONNECT
できるかを指定するCONNECT
メソッドが接続を許可するポート番号のリストを指定します。
今日のブラウザは、https
コネクションが要求されていて、
HTTP 上でのプロキシによるトンネリングができるときに、
このメソッドを使います。
デフォルトの設定では、https のデフォルトポート (443
) と
デフォルトの snews ポート (563
) が有効になっています。
このデフォルトを上書きして、リストに記載したポートにのみ接続を許可したい場合、
CONNECT
を使用するには、
rocky.wotsamattau.edu
が IP アドレスで参照されたときでも
マッチします。
wotsamattau.edu
のマッチには wotsamattau
だけでも十分です。
はすべてのサイトへの接続をブロックすることに注意してください。
512
以上か、システムのデフォルトのバッファ
サイズを意味する 0
でなければなりません。
8192
以下でなければなりません。
ほとんどすべての場合、この値を変更する理由はありません。
Max-Forwards
ヘッダが指定されていない場合に
リクエストが通過可能なプロキシの最大数を設定します。これは
プロキシの無限ループや DoS 攻撃を防ぐために設定されています。
このディレクティブはイントラネット中の Apache プロキシサーバにのみ
有用です。
Domain は先頭にピリオドの着いた部分 DNS ドメイン名です。 同一 DNS ドメイン及びゾーン (すなわち、ホスト名の末尾がすべて Domain で終わっているということ) に属するホストのリストを 表します)。
Domain を Hostname と区別するために (意味的にも構文的にも。DNS ドメインも DNS の A レコードを持つことができるのです!)、Domain は 常にピリオドで始まります。
ドメイン名の比較は大文字小文字を区別せずに行なわれ、Domain
は常に DNS ツリーのルートから始まるものとみなされます。ですから、
次の二つのドメイン .MyDomain.com
と
.mydomain.com.
(最後のピリオドに注目) は同一であると
みなされます。ドメインの比較は DNS ルックアップなしで行なわれるため、
サブネットの比較よりもずっと効率的です。
SubNet は数値形式 (ドットで区切られた四つの数字) の 部分インターネットアドレスです。後にスラッシュと Subnet の意味のあるビット数を指定するネットマスクとを続けることができます。 共通のネットワークインタフェースを使って到達することのできるサブネットを 表すために使われます。明示的にネットマスクを指定しない場合は 最後の省略された (もしくは値が 0 の) 数字がマスクを指定します。 (この場合は、ネットマスクは 8 ビット単位でしか指定できません。) 例:
192.168
もしくは 192.168.0.0
255.255.0.0
というネットマスクの形式で使われることも
あります)192.168.112.0/21
192.168.112.0/21
と 21 ビット有効な
ネットマスク (255.255.248.0
という形式で使われることも
あります)特別な場合に、32 ビット有効な SubNet は IPAddr と同等で、 0 ビット有効な SubNet (例えば、0.0.0.0/0) は すべての IP アドレスにマッチする定数 _Default_ と同じです。
IPAddr は数値形式 (ドットで区切られた四つの数字) の 完全インターネットアドレスです。通常はこのアドレスはホストを 表しますが、必ずしもアドレスに対応する DNS ドメイン名があるわけでは ありません。
IPAddr は DNS システムにより解決される必要がないので、 apache の性能が向上するかもしれません。
Hostname は DNS ドメインサービスにより一つもしくは 複数の IPAddr に解決可能な 完全な DNS ドメイン名です。これは (Domain と違って、説明は上記を参照) 論理的なホストを表し、少くとも一つの IPAddr (もしくは違う IPAddr のホストのリスト) に解決 されなければなりません)。
多くの場合、Hostname の代わりに IPAddr を指定した方が、DNS ルックアップを 避けることができるため、効率が良くなります。Apache の名前解決は ネームサーバへの接続が遅い PPP 上の場合などにかなり時間を取られる ことがあります。
Hostname の比較は大文字小文字を区別せずに行なわれ、
Hostname は常に DNS ツリーのルートから始まるものとみなされます。
ですから、二つのドメイン WWW.MyDomain.com
と
www.mydomain.com.
(最後のピリオドに注目) は同一であると
みなされます。
このディレクティブはユーザがプロキシリクエストのタイムアウトを
指定できるようにします。これはハングしてしまう遅い、もしくは挙動の
怪しいサーバがあり、サーバがデータを返すまでひたすら待ち続けるよりも
タイムアウトを返してより緩やかに
このディレクティブはイントラネット内の Apache プロキシサーバにのみ
有用です。
Via
HTTP 応答ヘッダ
により提供される情報このディレクティブはプロキシの Via:
HTTP ヘッダの使用を
制御します。想定されている使い方は、プロキシサーバがいくつも繋がっているときに
プロキシリクエストの流れを制御することです。Via:
ヘッダ行の
説明は RFC 2616 (HTTP/1.1)
の 14.45 節を読んでください。
Off
に設定されていると、特別な処理は
行なわれません。リクエストやリプライに Via:
ヘッダがあれば、
変更されずにそのまま渡します。On
に設定されていれば、各リクエストとリプライに
Via:
行が追加されます。Full
に設定されていれば、Via:
ヘッダは
コメント部分に Apache サーバのバージョンも含むようになります。Block
に設定されていれば、すべてのプロキシリクエストから
Via:
ヘッダが取り除かれます。新たに Via:
が
生成されることはありません。このディレクティブはリバースプロキシを使用していて、
エンドユーザに送られるエラーページの外見を共通のものにしたいときに
有用です。このディレクティブは (