このページはJavaScriptを使用しています。JavaScriptを有効にして対応ブラウザでご覧下さい。

最近のMovable Typeでの活用方法や取り組みや、3rd Focusで取り扱っているプラグインの活用方法をご紹介していきます。

インフラ

MT8でこっそり進化したmt-staticの話

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

たじまです。猫の手を借りることはむずかしそうなのでブラックフライデーで孫の手を買いました。
今日は、表向き目立たないものの、一部のエンジニアにはきっと大きな進化となった MT8 での変更点のひとつについて書いておきたいと思います。

mt-static ディレクトリ

さて Movable Type をインストールしてみようと Movable Type のアーカイブを展開すると、mt.cgi などの見慣れたファイルと同じ階層に mt-static ディレクトリが展開されます。これが「スタティックディレクトリ」と呼ばれるディレクトリです。

このディレクトリの用途ですが公式の導入ガイドを見ると

Movable Type の管理画面で利用するスタイルシートや画像ファイル等を保管するディレクトリです。

と書かれている通り、このディレクトリには主に次のファイルが格納されています。

  • jQuery・Bootstrap などのライブラリやスタイルシート・画像ファイルなどの「管理画面で利用する」静的ファイル
  • プラグインとアドオンで追加された「管理画面で利用する」静的ファイル
  • サポートディレクトリ(今回は詳細割愛します)

これらはすべて「管理画面で利用する」静的ファイルです。
管理画面は Webブラウザで表示しますので、このディレクトリは管理画面を使用するにあたって

Web サーバーでそのまま公開する
唯一のディレクトリ

ともいえます。

PSGI/Plack での混乱

ちょっと脇道に逸れます( 飛ばす方はこちら )
Perl で開発されている Movable Type が Webアプリケーションとして動作する仕組み( プログラムと Web サーバーがやりとりする仕組み )としては当初 CGI という仕組み一択だったのですが、長年にわたり続けられてきた開発の中で、新しい仕組みへの対応が行われており、現在 Movable Type は PSGI/Plack という仕組みにも対応しています。

実のところ、Movable Type クラウド版や、Movable Type AMI版は、この PSGI/Plack を用いて動作するよう構成されています。

CGI では、Webサーバー へのリクエストのたびに Perl を起動してスクリプト(主に mt.cgi )を読み込みリクエストを解釈・実行するのですが、PSGI/Plack では、Perl がスクリプト(主に mt.cgi )を読み込んだまま起動しっぱなしで Webサーバーへのリクエストを待つため、リクエストを解釈して実行するまでの手数が少なく、格段にレスポンスが速いというのが最大のメリットになります。

速さは正義!…とも感じますが、実はいくつかのマイナス要素があります。そのひとつが

「Web サーバーの設定めんどい」

面倒なんです。ホント。
というのも、「MT 用の Web サーバー」と「MT 以外(コンテンツ用)の Web サーバー」の2つの Web サーバーを組み合わせて1つに見せなければならないのです。

CGI はその点シンプルです。Apache などの CGI に対応した Web ブラウザさえあれば、CGI の実行設定が行われているディレクトリに Movable Type のアーカイブを展開するだけで(ファイルのパーミッション等の細かい設定はあるものの)基本的な設置としては完了となりました。

PSGI/Plack では、mt.cgi などの Web アプリケーションを PSGI/Plack に対応した Web サーバーで実行しなければならないため、Apache や nginx などの一般的な Web サーバーを使用しつつ、Webアプリケーションへのアクセスは、PSGI/Plack 対応の Web サーバーに中継( Proxy )する方法が一般的になっています。
その場合 Web サーバーの設定のロジックとしては

  • 「アプリケーションディレクトリ」以下の URL( 例:/mt/ )へのアクセスは PSGI/Plack 対応の Web サーバーに中継して MT を実行して管理画面のレスポンスを返す
  • それ以外の URL はドキュメントルート以下のファイルをそのまま公開する

…と、なりそうなんですが、ここで

/mt/mt-static/ どうするんだ問題

に遭遇してしまいます。
この設定だと /mt/mt-static/ 以下にある「スタティックディレクトリ」の URL は PSGI/Plack 対応の Web サーバーに中継され「アプリじゃないから 404 Not Found ね」という末路を辿ることになるのです。
そのため対策として特定のURL以下にアクセスした場合、「スタティックディレクトリ」を表示するよう設定を追加します。

  • 「スタティックディレクトリ用の URL」( 例:/mt-static/ )へのアクセスは対応する「スタティックディレクトリ」以下のファイルを公開する
  • 「アプリケーションディレクトリ」以下のURL( 例:/mt/ )へのアクセスは PSGI/Plack 対応の Web サーバーに中継して MT を実行して管理画面のレスポンスを返す
  • それ以外の URL はドキュメントルート以下のファイルをそのまま公開する

この「スタティックディレクトリ用の URL」のために MT の環境設定ファイル( mt-config.cgi )にも追加の設定が必要となります。
ああ…めんどくさ…

MT8 時代の Web サーバーの設定

そんなわけで本題に戻ります。
MT8 で追加された新機能のほとんどは、MT7 のアップデートでこっそり(?)と実装されてきました。個人的には、脆弱性の修正を行ったバージョンに、新機能が含まれていたりして、心臓が変な鼓動を刻みましたが、今となってはいい思い出です。

MT7 のr.5301 において、こんな環境変数が実装されました。

この説明だけだと、さっぱりかもしれませんが、この設定によって「PSGI/Plack 対応の Web サーバーでスタティックディレクトリを公開する」機能が追加されます。
つまり、先ほど書いた/mt/mt-static/ どうするんだ問題」が解消されているのです。
MT8 では、あんな回りくどい設定しなくてもよくなっているのです。やったね!

そんなわけで、Apache で運用する Web サーバーを例にしますと

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass /mt/ http://localhost:5000/mt/ timeout=300
    ProxyPassReverse /mt/ http://localhost:5000/mt/
</VirtualHost>

このリバースプロキシの設定だけでスタティックディレクトリを含めて MT の管理画面を使用できるようになりました。(※1)
これまでは、スタティックディレクトリを表示するために

Alias /mt-static "/var/www/movabletype/mt-static/"
<Directory "/var/www/movabletype/mt-static">
    AllowOverride None
    Options None
    Require all granted
</Directory>

こんな感じの設定を追加することでスタティックディレクトリを別の URL に割り当てリバースプロキシの対象外にしていたのですが、MT8 からは、これらの設定は必要なものではなくなりました。

さらには、他の機能追加などもあって PSGI/Plack 対応の Web サーバーだけでも管理画面を使えるようになっています。

若干極端な例となりますが、新規のデータベースと環境設定ファイルを用意さえすれば、starman で mt.psgi を実行して

# unzip MT-8.0.2.zip
# cd MT-8.0.2
# starman mt.psgi
2023/11/29-09:35:58 Starman::Server (type Net::Server::PreFork) starting! pid(14905)
Resolved [*]:5000 to [0.0.0.0]:5000, IPv4
Binding to TCP port 5000 on host 0.0.0.0 with IPv4
Setting gid to "0 0 0"

ブラウザで http://localhost:5000/mt/mt.cgi(※1) を開くと

「秒でインストール完了」

…できそうな気分になれます!というかインストールして普通に使えます。
Web サーバーの設定書かなくても使えちゃうというのは、開発環境用途などに重宝しそうです。

※1 環境設定ファイルに次の行が含まれている想定の説明になります。

CGIPath /mt/
AdminScript mt.cgi
DefaultLanguage ja

そんなわけで

MT8 からは PSGI/Plack での導入がぐっと楽になっていますので、これを機に試してみようかって考える人が増えることを願っています。
スタティックディレクトリまわりの機能については、まだ書き足りない気もしますので、また機会あれば書いてみたいと思います。リクエストなどあればお知らせくださいませ。

このエントリーをはてなブックマークに追加
たじま
たじま
エムロジック株式会社の目立たない方
INFORMATION