しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Web サイトに Movable Type 6 をインストールして FastCGI で動かす方法(完全版)

既に Windows Azure Web サイトで Movable Type 6 を動かしてみた - しばやん雑記 では Movable Type 6 を CGI として動かしていたのですが、その後に MySQL が使えない不具合があったり、FastCGI で動かす方法を書いていなかったりしました。

今回は完全版として Azure Web サイトに Movable Type 6 をインストールして、かつ FastCGI で実用的な速度で動かす手順を紹介します。

Web サイトへファイルを展開

Movable Type 6 と Strawberry Perl をダウンロードするのは省略します。このあたりは前回と変わりませんが、今回は Perl ランタイムの配置場所を wwwroot\bin に変更しました。IIS はデフォルトで bin 以下はアクセスできないようになっているので安全です。

f:id:shiba-yan:20140927203124p:plain

temp は前回は作りませんでしたが、Movable Type のセットアップ時に Web サイトの Temp フォルダを認識してくれなかったので、仕方なく作ることにしました。

ファイルの展開が終わったら、管理ポータルから MT_HOME と仮想アプリケーションの追加を行います。

f:id:shiba-yan:20140927203503p:plain

このあたりも前回と変わりません。単純にパスを設定していくだけで問題ないです。

PATH が追加できない問題について

Strawberry Perl はインストール時に PATH へ追加するようになっていますが、Web サイトはマルチテナントなので残念ながらユーザーが自由に PATH を変更することは出来ません。PATH に追加出来ないと MySQL 周りなど、依存するライブラリが読み込めずにエラーになってしまいます。結果として MySQL のドライバが使えなくなるので致命的です。

しかし、プロセス単位で持っている環境変数であれば変更可能なので、だったら自力で追加してしまえば良いじゃないというのが以下のスクリプトです。

use File::Basename 'dirname';
use Cwd 'realpath';

my $perl_dir= realpath(dirname($0));

$ENV{PATH} = "${perl_dir}/perl/site/bin;${perl_dir}/perl/bin;${perl_dir}/c/bin;" . $ENV{PATH};

do shift @ARGV;

今回は boot.pl という名前で上の内容のファイルを作成して、wwwroot\bin の直下に置いておきます。

CGI の設定

Movable Type 6 では FastCGI の環境であっても CGI で動作させないといけないファイルがいくつかあるので、まずはその設定から行います。と言っても、以下のような Web.config を mt.cgi と同じディレクトリに置いておくだけです。

<?xml version="1.0"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="CGI-mt-check"
           path="mt-check.cgi" verb="*"
           modules="CgiModule" scriptProcessor='D:\home\site\wwwroot\bin\perl\bin\perl.exe D:\home\site\wwwroot\bin\boot.pl "%s" %s'
           resourceType="Unspecified" />
      <add name="CGI-mt-wizard"
           path="mt-wizard.cgi" verb="*"
           modules="CgiModule" scriptProcessor='D:\home\site\wwwroot\bin\perl\bin\perl.exe D:\home\site\wwwroot\bin\boot.pl "%s" %s'
           resourceType="Unspecified" />
      <add name="CGI-upgrade"
           path="mt-upgrade.cgi" verb="*"
           modules="CgiModule" scriptProcessor='D:\home\site\wwwroot\bin\perl\bin\perl.exe D:\home\site\wwwroot\bin\boot.pl "%s" %s'
           resourceType="Unspecified" />
    </handlers>
    <cgi createProcessAsUser="false" />
  </system.webServer>
</configuration>

scriptProcessor は perl.exe に bool.pl をまず読み込ませてから、実際に動かしたい CGI のパスを引数として指定するような書き方にしています。

ついでに mt-static の直下には MIME として json を追加する Web.config を置いておきましょう。

FastCGI の設定

基本的には Azure Web サイトでは管理ポータルからハンドラーマッピングの設定を行えば、それだけで FastCGI として設定がされるので動くようになってます。例えば、まだ対応していない PHP 5.6 も自分でファイルをアップロードして、ハンドラーマッピングから追加すれば動作します。

それは Perl も同様で Strawberry Perl や ActivePerl などを自分でアップロードして、ドキュメント通り設定を行えば FastCGI ですんなり動作します。

Microsoft IIS サーバーで FastCGI を利用する : Movable Type 6 ドキュメント

Site Extensions を使って一括でハンドラーマッピングの設定を行ってもいいのですが、Web サイトではモードによって設定が変わるようになっているので、管理ポータルから追加しておいた方が安全です。

内容としては以下のように追加していくだけです。ファイル名だけ変更する形ですね。

拡張
mt.cgi
スクリプトプロセッサパス
D:\home\site\wwwroot\bin\perl\bin\perl.exe
追加の引数
D:\home\site\wwwroot\bin\boot.pl D:\home\site\wwwroot\app\mt604\mt.cgi

実際に設定するとこんな感じになります。

f:id:shiba-yan:20140927213035p:plain

数が多いですが、頑張って追加します。PowerShell とかで自動化出来るとは思いますが、とりあえず最初だけなので。

Movable Type のセットアップ

これまでの作業で Movable Type 6 を FastCGI で動かす準備が完了したので、セットアップを行います。/mt にアクセスするとセットアップウィザードが始まるので、それに従って進めていきます。

f:id:shiba-yan:20140927210136p:plain

このウィザードは CGI なのでとても表示が遅いですが、それはどうしようもないので諦めます。

データベース設定では MySQL が選べるようになっているので選択し、ClearDB の接続情報を入力すれば先に進めるようになります。

f:id:shiba-yan:20140927210345p:plain

途中でメールアドレスとか SMTP サーバーの設定画面も出てきますが、SendGrid を使うのが Azure では便利でしょうね。無料版あります。

問題になるのがテンポラリディレクトリの設定です。Web サイトにはサイトごとに Temp ディレクトリが用意されていますが、何故かそのパスを指定してもテストが通りません。

f:id:shiba-yan:20140927210813p:plain

前回は通っていたので、ディレクトリに ~ が含まれるようになったのが原因じゃないかと見ています。仕方ないので今回は wwwroot 以下に temp ディレクトリを作って、そのパスを指定することにします。

後はアカウントやサイトの情報を入力していけば DB の初期化が始まります。

f:id:shiba-yan:20140927214815p:plain

全ての処理が終わると Movable Type 6 へのサインイン画面になるので、先ほど登録したユーザー名とパスワードでログインするとダッシュボードが表示されると思います。

f:id:shiba-yan:20140927215201p:plain

最後にセットアップが完了したら、mt-config.cgi に以下の設定を追加し、Web サイトを再起動しておきます。

NoTempFiles 1

これは Movable Type 6 の書き込み処理と Web サイトのファイルシステムの相性が悪いのか、記事のパブリッシュ時にエラーになってしまうため、テンポラリファイルを作成しないようにしておきます。

FastCGI で動いているか確認

ダッシュボードにログイン後に Process Explorer を確認すると、perl.exe が立ち上がりっぱなしになっていることが確認できます。FastCGI の挙動ですね。

f:id:shiba-yan:20140927190648p:plain

そして Movable Type 6 のシステム情報を確認すると、サーバーモデルが FastCGI になっています。

f:id:shiba-yan:20140927192516p:plain

これで全ての作業が完了しました。何時かは Perl に Web サイト側で対応するのかもしれないですが、まだしばらく時間がかかりそうなので参考にしてください。

今回は Perl のランタイムを wwwroot 以下に入れたことや、ハンドラーマッピングと仮想アプリケーションの追加以外で環境を弄る部分が無いため、ランタイムを含めてパッケージ化を行い、msbuild でデプロイなども可能になるかと思います。*1

失敗談

最初は Perl のコードを使わずにバッチファイルだけで何とかならないかと試してみたところ、バッチファイルだけでもコマンドを工夫することで FastCGI として動作させることは出来ました。

D:\Windows\System32\cmd.exe /U /c D:\home\site\wwwroot\bin\perl.cmd ...

cmd.exe にそのままバッチファイルのパスを渡すと、内部で起動されたプロセスと標準入出力が別々になるらしいので /U オプションを付けてリダイレクトさせるようにします。

しかし、この方法だと IIS と Perl の間に cmd.exe が挟まることになるので、IIS が FastCGI プロセス*2を終了させる時に、Perl のプロセスだけが残ってしまうため残念ながら使えませんでした。

CGI として使う分にはバッチファイルを使うのはありな感じはします。

*1:ハンドラーマッピングと仮想アプリケーションの追加は Azure PowerShell や xplat-cli で設定可能ですし

*2:つまりこの場合は cmd.exe