Reverse Proxy

環境

Server APP Ver.
Front Server Apache 2.4
BackEnd Server Tomcat 8

Reverse Proxyとは

指定したPATH(以下)へのリクエストを、他特定のWeb Serverを経由するよう設置されるProxy Server(中継地点)。一般的なProxyと異なり、不特定多数のServerを対象としない。

役割

  • Server統合: 複数WebServerがそれぞれ別のサービスを提供している場合、ReverseProxyを導入し、1つのGlobal IPで公開し、1台のServerのみが稼働しているように見せる。
  • セキュリティ: ReverseProxyServerを中継させることで防御層が増える。認証機能をReverseProxy側へ持たせることも可能。
  • 暗号化、SSL Offloading: 暗号化をWebServerではなく、ReverseProxyServer側で行う。SSL高速化も可能。
  • 負荷分散: ReverseProxyによる複数Webserverへの負荷分散機能を持たせることも可能。
  • 静的コンテンツのキャッシュ: 静的コンテンツをReverseProxyがキャッシュし、WebServer側の負荷を低減する。また、コンテンツを圧縮/最適化することにより、WebServer側の待機時間を短縮可能。

前提条件

mod_proxy moduleを設定したApacheの利用が必要である。

設定

Directive 説明
ProxyPass RemoteServerをLocalServerのURL空間にmappingするディレクティブ(リクエストURLのmapping)。ProxyPassを利用している場合、ProxyRequestsはoffに設定する。 ProxyPass /example http://backend.example.com smax=5 max=20 ttl=120 retry=300
ProxyPassReverse ReverseProxyServerからのResponseHeaderURLを設定する。 ProxyPassReverse /mirror/foo/ http://backend.example.com/

ReverseProxyはProxyPassやRewriteRuleの”[P]”フラグを利用し有効となる。”ProxyRequests”を設定する必要はない。

▼例

<VirtualHost *:80>
  LoadModule rewrite_module modules/mod_rewrite.so

  <IfModule mod_proxy.c>
    # Reverse Proxyの場合、Off、Forward Proxyの場合、On
    ProxyRequests Off
    <Proxy *>
      # 文字コードを設定した場合、metaタグに設定した文字コード以外を記述しても、ブラウザ側で無視されて文字化けする可能性がある
      AddDefaultCharset Off

      # Reverse Proxyの為、制限無し
      Order deny, allow
      Allow from All
    </Proxy>
    # Headerへのプロキシ経由表示を抑制
    ProxyVia Off

    # /test/ へのリクエストはReverse Proxyから除外
    ProxyPass /test/ ! 

    # クライアントからのリクエストは下記へ流す
    ProxyPass / http://xxx.xxx.xxx.xxx retry=10
    ProxyPassReverse / http://xxx.xxx.xxx.xxx
  </IfModule>

  ErrorLog /var/log/httpd/elasticbeanstalk-error_log

</VirtualHost>

特定のドメインのみ Reverse Proxy

<VirtualHost halclan.net:80>
  LoadModule rewrite_module modules/mod_rewrite.so
  <IfModule mod_proxy.c>

特定のパスのみ Reverse Proxy

  <Location /test >
    ProxyPass / http://xxx.xxx.xxx.xxx retry=10
    ProxyPassReverse / http://xxx.xxx.xxx.xxx
  </Location>

Cookieの書換を行う

<VirtualHost halclan.net:80>
  <IfModule mod_proxy.c>
    # Cookieのドメイン書換
    ProxyPassReverseCookieDomain {書換前のドメイン} {書換後のドメイン}

ReverseProxy配下でSSLへリダイレクトさせる

要件

サーバA, サーバBが存在し、適宜ReverseProxyによってサーバAからサーバBへリダイレクトしている。
サーバAに記述するRewriteで http -> https へリダイレクトさせたい。

対応内容

ssl.conf

<VirtualHost *:80>
  LoadModule rewrite_module modules/mod_rewrite.so

  <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^/xxx\.html http://%{HTTP_HOST}/yyy.html [R=301,L,QSA]
    # その他Rewrite設定

    # 以下Headerディレクティブにて対応。
    Header edit Location ^http: https:
    ProxyPass / http://localhost:8080/ retry=10
    ProxyPassReverse / http://localhost:8080/
    ProxyPreserveHost On

    ProxyErrorOverride On

  </IfModule>
</VirtualHost>

デバッグ

mod_rewriteのログを吐き出す。
/path/to/httpd.conf

RewriteLog "/tmp/rewrite.log"
RewriteLogLevel 9

トラブルシューティング

502 Bad Gateway

  • Reverse ProxyがRemote Webサーバへの接続に失敗した
  • Reverse ProxyはRemote Webサーバからのレスポンスヘッダの読み込みに失敗した

502 Proxy Error

  • ProxyPassディレクティブで指定した転送先ホスト名のDNS lookup に失敗した
  • Reverse ProxyはRemote WebサーバからStatusの読み込みに失敗した

500 Internal Server Error

  • Reverse ProxyはRemote WebサーバへのSSL接続に失敗した

語句説明

語句 説明
OriginServer コンテンツ生成元のサーバ
ForwardProxy ClientとWebSeverの間のClient側に位置し、セキュリティ観点からFirewallで制限されるClient要求を代理に、外部ネットワークにあるWebSeverへアクセスを行う。

(Apache)公式サイト

http://httpd.apache.org/docs/2.2/en/mod/mod_headers.html#header
http://httpd.apache.org/docs/2.4/en/mod/mod_proxy.html

参考サイト

http://webos-goodies.jp/archives/51261261.html

保護中: SSL証明書

このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。