メモ > 技術 > CMS: ECCube > 本番環境(AWS想定)での稼働
本番環境(AWS想定)での稼働
意外に簡単!?最新EC-CUBEのAWSインストール方法 【ネットショップ構築最前線】
https://regolith.diezon.co.jp/ec11_aws.detail.html
EC-CUBE4の立ち上げ〜AWSにデプロイするまで - ひろこま Hack Log
https://www.mahirokazuko.com/entry/2020/01/03/235548
■nginx
※未検証。
公式にはApacheしか記載は無いが、動かないわけでは無いみたい。
[備忘録] EC-CUBE4をnginx上で動かす | planet-green.com
https://planet-green.com/eccube4-on-nginx/3235
■複数台構成の考察
rsyncで双方向同期…なら大丈夫そうだが、きちんと「画像はS3に置いて」は難しそう。
EC-CUBEによるECサイトの負荷対策
https://www.slideshare.net/kazunoriinaba/20171010jawsugeccube
「負荷対策(1)」で紹介されているが、S3を使うとしても
・管理用サーバを1台とし、管理画面へはそこへ直接アクセス。
・uploadやuser_dataなど、同期が必要なものは管理用サーバからS3に転送。公開用サーバはS3から取得。
となる?つまり、S3に対応させる場合でも「ECCubeが直接S3を扱うように」は不可能?
【JAWS-UG関西女子会】#2 ELB+EC2+RDSでECサイトをつくろう 〜EC-CUBEコンテンツ同期編〜 - Qiita
https://qiita.com/naotinn74/items/83ccefd08bbea796f359
双方向同期の情報はある。
EFSは今も激重か?使用実績は無い?
以下は最近の情報みたい。
Amazon Elastic File System(EFS)を使ううえでの勘所 - Qiita
https://qiita.com/taichimachima/items/f7d47b68aac2a11ea7cc
色々と注意があるようなので、いきなりの実戦投入はリスクが高そう。
EC-CUBE とクラウドは仲良しか?
https://www.slideshare.net/nanasess/aw-svs-azure
ECCubeをBeanstalkで使う場合について触れられているが、ECCubeがスケーリングには対応してないとある。
EC-CUBE4のアーキテクチャとこれから
https://www.ec-cube.net/user_data/press/R1-3_eccube.pdf
いくらか参考になるかもしれない。
又聞きだが、ECCube公式に確認して「ECCube自体がスケーリングを想定していないので、正式な対応手順があるわけでは無い」と回答されたとのこと。
「不可能ではないが色々と工夫が必要」という感じ。
「管理画面用サーバの内容をS3に自動転送して、ユーザ画面用サーバで自動取得する」が一応のベストかもしれない。
が、プログラム側では複数台構成を意識しなくていい「rsyncで同期方式」が無難か。
■複数台構成の実践
※詳細は要検証。
基本的には、rsyncでの双方向同期で対応できそう。
ただしrsyncで双方向同期する際、var の内容を同期すると正しく動作しなかった。
いったん lsyncd.conf にて var のみ双方向同期の対象から外して対応した。
var 内にはエラーログなども格納されるので、ここはむしろ同期すべきでは無いかも。
exclude = {
"*.swp",
"/html/var"
},
また html/user_data/ 内にディレクトリを作成すると、グループのパーミッションが除外される。(ECCubeがそのように処理しているみたい。)
FileController.php の181行目あたりにある $fs->mkdir($nowDir.'/'.$filename); の直後に chmod($nowDir.'/'.$filename, 0777); を追加すれば何とかなるかもしれない。
ただし影響範囲が読みづらいので、rsyncにsudoを許可して所有者も含めて双方向同期する方が無難そう。
具体的には lsyncd.conf にて以下のように設定した。
rsync = {
archive = true,
compress = false,
owner = true, … パーミッションを保持した状態で同期。
group = true, … パーミッションを保持した状態で同期。
rsync_path = "sudo /usr/bin/rsync", … 管理者権限で rsync を実行。
rsh = "ssh -p 10022"
}
この設定を行うには、あらかじめ rsync ユーザに /usr/bin/rsync のsudo許可をしておく必要がある。
# visudo -f /etc/sudoers.d/users
追加後、下記コマンドで追加されているか確認できる。
Cmnd_Alias RSYNCCOMMANDS = /usr/bin/rsync
rsync ALL=PASSWD: ALL, NOPASSWD: RSYNCCOMMANDS
# su -s /bin/bash - rsync … rsyncユーザへ切り替え。
# cat /etc/sudoers.d/users … usersファイルの所有者はrootの為、権限エラー。
# sudo cat /etc/sudoers.d/users … sudoに追加されていても、許可されたコマンドではないためパスワードが要求される。
# sudo rsync --version … sudoに追加されており、且つ許可されたコマンドなのでパスワードが要求されず実行できる。
■設定ファイル
インストール方法 - < for EC-CUBE 4.0 Developers />
https://doc4.ec-cube.net/quickstart_install
「インストール完了後、インストールディレクトリにデータベースの接続情報等が設定された .env ファイルが生成されます。
.env ファイルは、開発用途での環境変数を設定するためのものであり、本番環境での使用は推奨されません。
本番環境では、環境変数をサーバ設定ファイルに設定することを推奨します。
サーバ設定ファイルに環境変数を設定することにより、環境変数が外部に暴露される危険性が減り、安全に運用できます。」
自動作成された .env は削除したうえで、httpd.conf や .htaccess で設定することが推奨される。
例えばインストール完了後に。
/var/www/html/.env
APP_ENV=prod
APP_DEBUG=0
DATABASE_URL=mysql://webmaster:1234@localhost/eccubedb
DATABASE_SERVER_VERSION=5.5.64-MariaDB
MAILER_URL=smtp://smtp.gmail.com:465?username=example@gmail.com&password=xxxxxxxxxxxxxxxx&encryption=ssl&auth_mode=login
ECCUBE_AUTH_MAGIC=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ECCUBE_ADMIN_ALLOW_HOSTS=[]
ECCUBE_FORCE_SSL=false
ECCUBE_ADMIN_ROUTE=system
ECCUBE_COOKIE_PATH=/
ECCUBE_TEMPLATE_CODE=default
ECCUBE_LOCALE=ja
と設定されている場合、以下のようにする。
/var/www/.htaccess
SetEnv APP_ENV prod
SetEnv APP_DEBUG 0
SetEnv DATABASE_URL mysql://webmaster:1234@localhost/eccubedb
SetEnv DATABASE_SERVER_VERSION 5.5.64-MariaDB
SetEnv MAILER_URL smtp://smtp.gmail.com:465?username=example@gmail.com&password=xxxxxxxxxxxxxxxx&encryption=ssl&auth_mode=login
SetEnv ECCUBE_AUTH_MAGIC xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SetEnv ECCUBE_ADMIN_ALLOW_HOSTS []
SetEnv ECCUBE_FORCE_SSL false
SetEnv ECCUBE_ADMIN_ROUTE system
SetEnv ECCUBE_COOKIE_PATH /
SetEnv ECCUBE_TEMPLATE_CODE default
SetEnv ECCUBE_LOCALE ja
ブラウザでアクセスして、.env があるときと同じように表示されるか確認する。
インストール画面が表示される場合、設定内容が認識されていないと思われる。
/var/www 内で .htaccess の利用を許可されているかなどを確認する。
ただしこの設定をした場合、以下の機能を管理画面から設定できなくなる。
・管理画面 → オーナーズストア → テンプレート
・管理画面 → 設定 → システム設定 → セキュリティ管理
また、「セキュリティ管理」の画面に
「 .envファイルが見つかりません。.envを利用していない場合はセキュリティ設定を管理画面から変更できません。」
と表示されるようになる。
この設定をした場合、マイグレーションなど bin/console を使う機能が正しく動作するか確認する。
(「マイグレーションがエラーになるようになった」と報告をもらったことがあるが、勘違いなのかどうかは不明。)
ただしそもそも、上記のように「管理画面から設定できなくなる」が発生するのは後々ややこしそう。
よって
・本番環境では .env の場所を一階層上げる。(開発環境ではそのままでもいい。)
・index.php で「../../.env」があればそれを読み込むという分岐を設ける。
・bin/console で「../../.env」があればそれを読み込むという分岐を設ける。
・src/Eccube/Controller/Admin/Setting/System/SecurityController.php をもとに app/Customize/Controller/Admin/Setting/System/SecurityController.php を作成し、「../../.env」があればそれを読み書きするという分岐を設ける。
という対応の方が良さそう。
実際の案件で試して、現状特に問題なく動作している。
phpdotenvで環境変数を制御する - demolog
http://skitn.hateblo.jp/entry/2018/04/22/212210
phpdotenvについて。 - Qiita
https://qiita.com/H40831/items/aaf8ffa727928661ad1d
■SSLの強制
管理画面 → 設定 → 店舗設定 → セキュリティ管理。
に「SSLを強制」という項目があり、通常はこれにチェックを入れるだけで対応が可能なはず。
ただし「httpsからの接続でなければSSL制限を設定できません。」と補足が書かれていて、AWSのロードバランサー経由で確認するとチェックができない。
ロードバランサーからEC2へのアクセスはSSLでは無いため、恐らく自動判別に失敗しているのだと思われる。
以下で対応はできそうだが、プログラムを編集する必要はある。
ただし上の「設定ファイル」でも index.php と bin/console を編集する案があるので、素直に「本番環境ならSSLを強制」のコードをプログラム内に書くか。
【EC-CUBE4系】Certificate ManagerでHTTPSを導入 | クマひよ工房
https://kumahiyo.com/certificate-manage/
EC-CUBE4カスタマイズ - ロードバランサを使用するとHTTPS・SSLが認識されない場合の対応
https://umebius.com/eccube/behind-load-balancer-ssl/