Ubuntu 14.04でHAProxyを使ってSSLターミネーションを実装する方法
紹介
HAProxy(ハイ・アベイラビリティ・プロキシの略)は、Linux、Solaris、およびFreeBSD上で実行できる人気のオープンソースソフトウェアのTCP/HTTPロードバランサーおよびプロキシソリューションです。最も一般的な使用方法は、複数のサーバー(例:ウェブ、アプリケーション、データベース)に負荷を分散させることによってサーバー環境のパフォーマンスと信頼性を向上させることです。HAProxyは、GitHub、Imgur、Instagram、Twitterなどの多くの著名な環境で使用されています。
このチュートリアルでは、SSL終端処理、トラフィックの暗号化、そしてウェブサーバーの負荷分散にHAProxyを使用する方法について説明します。また、HAProxyを使用してHTTPトラフィックをHTTPSにリダイレクトする方法も示します。
HAProxy 1.5.x ではネイティブなSSLサポートが実装され、これは2014年6月に安定版としてリリースされました。
前提条件
このチュートリアルを完了するには、以下のものを持っているか取得する必要があります。
- 少なくとも1台のウェブサーバーがプライベートネットワークでHTTP(ポート80)をリッスンしています。
- HAProxyをインストールする追加のVPSへのルートアクセス。ルートアクセスの設定方法については、こちらの手順3および4を参照してください:Ubuntu 14.04を使用した初期サーバーセットアップ。
- ドメイン名またはIPアドレスに一致する「コモンネーム」を持つSSL証明書と秘密鍵のペア
SSL証明書と秘密鍵のペアをまだ取得していない場合は、続行する前に取得してください。以下に、SSL証明書を作成する手順を含むいくつかのチュートリアルを示します:
- StartSSL証明書を作成する(private.keyとssl.crt)
- Ubuntu 14.04に自己署名SSL証明書を作成する(ステップ2–apache.keyおよびapache.crt)
PEM形式のSSL証明書/鍵ファイルを作成する
HAProxyでSSL終端を実装するには、SSL証明書と秘密鍵のペアが適切な形式であるPEMであることを確認する必要があります。ほとんどの場合、SSL証明書(認証機関によって提供される.crtまたは.cerファイル)とその対応する秘密鍵(自分で生成した.keyファイル)を単純に組み合わせることができます。証明書ファイルがexample.com.crtと呼ばれ、秘密鍵ファイルがexample.com.keyと呼ばれると仮定すると、ファイルを組み合わせる方法の例は次のとおりです:
cat example.com.crt example.com.key > example.com.pem
sudo cp example.com.pem /etc/ssl/private/
これにより、example.com.pemと呼ばれる結合されたPEMファイルが作成され、/etc/ssl/privateにコピーされます。常に、PEMファイル(プライベートキーを含む)を含め、プライベートキーファイルの任意のコピーを保護することを忘れないでください。
場合によっては、CAルート証明書とCA中間証明書をPEMファイルにコピーする必要があるかもしれません。
私たちの出発環境
ここが私たちが始める環境です。
あなたの環境が例と異なる場合、例えば、すでにウェブサーバーでSSLを使用している場合や、別のデータベースサーバーを持っている場合は、このチュートリアルをあなたの環境に適応させることができるはずです。
基本的な負荷分散の概念や用語、例えばレイヤー7の負荷分散、バックエンド、ACLなどに不慣れな場合は、基本を説明した記事があります:HAProxyと負荷分散の概念の紹介。
私たちの目標
このチュートリアルの終わりまでに、次のような環境を持つことを目指しています:
つまり、あなたのユーザーはHTTPSを介してHAProxyサーバーに接続することによってあなたのウェブサイトにアクセスし、そのHAProxyサーバーはSSLセッションを復号化し、暗号化されていないリクエストをプライベートネットワークインターフェイス経由でポート80を通じてあなたのウェブサーバー(すなわちwww-backendのサーバー)に転送します。あなたのウェブサーバーはその後、応答をHAProxyサーバーに送り返し、そのHAProxyサーバーは応答を暗号化して元のリクエストをしたユーザーに返送します。
あなたは、同一のコンテンツを提供する限り、好きなだけのウェブサーバーで www-backend を設定できます。言い換えれば、最初は単一のサーバーで設定し、後で好きなだけサーバーを追加してスケールアウトすることができます。トラフィックが増加するにつれて、HAProxy サーバーがユーザーのトラフィックを処理するための十分なシステムリソースを持っていなければ、性能のボトルネックになる可能性があることを忘れないでください。
注: このチュートリアルでは、Webサーバーまたはアプリケーションサーバーが同じコンテンツを提供することを保証する方法については取り扱っていません。これは、しばしばアプリケーションやWebサーバーに依存するためです。
HAProxy 1.6.xをインストールする
プライベートネットワークを持つ新しいVPSを作成します。このチュートリアルでは、これをhaproxy-wwwと呼びますが、お好きな名前を付けてください。
私たちのhaproxy-www VPSに、apt-getに専用のPPAを追加します:
sudo add-apt-repository ppa:vbernat/haproxy-1.6
それから、aptキャッシュを更新します:
sudo apt-get update
次に、以下のコマンドを使用してapt-getでHAProxy 1.6をインストールします:
sudo apt-get install haproxy
HAProxy 1.6 がインストールされたので、これから設定を行いましょう!
HAProxyの設定
HAProxyの設定ファイルは/etc/haproxy/haproxy.cfgにあり、主に2つのセクションに分かれています:
- 全体: プロセス全体のパラメータを設定する
- プロキシ: デフォルト、リッスン、フロントエンド、および バックエンド セクションで構成されています
再度、もしHAProxyや基本的な負荷分散の概念や用語に不慣れな場合は、こちらのリンクを参照してください:HAProxyと負荷分散概念の紹介。
HAProxy 設定: グローバル
HAProxyの設定はすべてあなたのHAProxy VPS、haproxy-wwwで行う必要があります。
エディターでhaproxy.cfgを開きます:
sudo vi /etc/haproxy/haproxy.cfg
すでに定義されている2つのセクションがあります: global と defaults.
最初に行いたいことは、maxconnを合理的な数値に設定することです。この設定は、HAProxyが許可する同時接続の数に影響を与え、QoSに影響を及ぼし、Webサーバーがあまりにも多くのリクエストに応じようとしてクラッシュするのを防ぐことができます。あなたの環境に合った値を見つけるために、いろいろ試してみる必要があります。以下の行を設定ファイルのglobalセクションに追加してください(合理的だと思う値を使って)。
maxconn 2048
この行を追加して、一時的なDHEキーの生成される最大サイズを設定します:
tune.ssl.default-dh-param 2048
次に、defaults セクションで、mode http と書かれた行の下に次の行を追加してください:
option forwardfor
option http-server-close
forwardforオプションはHAProxyに各リクエストにX-Forwarded-Forヘッダーを追加させ、http-server-closeオプションは接続を閉じることでHAProxyとユーザー間のレイテンシを減少させますが、キープアライブを維持します。
HAProxy 設定: スタッツ
HAProxyの統計情報を使用すると、HAProxyが受信トラフィックをどのように処理しているかを確認するのに役立ちます。HAProxyの統計ページを有効にしたい場合は、defaultsセクションに以下の行を追加してください(ユーザーとパスワードは安全な値に置き換えてください):
stats enable
stats uri /stats
stats realm Haproxy\ Statistics
stats auth user:password
これにより、あなたのドメインにアクセスして /stats のHAProxy統計ページを見ることができます(例: https://example.com/stats)。
まだ設定ファイルを閉じないでください!次にプロキシ設定を追加します。
HAProxy 設定: プロキシ
フロントエンド設定
最初に追加したいのは、受信HTTP接続を処理するフロントエンドです。ファイルの最後に、www-httpというフロントエンドを追加しましょう。haproxy_www_public_IPをあなたのhaproxy-www VPSのパブリックIPに置き換えることを忘れないでください。
frontend www-http
bind haproxy_www_public_IP:80
reqadd X-Forwarded-Proto:\ http
default_backend www-backend
上記のフロントエンド設定スニペットの各行が何を意味するのかについての説明です:
- フロントエンド www-http: “www-http”という名前のフロントエンドを指定します。
- bind haproxy_www_public_IP:80:
haproxy_www_public_IPを haproxy-www のパブリック IP アドレスに置き換えます。これにより、HAProxy にこのフロントエンドがこの IP アドレスとポート 80 (HTTP) の受信ネットワークトラフィックを処理することを指示します。 - reqadd X-Forwarded-Proto:\ http: HTTPリクエストの最後にHTTPヘッダーを追加します
- default_backend www-backend: これは、このフロントエンドが受け取るトラフィックがすべてwww-backendに転送されることを指定します。これは次のステップで定義します。
次に、受信するHTTPS接続を処理するためのフロントエンドを追加します。ファイルの最後に、www-httpsというフロントエンドを追加しましょう。haproxy_www_public_IPをあなたのhaproxy-www VPSのパブリックIPに置き換えることを忘れないでください:
frontend www-https
bind haproxy_www_public_IP:443 ssl crt /etc/ssl/private/example.com.pem
reqadd X-Forwarded-Proto:\ https
default_backend www-backend
- フロントエンド www-https: “www-https”という名前のフロントエンドを指定します
- bind haproxy_www_public_IP:443 ssl crt …:
haproxy_www_public_IPをhaproxy-wwwのパブリックIPアドレスに、example.com.pemをあなたのSSL証明書と鍵のペアに置き換えてください。これにより、HAProxyはこのフロントエンドがこのIPアドレスとポート443(HTTPS)での受信ネットワークトラフィックを処理することを知らせます。 - reqadd X-Forwarded-Proto:\ https: HTTPSリクエストの最後にhttpsヘッダーを追加します
- default_backend www-backend: これは、このフロントエンドが受け取るトラフィックがすべてwww-backendに転送されることを指定します。これは次のステップで定義します。
バックエンド構成
フロントエンドの設定が完了したら、次の行を追加してバックエンドを追加します。強調表示された単語を、ウェブサーバーのそれぞれのプライベートIPアドレスで置き換えることを忘れないでください:
backend www-backend
redirect scheme https if !{ ssl_fc }
server www-1 www_1_private_IP:80 check
server www-2 www_2_private_IP:80 check
上記のバックエンド設定スニペットの各行が何を意味するのかの説明です:
- バックエンド www-backend: バックエンド名 www-backend を指定します
- リダイレクトスキーム https if !{ ssl_fc }: この行は、HTTPリクエストをHTTPSにリダイレクトします。これにより、サイトがHTTPS専用になります。HTTPとHTTPSの両方を許可したい場合は、この行を削除してください。
- サーバー www-1 …: www-1 というバックエンドサーバーを指定し、代入する必要のあるプライベートIPと、そのサーバーがリスニングしているポート80を示します。checkオプションにより、ロードバランサーは定期的にこのサーバーのヘルスチェックを行います。
- サーバー www-2 …: 前の行と同様です。ロードバランサーにさらにサーバーを追加するには、適切な名前とIPアドレスを持つこのような追加行を追加してください。
今、haproxy.cfgを保存して終了します。HAProxyは起動する準備が整いましたが、まずはログを有効にしましょう。
HAProxyのログ記録を有効にする
HAProxyでのログ記録は非常に簡単です。まず、rsyslog.confファイルを編集します:
sudo vi /etc/rsyslog.conf
次に、次の2行を見つけて、コメントを解除してUDP syslog受信を有効にします。完了すると、次のようになります:
$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1
新しい設定を有効にするために、rsyslogを再起動してください:
sudo service rsyslog restart
HAProxyのログ記録が有効になりました!HAProxyが起動すると、ログファイルは/var/log/haproxy.logに作成されます。
HAProxyを開始する
haproxy-wwwで、HAProxyを開始して設定変更を反映させます:
sudo service haproxy restart
HAProxyは現在、SSL終端処理を行い、ウェブサーバーへのロードバランシングを実施しています! あなたのロードバランスされたサーバーは、パブリックIPアドレスまたはロードバランサーhaproxy-wwwのドメイン名を介してユーザーがアクセスできるようになりました! すべてが正しく設定されていることを確認するために、確認するべきいくつかの項目があります。
確認すべき事項
- まだ行っていない場合は、ドメインをあなたのhaproxy-wwwサーバーのパブリックIPアドレスにポイントするようにネームサーバーを更新してください。
- サーバーがHTTPSのみを使用するようにする場合、ウェブサーバー(例:www-1、www-2など)がポート80のプライベートIPアドレスのみにリッスンしていることを確認する必要があります。そうしないと、ユーザーはパブリックIPアドレスを介してHTTP(暗号化されていない)であなたのウェブサーバーにアクセスできるようになります。
- haproxy-wwwにHTTPS経由でアクセスし、それが機能することを確認してください
- haproxy-wwwにHTTPでアクセスし、HTTPSにリダイレクトされることを確認してください(HTTPとHTTPSの両方を許可するように設定した場合を除きます)
注意: WordPressのように自身のURLを知る必要があるアプリケーションを使用している場合は、URL設定を「http」から「https」に変更する必要があります。WordPressの例に従うと、WordPressの一般設定に移動し、WordPressアドレス(URL)とサイトアドレス(URL)を「http」から「https」に変更します。
結論
今、あなたはSSL接続を処理するロードバランサーソリューションを持っており、サーバー環境を水平スケーリングするために使用できます。このガイドで学んだことを他のHAProxyガイドと組み合わせて、さらに環境を改善してください!

