先日、EC-CUBE4をAWSで冗長化する機会がありましたので、その時の紹介をしたいと思います。

Internet → ALB →Webサーバ

SSLはALBで終端しています。つまり、Webサーバ側では80(HTTP)で受けることになります。

SSLの強制

SSLは、今となっては必須の項目ですね。AWSではSSL証明書は、専用のサービス(ACM)で管理してくれます。
このSSL証明書をALBへ登録する事で、ALBがSSLでの通信を処理してくれます。
ALBからWebサーバへは80(HTTP)で接続すると書きました。

ここが1つ目の関門となる要因です。

EC-CUBEでは、SSLを強制する機能がありますが、EC-CUBE4では、このあたりの制御が簡単になっているはずでした。これは、ALB等を間に立てずWebサーバでSSLを処理する場合にはということです。

最近の事案では、ALBを介さない構成もあまりないので、冗長化というのもパターンに入れていただけると助かります。

EC-CUBEでのSSL強制は有効にします。有効にした上で、SSLの判定を少し修正することでSSLの強制をしながら、Webサーバは非SSLの状態で稼働させることができます。

!注意!

やり方はいくつかあるようですが、今回はその1例としてお読みください。環境によっては、想定通りにならないことがあるかもしれません。その時は自力でお願いします。質問にはお答えできません。(スイマセン)

ALBでSSLを処理している場合

ALBでSSLを処理している場合、「X-Forwarded-Proto」に”https”がセットされます。これを利用して、Webサーバの環境変数「HTTPS」へ”on”を設定します。
これで、Webサーバ配下で動作するEC-CUBEは、HTTPSで通信していると認識してくれるはずです。

SetEnvIf X-Forwarded-Proto ^https$ HTTPS=on

これが上手くいかないと、EC-CUBEでSSLを強制している為、EC-CUBEは、SSL通信でリダイレクトします。そうすると、ALBまではSSLで通信できるのですが、ALB→Webサーバは、80(HTTP)の通信になってしまうので、リダイレクトのループ状態に陥ります。

その結果、「リダイレクトが繰り返し行われました」のように言われる事になります。

コンテンツの共有

冗長化することで、Webサーバは複数台になりますが、コンテンツはできる限り共通化したいですよね。以前はサーバ間で同期する仕組みを組み込んでいたのですが、最近はファイルサーバの機能が使えるようになってきて、なるべく共通の領域へコンテンツを配置するようにしています。

AWSでのファイルサーバ用途として、EFSを利用しました。EFSは、NFSプロトコルを利用してシステムにmountできるので、Linux系のシステムでは使い勝手が良いと思います。

ただ、ここで少しポイントがありました。EFSは、全体をマウントしているのですが、のコンテンツとして参照させたいのは、EFSの中の特定のディレクトリです。このディレクトリを参照させるために、マウントのbind機能を使ってコンテンツディレクトリへマウントしました。
※但し、bind機能にも注意するポイントがありました。システムの再起動でbind機能でのマウントが機能しない事がありました。

調べてみると、bind機能を利用する場合、EFS内のディレクトリをbindしているので、当然EFSが先にマウントされている必要がありました。しかし、当初はこの優先指定を記載していませんでした。これが原因でbind機能で指定したマウントができていませんでした。

fstabでの記述例

/mnt/EFS内ディレクトリ   /var/www/コンテンツディレクトリ none bind,_netdev,x-systemd.requires-mounts-for=/mnt/ 0 0

前提として、EFSを「/mnt」へマウントしています。
上記の記述例は、「/mnt/EFS内のディレクトリ」 を「 /var/www/コンテンツディレクトリ 」へbind機能でマウントするものです。

この時、「_netdev」でネットワークが整ってからマウントすること、「x-systemd.requires-mounts-for=/mnt/」で、事前に「/mnt」(EFS)がマウントされていることを追加して指定しました。
これで、コンテンツを共有することができました。

共有したくないディレクトリ

コンテンツを共有するためにEFSをマウントし、このマウントポイント配下の共有化したいディレクトリ(EC-CUBE)をbind機能でマウントしました。
EC-CUBE のディレクトリ構成では、「EC-CUBEディレクトリ/var」配下には、cache,log,sessionsというディレクトリがあります。

運用の方針によって様々ではありますが、今回は、この 「EC-CUBEディレクトリ/var」は、Webサーバ間で共有化しない事にしました。
そこで、このvarディレクトリを共用化しないように、(ここで)シンボリックリンクを使います。

シンボリックリンクの例

/var/www/コンテンツディレクトリ/var → /opt/var (/opt/varは存在する前提です)
このシンボリックリンクで、「/var/www/コンテンツディレクトリ/var」は、各Webサーバの「/opt/var」ディレクトリへ向きます。例えば、logファイルは、Webサーバ毎に出力されることになります。

・・・これで全てが解決したわけではありませんでした。

管理画面の操作は、どちらかのWebサーバへ向けて置くのが良いのではないかと思います。
敢えて、管理画面も冗長化するのであれば、そのための対応を組み込む必要が出てきます。

このあたりの話は、またの機会にしたいと思います。
お付き合い頂き、ありがとうございました。

弊社ではネットショップ構築や、収益向上の具体的な施策をサポートのみならず、日々の業界動向等も適宜お伝えして、お客さまとともに事業の成功を実現したいと切に願っています。

まずはお気軽に何でも以下までご相談ください。
ECサイト構築について
まずはお気軽に何でもご相談ください。
▼問合せフォームから相談してみる。
https://ec-cuber.jp/contact-us/
▼メールで相談してみる。
  sales_ec@ids.co.jp
▼電話で直接相談してみる。
  03-6386-3652
▼EC-CUBERは、総合的なECソリューションをご提供するEC-CUBEのプロフェッショナル集団です!
https://ec-cuber.jp/service/