Magentoで一定規模以上のサイトを運用する場合、複数台のWebサーバーを使用することになります。
もしくは運用方針として、サイトをダウンさせたくない場合はアクセス数が多くなくても、複数台のWebサーバーを使用することがあります。

このような場合、「MagentoのセッションとキャッシュをRedisに保存する」や「Magentoの画像ファイルをデータベースを使用して複数のWebサーバでシェアする」でご紹介したような方法を使いながら、Webサーバーを単純に増やせば良い形にサイトを作り替えていきます。
そして、複数台のWebサーバーに均等にアクセスを振り分けるためにロードバランサー(負荷分散装置)を導入します。

このエントリでは、Magentoとロードバランサーを組み合わせて利用する場合に、SSLによる暗号化を解除する方法を解説します。

ロードバランサーとは

ロードバランサーとは、日本語では負荷分散装置と呼ばれています。技術者の間ではLBと略されることがあります。
一般的には訪問者のアクセスを一手に受け付け、配下に接続されているWebサーバーにアクセスを振り分けます。
アクセス(負荷)を分散する装置なので負荷分散装置というわけです(英語で負荷はloadといいます)。

一般的にロードバランサーは以下のような形のネットワーク構成を取ります(スイッチなどは省略しています)。

ネットワーク図

SSL暗号化・復号化のオーバーヘッド

さて、ロードバランサーが無事に導入できたとします。
ロードバランサーにも幾つかあり、SSLの暗号化・復号化ができるものとそうでないものがあります。
一般的にSSL通信は、普通のHTTP通信に比べて暗号化と復号化の処理の分だけサーバーに負荷をかけます。

この負荷はアクセスの多いWebサイトほど重くのしかかってくるためアクセスの多いサイトでは、アプリケーションの処理をするサーバーと、SSLの暗号化・復号化を行うサーバーを分ける必要が出てきます。

SSLアクセラレーターとは

SSLアクセラレーターとは、SSLの暗号化と復号化を専門に行う装置のことです。
特別なハードウエアである必要はなく、普通のサーバーでも代用できます。
ロードバランサーにこの機能が含まれていることがあり、ロードバランサーと同義語として使われることもあります。

最近ではクラウドサービスの一部として、SSLアクセラレーター機能を有するロードバランサーが提供されていることがあり、簡単な設定で利用できるようになっています。
もちろん、アプライアンスとしてのSSLアクセラレーターは従来通り販売されていますし、オープンソースソフトウエアの、

  • Apache
  • Nginx
  • Pound
  • Squid

などをSSLアクセラレーターのアプライアンスを代替するために利用することがあります。

Magentoでよくあるトラブル

さて、MagentoでSSLアクセラレーターをネットワーク上に設置すると、そのままではトラブルが起きます。
というのも、MagentoはアクセスしてきたクライアントがHTTP(80番)なのか、HTTPS(443番)なのかをチェックしていて、それに合わせてページのリダイレクトを行うことがあります。

代表的な例としては、 

  • ログイン画面
  • 会員登録画面
  • マイページ
  • チェックアウト画面

などがあります。
これらのページではSSLが有効な場合に、非SSLのURLでアクセスしてきたクライアントは、自動的にSSLページにリダイレクトされてしまいます。

この結果、無限にリダイレクトがループすることになります。

対処方法

この現象はMagentoがSSLのリクエストを判断する基準として、サーバー変数の「HTTP」が「on」または「off」であるかをチェックしていることに起因しています。

そのため、SSLアクセラレーター経由のSSLページをMagentoの動いているサーバーに引き渡す際に、サーバー変数としてセットしてやることが必要です。

Apacheの場合は以下のように書きます。Nginxなどの場合は少し変わってくると思います。

SetEnvIf X-Forwarded-Proto https HTTPS=on

また、SSLアクセラレーター側では「X-Forwarded-Proto」がアプリケーションサーバー側に送信されるように、HTTPヘッダーの調整が必要になります。

この設定を忘れると、SSLアクセラレーターを入れた途端にSSLページにアクセスできなくなるという現象に陥ります。
ですが、アプリケーションの改修をせずに、ちょっとした設定変更だけで回避できますので、SSLアクセラレーターを導入する際には、忘れずに設定をしてください。