PowerCMS X ブログ
2023-12-05
規模の大きなウェブサイトやアプリケーションを構成する場合に冗長化構成を求められるケースがあります。
この記事では、AWSを利用した CMSサーバー*の冗長化構成のポイントについてまとめます。
※ 公開側については AWS S3に静的ファイルを配信して Amazon CloudFrontで配信するようなケースが多いと思いますが、説明が複雑化するため、この記事では CMSサーバーに焦点を絞ります。
ポイントは 3つです。
ドキュメントルート配下のコンテンツ以外に、以下のディレクトリを共有ディスクに設定します。lsyncdを使わずに共有ディスクにする理由は以下の通りです。
※ ただし、EFSをマウントしたとして、書き込みが遅い問題やタイムラグが出ることもあります。
/home/がマウントされたディスクだとして、アプリケーションディレクトリを以下に設定します。
/home/www/PowerCMSX
他、以下のディレクトリを共有ディスク配下に設定します。
config.json
"temp_dir": "/home/www/powercmsx-files/tmp",
"cache_dir": "/home/www/powercmsx-files/cache",
"support_dir": "/home/www/powercmsx-files/support",
"assets_c": "/home/www/powercmsx-files/assets_c",
"assets_c_path": "/assets_c/",
"tmpl_paths": [
"/home/www/powercmsx-files/user-customize-files/alt-tmpl"
],
"plugin_paths": [
"/home/www/powercmsx-files/user-customize-files/plugins"
],
"model_paths": [
"/home/www/powercmsx-files/user-customize-files/models"
],
"theme_paths": [
"/home/www/powercmsx-files/user-customize-files/themes"
],
"import_paths": [
"/home/www/powercmsx-files/user-customize-files/import"
],
"htmlimporter_settings_paths": [
"/home/www/powercmsx-files/user-customize-files/import_settings"
],
"log_dir": "/home/www/powercmsx-files/logs",
/home/www/powercmsx-files/user-customize-files/ というやたらと長いパスが指定されているのは、代替テンプレートやモデル定義ファイルなどは、PowerCMS Xではパスの長いものが優先されるためです。
/home/www/PowerCMSX/Plugins/VideoCaptions/alt-tmpl/include/edit/upload_file/column_extra_path.tmpl
/home/www/powercmsx-files/user-customize-files/alt-tmpl/include/edit/upload_file/column_extra_path.tmpl //こちらが優先される
/home/www/PowerCMSX/lib/PAML/models/entry.json
/home/www/powercmsx-files/user-customize-files/models/entry.json //こちらが優先される
あらゆるファイルの読み書きのシーンで EFSが遅いと感じるかもしれませんが、スケジュールタスクについては実行時の一時ディレクトリをローカルの速いディスクに変更できます。「SearchEstraier」や「DocumentSearch」で大量のコンテンツの検索インデックスを洗い替えする時など、ディスクの速度によって実行時間に大きな差が出ます。
config.json
"work_dir": "/var/www/tmp",
※ temp_dirを共有しなければならない理由は、例えばファイルアップロード後に「保存」ボタンをクリックしてオブジェクトを保存する時、違うインスタンスにリクエストが向いてしまうとファイルを保存できないなど、リクエストをまたがって利用されるファイルがあるからです。
PowerCMS Xではデータベースへのクエリのみならず、テンプレートのコンパイル結果など様々なデータをキャッシュすることで高速に動作するようになっています。
望ましいのは Amazon Elastic Cacheを利用することです。PowerCMS Xのキャッシュドライバは「Redis」「Memcacached」に対応しています。
避けるべきは EFS配下にキャッシュディレクトリがある場合にキャッシュドライバに「File」を指定することです。読み書きの遅さの影響を受けて遅くなるからです。
Amazon Elastic Cacheが利用できない場合、「MySQL」を指定してください。最新版では、「MySQL」キャッシュの性能が向上しています。
config.json
"cache_driver": "Redis",
あるいは
"cache_driver": "MySQL",
通常スケジュールタスク(worker.phpなどによって実行されるバッチ処理)は一台で実行するように考えていると思いますが、冗長化構成の時、各々のマシンで異なるタスクを処理するような設定が可能です。
*/10 * * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/worker.php --exclude_ids searchestraier_update_idx,scheduled_publish,scheduled_replacement,scheduled_unpublish
*/10 * * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/worker.php --exclude_ids searchestraier_update_idx --task_ids scheduled_publish,scheduled_replacement,scheduled_unpublish
0 3 * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/rebuildFiles.php archive --urlmapping_ids 1,2,45,46
0 3 * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/worker.php --task_ids searchestraier_update_idx
worker.php 実行時には temp_dir配下に「.pid」ファイル(e12d4d581bc48366a79acf9f5a8b0206.pidなどのハッシュ値)が生成され、次回実行時にファイルが存在する時は実行がスキップされます。
この「.pid」ファイルは worker.php に渡す引数によって異なるファイル名になるため、上記のように実行するタスクを分けて cronに設定することができます。
上から
となります。これを 2台に分散させます。
*/10 * * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/worker.php --exclude_ids searchestraier_update_idx,scheduled_publish,scheduled_replacement,scheduled_unpublish
0 3 * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/rebuildFiles.php archive --urlmapping_ids 1,2,45,46
*/10 * * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/worker.php --exclude_ids searchestraier_update_idx --task_ids scheduled_publish,scheduled_replacement,scheduled_unpublish
0 3 * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/worker.php --task_ids searchestraier_update_idx