Movable Type をPSGI/Plack環境で動かす (nginx/Apache)

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パッケージを事前にインストールするようにしてます。

インストール方針

以下の方針でインストールします。

  • 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に比べて高速に動作します。インストールは面倒ですが、快適になりました。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ