2012年11月28日
PowerCMS 3.2 を PSGI 環境で運用する
はじめに
PSGI は、Perl Web Server Gateway Interface の略で、Perl ウェブアプリケーションについて、個々のウェブサーバーに対応したコードを記述することなく、効率的に開発できるように規定したインターフェイスです。
従来の PowerCMS は、各種ウェブサーバーに対応したコードを記述していましたが、PowerCMS 3.2 以降では PSGI に正式に対応しており、要件にあわせて様々なウェブサーバーを活用できるようになりました。
PSGI に対応したアプリケーションは、PSGI サーバーという PSGI に準拠したウェブアプリケーションサーバーで動作します。加えて CGI アプリケーションと異なり、アプリケーションサーバー上に永続化して動作するため、レスポンスがよくなります。
PSGI サーバーの多くは、簡易的なウェブサーバー機能しか実装されていません。そのため、実際の運用では Apache や nginx といったウェブサーバーのリバースプロキシ機能を活用し、バックエンドに PSGI サーバーを配置するようにします。
今回は、DynamicMTML を利用することを考慮し、CentOS 6.3 の環境で Apache をフロントエンドに、バックエンドには PSGI サーバーのひとつである Starman を採用した環境を構築する方法を解説いたします。(DynamicMTML やダイナミック・パブリッシングを利用しない場合は、フロントエンドに nginx を採用できます。nginx を利用した構築方法は別の機会に解説します。)
なお、既に Apache、MySQL、PHP 等はインストールされているものとし、以下のように PowerCMS 3.2 がインストールされているものとします。
- アプリケーションディレクトリ (PowerCMS を実行するスクリプトやライブラリを保管するディレクトリ): /var/www/cgi-bin/mt
- スタティックディレクトリ (PowerCMS の管理画面で利用するスタイルシートや画像ファイル等を保管するディレクトリ): /var/www/html/mt-static
- ウェブサイトディレクトリ (PowerCMS が作成するウェブサイトを保管するディレクトリ): /var/www/html
- PowerCMS ディレクトリ (PowerCMS が利用するキャッシュやリビジョンのバックアップデータ等の各種ファイルを保管するディレクトリ): /var/www/powercms_files
- 管理画面 URL: http://www.example.com/cgi-bin/mt/mt.cgi
注:解説するコマンドは、すべて root アカウントでの実行を前提としてています。sudo 等適宜追加してください。
開発ツールのインストール
PSGI 環境に必要なソフトウェアをインストールするために、開発ツールをインストールします。以下のコマンドを実行してください。
yum -y groupinstall "Development tools" yum -y install wget
yum リポジトリの追加
PSGI 環境に必要なパッケージをインストールするために、以下のコマンドを実行して、リポジトリを追加します。
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm rpm -Uvh epel-release-6-7.noarch.rpm
次に、追加したリポジトリの環境ファイルを編集します。
vi /etc/yum.repos.d/epel.repo
なお、[epel] セクションの enabled 行を以下のように編集します。
enabled=0
Starman のインストール
PSGI サーバー Starman をインストールするために、Perl モジュールを取得・ビルド・インストールするコマンド cpanm を先にインストールします。
yum -y install perl-ExtUtils-MakeMaker curl -L http://cpanmin.us | perl - --sudo App::cpanminus
※ sudoで実行する場合、sudoのタイムアウトが短いとパスワードの入力が数度発生します。そこで事前に visudo で Defaults timestamp_timeout の値を調整しておきます。
以下のコマンドを実行し、cpanm のインストールが完了したことを確認します。
cpanm --help
cpanm のインストールが完了したら、以下のコマンドを実行し Starman をインストールします。
cpanm Plack cpanm Task::Plack cpanm XMLRPC::Transport::HTTP::Plack cpanm CGI::Parse::PSGI cpanm CGI::PSGI
※ 最後の2つのモジュールは場合によってはインストール済みになります
※ XMLRPC::Transport::HTTP::Plack については、2024年6月20日現在不要となりました。
PSGI サーバー起動用スクリプトの作成
インストールした Starman を起動するためのスクリプトを作成します。最初にスクリプトを保管するディレクトリを作成します。
mkdir -p /var/www/tools
以下の内容を /var/www/tools/mt.sh として保存します。なお、workers の値はサーバーの CPU コア数にあわせて調整してください。
#!/bin/sh cd /var/www/cgi-bin/mt exec /usr/local/bin/starman --listen :8000 --workers 2 --user apache --group apache --error-log /var/log/starman/mt.log --pid /var/www/tools/mt.pid ./mt.psgi
保存したスクリプトに対して実行権限を設定します。
chmod +x /var/www/tools/mt.sh
Starman が出力するログを保管するディレクトリを作成します。
mkdir -p /var/log/starman
環境設定ファイル mt-config.cgi の修正
環境設定ファイル mt-config.cgi の CGIPath または AdminCGIPath について、相対表記から絶対表記に変更します。
- 変更前
CGIPath /cgi-bin/mt/
- 変更後
CGIPath http://www.example.com/cgi-bin/mt/
また、以下を追記した後に保存します。
PidFilePath /var/www/tools/mt.pidここでは mt.sh ファイル中で引数 pid の値であるファイルのパスを指定します。
Apache にリバースプロキシを設定
yum 経由で Apache をインストールしている場合、リバースプロキシ機能に必要なモジュールはインストールされています。設定ファイルに、以下の内容を記述してください。
<IfModule mod_proxy.c> ProxyRequests Off ProxyPass /cgi-bin/mt/ http://localhost:8000/cgi-bin/mt/ ProxyPassReverse /cgi-bin/mt/ http://localhost:8000/cgi-bin/mt/ </IfModule>
Apache を再起動します。
service httpd restart
Supervisor
Supervisor は、サーバーのプロセスを死活監視するアプリケーションです。今回は Starman の死活監視を実行します。以下のコマンドを実行し、Supervisor をインストールします。
yum -y --enablerepo=epel install supervisor
設定ファイル /etc/supervisord.conf に、以下の内容を追記します。
[program:mt] user=apache command=/var/www/tools/mt.sh autostart=true autorestart=true stopsignal=QUIT
※ /var/www/tools を Apacheが書き込めるように設定します。例:
chown apache:apache /var/www/tools/
Supervisor を起動します。
chkconfig --level 2345 supervisord on service supervisord start
確認方法
http://www.example.com/cgi-bin/mt/mt.cgi?__mode=tools&blog_id=0
上記にアクセスし、[サーバーモデル] が PSGI になっていればインストール成功です。
トラブルシューティング
Starman ならびに Supervisor のログは、それぞれ以下のディレクトリ下に出力されます。
- Starman: /var/log/starman
- Supervisor: /var/log/supervisor
また、何らかの理由で Starman のプロセスを再起動したい場合は、以下のコマンドを実行します。
pkill starman
北市真
2013年9月22日 02:53素晴らしい記事をありがとうございます。
書かれているとおりに設定したところ、一つ問題に遭遇しました。
Starmanをシェルスクリプト(mt.sh)経由で起動すると、PIDファイル(/var/www/tools/mt.pid)に書き込まれるPIDと、StarmanのマスタープロセスのPIDとにずれが生まれて、supervisorctl stop mtした時にプロセスが死にませんでした(SIGQUITがStarmanでなく、mt.shを実行しているシェルの方に送られる)。
結果、suervisorctl restart mtなどした時に、
* 元のプロセスが存在する(Starmanプロセスが増える)
* PIDファイルが存在するためにmt.shで起動するStarmanがエラーになる
* 上のエラーは子プロセスのエラーで親プロセスではないので、新しいプロセス自体は終了せず、エラーログが増え続ける
という問題を体験しました。
ひとまず、Supervisorの設定ファイルの
command=/var/www/tools/mt.sh
とある所にmt.shの内容を写して
command="cd /var/www/cgi-bin/mt && /usr/local/bin/starman --listen :8000 --workers 2 --user apache --group apache --error-log /var/log/starman/mt.log --pid /var/www/tools/mt.pid ./mt.psgi"
とすることで回避できましたが、なにかよい設定方法はあるでしょうか?
こちらの環境の問題でしょうか?
* CentOS 5.4
* Perl 5.10
* Supervisor 3
という環境をVagrantで作って確認しております。
サポート担当から北市真への返信
2014年3月25日 12:26北市様
ご質問いただいた件ですが、こちらで試してみたところ同じ事象が発生いたしました。
したがって、環境依存の問題ではないようです。
対応方法としては、
> ひとまず、Supervisorの設定ファイルの
>
> command=/var/www/tools/mt.sh
>
> とある所にmt.shの内容を写して
>
> command="cd /var/www/cgi-bin/mt && /usr/local/bin/starman --listen
> :8000 --workers 2 --user apache --group apache --error-log
> /var/log/starman/mt.log --pid /var/www/tools/mt.pid ./mt.psgi"
>
> とすることで回避できましたが、なにかよい設定方法はあるでしょうか?
> こちらの環境の問題でしょうか?
ご指摘の通り、supervisor が kill するプロセスがズレてしまっていることが原因のようです。
したがって、上記の方法で問題ないと思います。
または、下記のサンプルのように exec コマンド経由で starman を起動することで、 supervisorctl stop mt によって、プロセスが終了することを確認いたしましたので、一度お試しいただけますでしょうか。
#!/bin/sh
cd /var/www/cgi-bin/mt
exec /usr/local/bin/starman --listen 8000 --workers 2 --user apache --group apache --error-log /var/log/starman/mt.log --pid /var/www/tools/mt.pid ./mt.psgi
記事の内容については、上記を踏まえて修正いたしました。
ご指摘ありがとうございました。