CentOS 7.1 (1503)でMovable Type 6をPSGIとApache 2.4で動かす

2015年9月26日(土)

このブログはMovable Typeではないですが、CentOS 7でMovable TypeをPSGIで動作させた時の設定を記しておきます。

前回のApacheとPHP-FPMも同じ組み合わせの情報はありませんでしたが、今回も同じ構成の情報がなかったので、またいろんな情報を参考にまとめました。

調べ物をしていてたまにあるのですが、記事に日付が入っていないブログがあります。
情報の鮮度がわからないので、せっかく記事にしてあるのに残念ですね。

本題です。
前回設定した環境がベースです。

CentOS 7
Apache 2.4 (suEXEC有効)
MariaDB 5.5
Memcached
PHPは、今回関係ないですね。

依存関係などで後から問題を出したくないので、今回も基本的に標準レポジトリしか使いません。
どうしてもパッケージがない場合にEPELのみ使用します。
PerlのモジュールでEPELにもパッケージがない場合にのみcpanmでインストールします。
cpanmもlocal::libを使用してOS標準のディレクトリに入れず、何かあってもOSに問題が及ばないようにします。

というわけで、まずはyumでcpanmとlocal::libをインストールします。

# yum -y install perl-App-cpanminus perl-local-lib

local::libを有効にするため、zshなので.zshrcに下記を追加します。
bashなら.bashrcでしょうか。

eval $(perl -Mlocal::lib)

設定ファイルを再読込します。
# source .zshrc

次に、MT6を設置します。
suEXECなので、パーミッションをディレクトリは701、cgiは700にします。
mtcheck.cgiにアクセスして、必要なモジュールを確認します。

yum searchで探すわけですが、CentOS 7で必要だったものをとりあえず結果だけ書いておきます。

標準レポジトリからインストール
# yum install perl-IPC-Run perl-XML-LibXML perl-Crypt-SSLeay perl-GD perl-Archive-Tar ImageMagick-perl perl-YAML-Syck perl-Mozilla-CA perl-Net-SMTP-SSL

EPELレポジトリからインストール(Cache::Memcachedもついでに入れておきます)
# yum install perl-Net-SMTPS perl-Cache-Memcached perl-Crypt-DSA perl-Plack –enablerepo=epel

これで、足りないものが、
Cache::File
Imager
XML::SAX::Expat
XML::SAX::ExpatXS
CGI::PSGI
XMLRPC::Transport::HTTP::Plack
になります。

上記をcpanmでインストールします。
一部依存関係のビルドで失敗してしまうので、yumでもう少しモジュールを足します。

Imager用
# yum -y install libjpeg-devel libpng-devel giflib-devel
XML::SAX::ExpatXS用
# yum -y install expat-devel
XMLRPC::Transport::HTTP::Plack用(依存関係のSOAP::Liteのインストールが失敗する)
# yum install perl-SOAP-Lite –enablerepo=epel

cpanmでインストールします。
# cpanm Cache::Fil XML::SAX::Expat XML::SAX::ExpatXS CGI::PSGI XMLRPC::Transport::HTTP::Plack

local::libなので、このままだとcpanmでインストールしたものはパスが通ってないので、mt-check.cgiで足りないと相変わらず言われます。
ApacheがsuEXECなので、SetEnv PERL5LIBも使用できません。

MT5.1以降で使用できるLocalLibを使用します。

PerlモジュールをsuEXECの実行ユーザーのhomeにコピーします。
# cp -r ~/perl5 /home/user

mt-config.cgiに下記を追加します。

LocalLib /var/www/home/user/perl5/

前回、suEXECのために、/homeを/var/www/homeとして、マウントしています。

これで、必要なモジュールはすべてそろいました。
Movable Typeをインストールして設定します。

Memcachedも有効にします。mt-config.cgiに下記を追加します。

MemcachedServers localhost:11211

CGIでの動作であればこれで終了です。

CGIからPSGIに切り替えます。
ここまでの手順で、すでに下記のコマンドでPSGIとして動作が可能です。
# cd /path/to/mt
# plackup mt.msgi

ですが、

plackup コマンドで起動される Web サーバーはリクエストを順次処理するシンプルな実装であるため、例えば自身の記事に対してトラックバックを送信した場合などのときにデッドロックが発生します。

MTの公式に書いてあるので、PSGIサーバはStarman/Starletを使用します。

“plackup mt.psgi”で起動した状態だと、システム情報でmt-check.cgiが存在するのにないと言われたりするのも、上記の問題かもしれません。

Task::Plackをcpanmでインストールします。
こちらも一部依存関係のビルドで失敗してしまうので、yumでモジュールを足します。

Task::Plack用(依存関係のMouseのインストールが失敗する)
# yum install perl-Mouse –enablerepo=epel

cpanmでインストールします。割と時間がかかります。
# cpanm Task::Plack

もう一度、PerlモジュールをsuEXECの実行ユーザーのhomeにコピーしておきます。
# cp -r ~/perl5 /home/user

MTの公式ではStarmanを使用することを想定と記載がありますが、
StarmanよりもStarletの方が速いとのことなので、Starletを使用します。
# cd /path/to/mt
# plackup -s Starlet mt.msgi

これで、PSGIで動作するようになりました。

が、シェルを閉じると止まってしまいます。
screenで動かしてもいいですが、再起動のたびに自分で立ち上げないといけません。
サービスとして動作させます。

起動スクリプトを作成します。
場所はどこでもいいですが、/opt/local/binに入れることにします。

# vi /opt/local/bin/mtrun

#!/bin/sh
eval $(perl -Mlocal::lib)

MTPATH=/path/to/mt
PSGI=mt.psgi

cd $MTPATH

plackup -s Starlet $PSGI

local::libを使っているので、eval $(perl -Mlocal::lib)が必要です。
Starmanを使う場合は、最後がstarman –preload-app $PSGIになります。

# chmod +x /opt/local/bin/mtrun

サービスを追加します。
CentOS 7はsystemdなので、下記のようになります。

# vi /etc/systemd/system/mtpsgi.service

[Unit]
Description=Movable Type PSGI Service
After=network.target

[Service]
ExecStart=/opt/local/bin/mtrun
User=user
Group=user
Restart=on-failure

[Install]
WantedBy=multi-user.target

Descriptionは適当です。
ExecStartで作成した起動スクリプトを指定します。
User、GroupはApacheのsuEXECと同じユーザーを指定します。指定しないとアクセス権で問題が起こります。

# systemctl start mtpsgi.service
# systemctl enable mtpsgi.service

最後に、Apacheのリバースプロキシの設定をします。
VirtualHostの中に、ProxyPass、ProxyPassReverseを追加します。

<VirtualHost *:80>
ProxyPass /mt http://localhost:5000/mt
ProxyPassReverse /mt http://localhost:5000/mt
</VirtualHost>

# systemctl restart httpd

リバースプロキシを設定すると、MTのログのIPアドレスがすべて127.0.0.1で記録されてしまうので、
mt-config.cgiに下記を追加します。

TransparentProxyIPs 1