Movable Type をPSGI/Plack環境で動かす (nginx/Apache)
自宅の近くにジムはありますが、ポケストップがない、tanakaです。
Movable Type + nginx なサーバをPSGI/Plack で構築することがあり、動作が快適だったので、 シーブレインのコーポレートサイトで使っているMovable Type もPSGI/Plack 環境にしてみると快適になりました。 動作は快適になりましたが、環境構築にそれなりに時間がかかったので、手順をまとめておきます。 この手順は、Vagrant で構築したCentOS7 環境です。
Apache + mod_cgi の手順に比べると結構大変でした。 nginx と ApacheでVirtualHostの設定以外差はないので、両方の場合を説明します。
参考文献
以下の記事を参考にして、実際に実行した手順をまとめました。Perlモジュールのインストールに必要なyumパッケージを事前にインストールするようにしてます。
- PSGI Plack 環境で Movable Type を動かす : Movable Type 6 ドキュメント
- デザイナー必見!VPSで高速なMovable Type用サーバをゼロから構築する方法 - エンジニアブログ - スカイアーク
- ぱくたそのMovable TypeをPSGI+nginxとして再インストール設定した。 | ぱくたそ公式ブログ
- さくらのVPS+Apache+PSGIサーバーでMT5.2のmt.psgiを動かす(環境構築編) | Another Sky
インストール方針
以下の方針でインストールします。
- Perlモジュールはなるべく
cpanm
でインストールする - その他はなるべく
yum
でインストールする - 上記の例外パッケージ
- ImageMagick-perlはyumリポジトリから
- nginx: nginx公式yumリポジトリから
- Supervisor:
easy_install
で
- mtインストールディレクトリ:
/var/www/cgi-bin/mt
- ドキュメントルート:
/var/www/mt.local/html
Vagrant環境準備
あらかじめ、hostsファイルに192.168.33.10 mt.local
を追加して、FQDNでアクセスできるようにしておきます。今回環境構築をテストしたVagrantfileは以下の通りです。
Vagrantfile
Vagrant.configure("2") do |config|
Encoding.default_external = 'UTF-8'
config.vm.box = "bento/centos-7.2"
config.vm.box_check_update = false
config.vbguest.auto_update = false
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.provider "virtualbox" do |vb|
vb.gui = false
vb.cpus = 2
vb.memory = "1024"
vb.customize ["modifyvm", :id, "--natdnsproxy1", "off", "--natdnshostresolver1", "off", "--paravirtprovider", "kvm"]
end
end
以下のコマンドで起動&仮想マシンログインしてから環境構築します
vagrant up
vagrant ssh
VirtualHost設定(nginxの場合)
Apacheの場合は飛ばしてください
nginx インストール
$ sudo yum install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ sudo yum install --enablerepo=nginx nginx
$ sudo systemctl enable nginx.service
$ sudo systemctl start nginx.service
VirtualHost設定ファイル /etc/nginx/conf.d/mt.local.conf
server {
listen 80;
server_name mt.local;
root /var/www/mt.local/html;
access_log /var/www/mt.local/logs/access.log main;
error_log /var/www/mt.local/logs/error.log warn;
location /cgi-bin/mt/ {
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:5000;
}
}
nginxを再起動します。
$ sudo /usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo systemctl reload nginx
VirtualHost設定(Apacheの場合)
nginxの場合飛ばしてください。
Apacheインストール
$ sudo yum install httpd
$ sudo systemctl enable httpd.service
$ sudo systemctl start httpd.service
$ sudo mkdir /etc/httpd/logs/mt.local
VirtualHost設定ファイル /etc/httpd/conf.d/virtualhosts.conf
<VirtualHost *:80>
DocumentRoot /var/www/mt.local/html
ServerName mt.local
ErrorLog logs/mt.local/error.log
CustomLog logs/mt.local/access.log common
<Directory "/var/www/mt.local/html">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<IfModule proxy_module>
ProxyPass /cgi-bin/mt/ http://localhost:5000/cgi-bin/mt/
ProxyPassReverse /cgi-bin/mt/ http://localhost:5000/cgi-bin/mt/
</IfModule>
</VirtualHost>
Apacheを再起動します
$ sudo /usr/sbin/apachectl
$ sudo /usr/sbin/service httpd graceful
cpanm インストール
Perlモジュールのインストールに使うコマンドです。
$ sudo yum install perl-App-cpanminus
Plack / Starman インストール
PSGIサーバソフトウェアです。
$ sudo yum install openssl-devel expat-devel
$ sudo cpanm Task::Plack
$ sudo cpanm XMLRPC::Transport::HTTP::Plack
openssl-devel, expat-devel は XMLRPC::Transport::HTTP::Plackインストールに必要です。
Movable Type を展開して、起動してみる
MySQL互換サーバ(mariadb)インストールと設定
$ sudo yum install mariadb-server
$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb
$ sudo /usr/bin/mysql_secure_installation
# rootパスワードを設定し、後の質問にはすべてYで答える
$ mysql -uroot -p
mysql> CREATE DATABASE mt CHARACTER SET utf8;
mysql> GRANT ALL ON mt.* TO mt_user@localhost IDENTIFIED BY '任意のパスワード';
mysql> FLUSH PRIVILEGES;
MT設置
MTのzipファイルをSFTPなどで転送しておきます。
$ sudo yum install unzip ImageMagick-perl
$ unzip MT-6.2.6.zip
$ sudo mkdir -p /var/www/cgi-bin /var/www/mt.local/html /var/www/mt.local/logs
$ sudo mv MT-6.2.6 /var/www/cgi-bin/mt
$ cd /var/www/cgi-bin/
$ HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1`
$ sudo chown -R $HTTPDUSER:$HTTPDUSER /var/www/cgi-bin/mt /var/www/mt.local
$ sudo chmod -R a+x mt/*.cgi
$ sudo cp mt/mt-config.cgi-original mt/mt-config.cgi
$ sudo cp -a mt/mt-static /var/www/mt.local/html/mt-static
mt-config.cgi
# The CGIPath is the URL to your Movable Type directory
CGIPath http://mt.local/cgi-bin/mt/
StaticWebPath http://mt.local/mt-static
StaticFilePath /var/www/mt.local/html/mt-static
##### MYSQL #####
ObjectDriver DBI::mysql
Database mt
DBUser mt_user
DBPassword 【mariadbインストール時に設定した任意のパスワード】
DBHost localhost
## Change setting to language that you want to using.
#DefaultLanguage en_US
DefaultLanguage ja
# PSGI Setting
# https://www.movabletype.jp/documentation/mt6/reference/psgi-plack-movable-type.html
PIDFilePath /var/run/mt/mt.pid
TransparentProxyIPs 1
starman 起動
$ sudo mkdir /var/run/mt
$ HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1`
$ sudo chown $HTTPDUSER:$HTTPDUSER /var/run/mt
$ cd /var/www/cgi-bin/mt
$ sudo -u $HTTPDUSER /usr/local/bin/starman --pid=/var/run/mt/mt.pid mt.psgi
http://mt.local/cgi-bin/mt/mt.cgi にアクセスすると、インストール画面が表示されます。 最初のウェブサイトを作成、の画面では、ウェブサイトパスに「/var/www/mt.local/htmlを指定します」
Movable Typeが動作することが確認できたら、Ctrl+Cで終了します
Supervisor でプロセス管理・自動起動
cgi で Movable Typeを動かしていたときは、プロセス管理はWebサーバ(Apache)が面倒見てくれていましたが、Starmanだとそうではないので、プロセス管理用にSupervisorを使ってみます
$ sudo yum install python-setuptools
$ sudo easy_install supervisor
$ sudo -s
# /usr/bin/echo_supervisord_conf > /etc/supervisord.conf
/etc/supervisord.conf
出力された設定ファイルの最終行を有効にして、サービス毎の設定は /etc/supervisord.d/
に追加するようにする
[include]
files = /etc/supervisord.d/*.ini
$ sudo mkdir /etc/supervisord.d
/etc/supervisord.d/movabletype.ini
テキスト中の user=nginx
は Apacheの場合、 user=apache
としてください。(CentOSの場合)
[program:movabletype]
user=nginx
command=/etc/supervisord.d/movabletype_start.sh
autostart=true
autorestart=true
stopsignal=QUIT
/etc/supervisord.d/movabletype_start.sh
先ほどと同じくテキスト中の --user nginx --group nginx
は Apacheの場合、 --user apache --group apache
としてください。
#!/bin/sh
cd /var/www/cgi-bin/mt
exec /usr/local/bin/starman --listen :5000 --workers 2 --user nginx --group nginx --error-log /var/log/starman/mt.log --pid /var/run/mt/mt.pid ./mt.psgi
ワーカー数オプション --workers
はnprocで調べたCPUコア数に設定します
# nproc
2
実行権限を与え、ログディレクトリも作成します。
$ sudo chmod a+x /etc/supervisord.d/movabletype_start.sh
$ sudo mkdir /var/log/starman
$ sudo chown $HTTPDUSER:$HTTPDUSER /var/log/starman
Supervisordの自動起動設定
pip でインストールしたsupervisor には起動スクリプトがないので 以下のものを設置
$ sudo curl -o /etc/init.d/supervisord https://raw.githubusercontent.com/Supervisor/initscripts/master/redhat-init-mingalevme
$ sudo chmod a+x /etc/init.d/supervisord
$ sudo systemctl enable supervisord
$ sudo systemctl start supervisord
$ sudo /etc/init.d/supervisord status
movabletype RUNNING pid 18783, uptime 0:02:16
starman サーバを終了させてみる
Supervisor をつかって起動したプロセスは、killされたときに自動的に起動するように設定できます。
$ ps aux | grep starman
nginx 25725 0.0 1.0 157776 10264 ? S 11:09 0:00 starman master --listen :5000 --workers 2 --user nginx --group nginx --error-log /var/log/starman/mt.log --pid /var/run/mt/mt.pid ./mt.psgi
nginx 25726 0.4 5.2 328752 53128 ? S 11:09 0:00 starman worker --listen :5000 --workers 2 --user nginx --group nginx --error-log /var/log/starman/mt.log --pid /var/run/mt/mt.pid ./mt.psgi
nginx 25727 0.4 6.2 385756 63408 ? S 11:09 0:00 starman worker --listen :5000 --workers 2 --user nginx --group nginx --error-log /var/log/starman/mt.log --pid /var/run/mt/mt.pid ./mt.psgi
vagrant 25744 0.0 0.0 112664 980 pts/0 S+ 11:11 0:00 grep --color=auto starman
$ sudo kill 18783 18784 18785
$ ps aux | grep starman
nginx 25748 2.3 1.0 157776 10260 ? S 11:11 0:00 starman master --listen :5000 --workers 2 --user nginx --group nginx --error-log /var/log/starman/mt.log --pid /var/run/mt/mt.pid ./mt.psgi
nginx 25749 19.5 5.1 328564 52768 ? S 11:11 0:00 starman worker --listen :5000 --workers 2 --user nginx --group nginx --error-log /var/log/starman/mt.log --pid /var/run/mt/mt.pid ./mt.psgi
nginx 25750 19.5 5.1 328564 52776 ? S 11:11 0:00 starman worker --listen :5000 --workers 2 --user nginx --group nginx --error-log /var/log/starman/mt.log --pid /var/run/mt/mt.pid ./mt.psgi
vagrant 25756 0.0 0.0 112664 976 pts/0 S+ 11:12 0:00 grep --color=auto starman
新しくプロセスが起動していることがわかります。
Supervisor コマンドメモ
mt のサーバを起動するコマンドは以下のようになります。
$ sudo /usr/bin/supervisorctl
movabletype RUNNING pid 18836, uptime 0:01:15
supervisor>
$ sudo /usr/bin/supervisorctl stop movabletype
movabletype: stopped
$ sudo /usr/bin/supervisorctl start movabletype
movabletype: started
参考: 適当なスクリプトをデーモン化するのにSupervisorが便利 - id:anatooのブログ
まとめ
Movable Type をPSGI/Plackで動かすと、CGIに比べて高速に動作します。インストールは面倒ですが、快適になりました。