PowerCMS™
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[新着情報] PowerCMS 5.26 パッケージ差し替えについて を追加しました。
[よくあるご質問] Copy2Public / PowerSync で「日時指定」を選択して同期が行えない原因は何ですか? を追加しました。
[ブログ] PowerCMS サポートの実績 (2024年1月) を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > 技術情報 > 管理画面のサーバーモデルを PSGI にする

2023年12月15日

管理画面のサーバーモデルを PSGI にする

これは「Alfasado Inc. / LAB Inc. Advent Calendar 2023」の15日目の記事です。

PowerCMS を従来型の CGI ではなく、常駐型アプリサーバーの PSGI で利用すると、管理画面の利用で軽快な応答を体感できるかと思います。

従来型の CGI では、画面操作によって Web ブラウザーから CMS へとリクエストが来るたびに「必要なプログラムやライブラリーをストレージから読み込んで、メモリー上にプロセスとして起動し、プロセスが要求を CPU で処理して結果を応答し、終了後にリソースを開放する」という初期化から終了までを繰り返すので、本来の処理の前後に付加的な負荷が発生します。 それに対して PSGI では、初期化されたワーカーと呼ばれるプロセスが起動したまま常駐して待ち構え、ブラウザーからの要求の処理と応答だけを繰り返します。 どちらのサーバーモデルも処理する速度は同じですが、PSGI は初期化や終了をしない分だけ全体としては高速で、通常は利用者としても体感できるほど速くなります。

その一方で PSGI では、管理画面を始めとする PowerCMS の各種アプリへのリクエストが集中したとき、相応のワーカー数やサーバーの性能を用意できなければ、応答性が悪くなります。 そのような状況でも CGI は、時間をかけながらも PSGI より多くリクエストに応答できる傾向があり、安定感はあります。

一般に公開するカスタムフォーム (mt-contactform.cgi) やサイト内検索 (mt-estraier.cgi) などのアプリは CGI で運用するけど、管理画面 (mt.cgi) は PSGI でサクサク利用したい。 あるいは一定の運用で得られた傾向から、特定のアプリだけ CGI 方式を選択したい。 今回はそのような要求に応えるべく、1つの PowerCMS で PSGI と CGI をうまく使い分けるサーバー設定のヒントを簡単に説明します。

PowerCMS のアプリケーションディレクトリ ($MT_HOME) が「/var/www/cgi-bin」で、サーバーモデルは CGI を利用、sudo が利用できるサーバー OS の管理者という前提です。 まず、PowerCMS の環境設定ファイル (mt-config.cgi) を複製して、PSGI 用の CMS 環境変数「PIDFilePathを追加します。

PSGI 用環境設定ファイルの複製と CMS 環境変数「PIDFilePath」の追加
MT_HOME=/var/www/cgi-bin
MT_CONFIG=$MT_HOME/mt-config.cgi
sed '/^ *\(#\|$\)/d' $MT_CONFIG | sudo sed --quiet "w $MT_HOME/config-admin.cgi"
sudo chown --verbose --reference=$MT_CONFIG $MT_HOME/config-admin.cgi
'/var/www/cgi-bin/config-admin.cgi' の所有者を root:root から apache:apache へ変更しました
sudo chmod --verbose --reference=$MT_CONFIG $MT_HOME/config-admin.cgi
'/var/www/cgi-bin/config-admin.cgi' のモードは 0644 (rw-r--r--) として保留されました
echo "PIDFilePath  /run/powercms.pid" | sudo sed --quiet "w $MT_HOME/config-admin.cgi"
tail -3 $MT_HOME/config-admin.cgi
AdminScript       powercms
ContactFormScript form
PIDFilePath  /run/powercms.pid

この複製により、環境設定ファイルで CMS 環境変数を追加・変更するときは、二重管理する必要がありますので注意してください。

PSGI では複製した環境設定ファイル「/var/www/cgi-bin/config-admin.cgi」を使用するように、サーバー環境変数「$MT_CONFIG」を追加します。 この環境では PSGI を systemd で管理していて、ユニットファイルで環境変数を追加しています。

サーバー環境変数「MT_CONFIG」による PSGI (starman) 用の環境設定ファイル変更
sudo systemctl edit --full powercms.service
systemctl cat powercms.service
# /etc/systemd/system/powercms.service
[Unit]
Description=PowerCMS app server (PSGI)
After=mysqld.service
Requires=mysqld.service

[Service]
WorkingDirectory=/var/www/cgi-bin
ExecStart=/usr/local/bin/starman --listen :5000 --user apache --group apache --error-log /var/log/powercms/error.log --pid /run/powercms.pid --disable-keepalive --max-requests 100 --workers 4 ./mt.psgi
Environment="MT_HOME=/var/www/cgi-bin" "MT_CONFIG=/var/www/cgi-bin/config-admin.cgi" "PERL5LIB=/var/www/cgi-bin/extlib"
Restart=always

[Install]
WantedBy=multi-user.target
sudo systemctl restart powercms.service

Apache HTTP サーバー (httpd) の設定を変更します。 この環境では管理画面のパスを既定の「mt.cgi」から「powercms」、カスタムフォームのパスを既定の「mt-contactform.cgi」から「form」に変更してあります。

httpd.conf の編集
#
# "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
    SetEnv MT_HOME /var/www/cgi-bin
    <Files form>
        SetHandler cgi-script
    </Files>
</Directory>

<IfModule proxy_module>
    ProxyPass        /cgi-bin/powercms http://localhost:5000/cgi-bin/powercms connectiontimeout=3 timeout=600
    ProxyPassReverse /cgi-bin/powercms http://localhost:5000/cgi-bin/powercms
</IfModule>
設定の変更を httpd.service に反映
sudo systemctl reload httpd.service

管理画面でシステム情報を開き、サーバーモデルが「PSGI」となっていることを確認してください。 また、一時的に PSGI のアプリサーバー (starman) を終了させてみて、管理画面 (/cgi-bin/powercms) の応答はエラー (503 Service Unavailable) となる一方で、サイトの問い合わせフォームから確認画面 (/cgi-bin/form) に進むことができれば、フォームのアプリが CGI で動作していることを確認できます。

Have a merry Christmas. 🎄


カテゴリー
技術情報

Recent Entries