5.5. ロードバランサ/リバースプロキシとHTTP通信(サーバ証明書)の設定

5.5.1. HAProxy によるリバースプロキシ

リバースプロキシを設置してHTTPS(SSL)接続を終端させ、後段のAPサーバにHTTPリクエストを転送するようにします。 ここではリバースプロキシに HAProxy を使用する方法を示します。

HAProxyをyum, apt-getなどでインストールします。 設定ファイルは /etc/haproxy/haproxy.cfg に格納されています。

# global設定
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

# default設定
defaults
    mode   http
    log    global
    option httplog
    option dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

# frontend設定
# サーバ証明書を指定
frontend  main *:443 ssl crt /etc/haproxy/test.example.com.pem
    reqadd X-Forwarded-Proto:\ https

    # /console でパスが開始する場合は console用サーバに転送
    acl url_console   path_beg   -i /console
    use_backend       console    if url_console
    # それ以外はAPIサーバに転送
    default_backend   api

# backend設定
backend console
    balance roundrobin
    server  console1 192.168.0.5:8080
    server  console2 192.168.0.6:8080

backend api
    balance roundrobin
    server  api1 192.168.0.1:8080
    server  api2 192.168.0.2:8080
    server  api3 192.168.0.3:8080
    server  api4 192.168.0.4:8080
  • APサーバのリストをbackend api 内に記述してください。
  • コンソールサーバのリストを backend console 内に記述してください。
  • frontendのパラメータとしてsslを指定するとSSLでの接続を受け付けます。
  • SSL 証明書および鍵ファイルは crt オプションで指定します。サーバ証明書と秘密鍵をcat等で結合したファイルを使用してください。
  • 後段の AP サーバで接続元の IP アドレスをログに記録できるようにするため、X-Forwarded-Proto などのヘッダを設定してください。

証明書の作成手順については サーバ証明書の作成手順 を参照してください。

5.5.2. Nginx によるリバースプロキシ

ここではリバースプロキシに Nginx を使用する方法を示します。

nginx を apt-get などでインストールします。 以下の設定例を参考に、/etc/nginx/sites-available/ に設定ファイルを作成し、sites-enabled にシンボリックリンクを設定してください。 なお、デフォルトの設定ファイルは無効化してください。

# HTTPS 設定
server {
  listen 443 ssl;
  server_name localhost; # 適宜修正すること

  access_log  /var/log/nginx/localhost.access.log;

  root html;
  index index.html index.htm;

  ssl on;
  ssl_certificate cert.pem;
  ssl_certificate_key cert.key;

  ssl_session_timeout 5m;

  ssl_protocols SSLv3 TLSv1;
  ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
  ssl_prefer_server_ciphers on;

  # リバースプロキシ用の HTTP ヘッダ設定
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-Proto https;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;

  # APサーバ
  location /api/ {
    proxy_pass http://apservers/api/;
    proxy_redirect http:// https://;
  }

  # コンソールサーバ
  location /console/ {
    proxy_pass http://console_servers/console/;
    proxy_redirect http:// https://;
  }
}

# APサーバ群の設定
upstream apservers {
  server server1.example.com:8080;
  server server2.example.com:8080;
  server server3.example.com:8080;
  keepalive 100;
}

# コンソールサーバ群の設定
upstream console_servers {
  server server1.example.com:8080;
}
  • APサーバのURLリストを upstream apservers 内に記述してください。
  • コンソールサーバの URL を upstream console_servers 内に記述してください。
  • SSL 証明書および鍵ファイルは /etc/nginx 以下に配置します。ファイル名は上記設定ファイルの ssl_certificate および ssl_certificat_key で指定します。
  • 後段の AP サーバで接続元の IP アドレスをログに記録できるようにするため、X-Forwarded-For などのヘッダを設定してください。

証明書の作成手順については サーバ証明書の作成手順 を参照してください。

5.5.3. リバースプロキシで HTTPS を終端する場合

ロードバランサ/リバースプロキシ(AWS ELB など)を使用して HTTPS(TLS) を終端して Tomcat に HTTP で転送を行う場合、 Tomcat 側の Connector に設定が必要になる場合があります。 これはリバースプロキシ側がリダイレクト時の Location ヘッダを書き換えてくれないためです。

以下に例を示します。

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="UTF-8"
           redirectPort="8443"
           proxyPort="443"
           scheme="https"
           secure="true" />

proxyPort、scheme、secure の3属性を追加する必要があります。

AWS ELS (Elastic Load Balander) を使用する場合

AWSコンソールから、ELBへのSSL証明書の設定方法は、 HTTPS リスナーを使用した Classic Load Balancer の作成 (「ステップ 3: セキュリティ設定の指定」)を参照してください。

なお、購入SSL証明書によって、中間証明書を設定しないと、Androidやcurlからのアクセスで警告が出ることがあります。

必要に応じで、下記のように中間証明書を設定してください。 ロードバランサーの[Listener Configuration] -> [Certificate] -> [Certificate Chain]に中間証明書を設定します。

5.5.4. ベースURIの設定

ロードバランサ・リバースプロキシを使用する場合は、ベースURIの設定を行う必要があります。 これはロードバランサ・リバースプロキシ使用時は MBaaS サーバは外部の URI がわからないためで、 MBaaS 内部での URL 生成(主にパスワードリセットの URL 生成)を正しく行うために外部 URI を教える必要があるためです。

ベース URI は設定ファイルに設定するか、デベロッパーコンソールから設定します。 設定ファイルについては 設定ファイル を参照してください。

以下に設定例を示します。

<properties>
    <!-- APIサーバ ベースURI 設定 -->
    <entry key="api.baseUrl">https://baas.example.com/api</entry>

    <!-- コンソールサーバ ベースURI 設定 -->
    <entry key="console.baseUrl">https://baas.example.com/console</entry>