それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Apacheのリバースプロキシで特定のパスをプロキシしない。

Apacheのmod_proxyの設定をしたのでメモをする。

今回は、リバースプロキシ+ある特定のパスだけ、除外条件を書いて別サーバーへプロキシした。

インストール

takuya@host $ sudo aptitude install apache2   #apache2のインストール
takuya@host $ sudo a2enmod proxy              #mod_proxyを有効化
takuya@host $ sudo a2enmod proxy_http         #httpのプロキシを使う

このほかにも

  • proxy_balancer(プロキシ機能を使ったロードバランサ)
  • proxy_ftp ftpサーバーのプロキシ機能がある。
  • proxy_ajp apache tomcat アプリケーション間通信プロキシなどがある。
  • proxy_connect #connect メソッド(HTTPSのプロキシで使う)サポート

などがあります。

Apacheプロキシの設定

Proxyの設定は次のファイルに記述します。Apache全体をプロキシとして使う場合は次の設定。

/etc/apache2/mods-enabled/proxy.conf
#リバースプロキシの設定例
<IfModule mod_proxy.c>
  #リバースプロキシはOff
  #フォワードプロキシを作るときにOnにする。
  ProxyRequests Off
  <Proxy *>
    AddDefaultCharset off
    Order deny,allow
    Allow from all  #リバースプロキシなので制限をしない。
  </Proxy>
  #プロキシ経由であることをヘッダに記述しない
  ProxyVia Off 
  #リクエストは192.168.10.10にへ委譲する
  ProxyPass / http://192.168.10.10/
  ProxyPassReverse http://192.168.10.10 /
</IfModule>

VirtualhostやLocationディレクティブごとに設置も出来る。細かく設定すれば、、URLごとにプロキシしたり、このホストはプロキシ、このホストはプロキシしないなどのホスト単位のプロキシも出来る。さらにHTTPの通信内容を書き換える場合(Cookieの値を書き換えるなど)をする場合は、mod_rewriteと組み合わせて使えばいい。


具体的な設定例

あるディレクトリだけプロキシしない

全てのURLをリバースプロキシするが、特定のURLだけプロキシしない。あるパスだけ除外するとき。除外設定は"!"をつけることで対応できます。ただし、設定が上から下へ処理されるため、除外設定は全体の設定より上にあること。順番が大事。

/etc/apache2/mods-enabled/proxy.conf
<IfModule mod_proxy.c>
  #省略
  # path=/zabbix/ へのリクエストはプロキシしない
  ProxyPass /zabbix/ ! 
  # path=/phpmyadmin/ へのリクエストはプロキシしない
  ProxyPass /phpmyadmin/ ! 
  # path=/p2 へのリクエストはリバースプロキシから除外する。
  ProxyPass /p2 ! 
  
  # 全体(path= /) へのリクエストは192.168.10.10にへ委譲する
  ProxyPass / http://192.168.10.10/
  ProxyPassReverse http://192.168.10.10 /
</IfModule>

ポイントは次の2点

  1. ProxyPassの末尾に 「!」 をつける
  2. 順番を先頭にする。

ある特定のURLだけプロキシする。

Locationディレクティブが使えます。locationディレクティブは必要に応じて使う方が設定が分かりやすいです。乱用は避けた方が良いでしょう。

<Location /images >
  #Proxy設定
</Location>

Locationよりは、Proxyディレクティブが良いと思う。複雑なマッチングを行なうのであれば、Mod_rewiteした方が良い。

Locationディレクティブを使いたく無い。この理由は、プロキシ設定が一カ所に集まらないため。Locationディレクティブ+Proxy設定は設定が多岐にわたるので面倒です。

通常のマッチングであればMod_rewiteの方が見通しが良い。ProxyロードバランサやAJPを組み合わせなら、Locationでも良いが、Mod_rewiteとが面倒なので、設定が散らばってあとで苦労するかも。

あるドメインだけをプロキシしたい

特定のドメインだけをリバースプロキシしたいと思う場合、これはVirtualhostのディレクティブに記述します。

<Virtualhost example.co.jp:80>
  #Proxy設定
</Virtualhost >

Cookieのドメインを書き換える。

シングルサインオンなどで、Cookieのドメインを弄る必要があるときは次のようにします。

ProxyPassReverseCookieDomain 書き換え前のドメイン 書き換え後のドメイン