なぜ、MT5.2ではnginx/PSGIに対応したのか。
こんにちは。自転車での移動が快適になって嬉しい柳下です。
早いもので、Movable Typeも5.2がリリースされて、もうすぐ1カ月になります。今日は、5.2の特長の1つであるnginxとPSGI対応について、その背景からご紹介していきたいと思います。
最近、スマートフォン・タブレットへの対応、Amazonをはじめとするクラウド環境上での構築に関するお問い合わせをいただく機会が多くなっています。スマートフォン・タブレットからのアクセスが日々増えていく中で、LTEに代表される高速なモバイル回線があるとはいえ、14Mbps (下り理論値)が通常のモバイル回線でのアクセスを前提としたデザインが必要とされています。また、クラウド環境では、コストパフォーマンスの観点から、限られたリソースを最大限に活用することも求められています。これらの背景から、ウェブサーバーをはじめとする環境のチューニングへの要望は高まっていくばかりです。
Movable Type 5.2 におけるnginxとPSGI対応は、限られたリソースを最大限に活用するチューニングへの要望に応えるために実装したものです。
今回は、Movable Typeの管理画面 (mt.cgi) のパフォーマンスの最適化を題材に、nginxとPSGI対応の意味を解説します。なお、具体的な設定方法や、再構築に関するパフォーマンスの最適化については、別の機会でご紹介したいと思います。
mt.cgi のパフォーマンスの最適化では、処理に関する負荷が異なることから、「静的コンテンツ出力」と「Perlスクリプトによる動的コンテンツ出力」とわけて考えます。
静的コンテンツ出力のパフォーマンス最適化
mt.cgiでは、一般的なウェブサイトと同様に、JavaScriptやCSS、画像ファイルを利用します。これら静的コンテンツの出力のパフォーマンス最適化には、以下の方法があげられます。
- 有効期限を使ったブラウザキャッシュの活用
- 転送するファイルの数の低減
- 転送するファイルのサイズの低減
- Google Analyticsやソーシャルメディアに関するJavaScriptの非同期ロード
これらの方法を実施することで、Apacheでもレスポンスが良くなります。しかし、ウェブサーバーをnginxに変更することで、よりレスポンスを高めることができます。最近、多くの注目を浴びているnginxは、アーキテクチャの違いから、Apacheよりも1秒あたりの処理可能な要求数が多く、またレスポンス時間も短いという特長があります。すなわち、Apacheを「静的コンテンツ出力」に利用する特別な理由が無い限り、nginxを利用した方が望ましいといえます。加えて、nginxの環境においても、前述の設定方法は有効です。このように、「静的コンテンツ出力」において、様々なレベルで最適化をはかることができます。
PSGIに対応することで新しいウェブサーバーに対応
前述のように、構築するサイトの特徴にあわせて、ウェブサーバーを選択できるようになりました。しかし、nginxの環境では、Movable Typeの管理画面 (mt.cgi)を、そのまま起動することはできません。理由は、nginxでは、アーキテクチャの違いから、CGIに対応していないためです。Movable Typeは、以前使われていた mod_perl 1.xに対応するためのコードがあります。しかし、今後、異なるウェブサーバーのアーキテクチャに対応するために、アプリケーション側でその違いを吸収することは理想的な対応方法とはいえません。解決方法として選択した方法がPSGIに対応することでした。
PSGI (Perl Web Server Gateway Interface)は、以前シックス・アパートに在籍していた宮川達彦氏が、Perlウェブアプリケーションが、個々のウェブサーバーに対応したコードを記述することなく、効率的に開発できるように規定したインターフェイスです。Movable TypeはPSGIに対応したことで、今後増えるであろうウェブサーバーにおいても、ウェブサーバー側がPSGIに対応することで動作するようになるわけです。
Perlスクリプトによる動的コンテンツ出力のパフォーマンス最適化
さて、PSGIに対応したことで、より様々なウェブサーバー上で動作できるようになりました。次に「動的コンテンツの出力」の最適化について考えます。「動的コンテンツの出力」の最適化において、システム構成の拡張性を考慮した解決方法は「リバースプロキシを導入すること」です。
リバースプロキシを導入すると、処理に負荷がかかる「動的コンテンツ出力」をバックエンドのアプリケーションサーバーに転送できます。たとえば、nginxで構築しているサイト http://example.com において、 http://example.com/cgi-bin/mt/mt.cgi のようにmt以下へのリクエストがあったときのみ、Perlスクリプトを実行できるアプリケーションサーバーに転送するわけです。このリバースプロキシ機能は、Apacheやnginxにも搭載されているだけでなく、個別にサーバーを設置することもできます。このように、リバースプロキシは、システムの構成やパフォーマンスの最適化の上で、重要な要素といえるわけです。
バックエンドのアプリケーションサーバーにはApacheを利用できます。しかし、Perlスクリプトの処理がよりはやく、PSGIに対応したサーバーを利用した方が、より効果があがります。Movable Type 5.2では、Starmanというサーバーで動作を確認しています。
まとめ
- 日々高まるウェブサーバーのパフォーマンスの最適化において、「静的コンテンツ出力」と「動的コンテンツ出力」にわけて考えることは重要。
- リバースプロキシを導入すると、「静的コンテンツ出力」と「動的コンテンツ出力」にわけて処理できる。
- 「静的コンテンツ出力」の最適化には様々な方法があるが、軽量で高速なウェブサーバーのnginxを導入すると、効果がより高くなる。
- 「動的コンテンツ出力」の最適化では、軽量かつPerlスクリプトの処理が速いStarmanを導入すると、効果がより高くなる。
- Starmanも対応しているPSGIに対応することで、今後増えてくるであろう高速なウェブサーバーを採用できる。
このように、nginxとPSGIへの対応は、日々高まるウェブサーバーのパフォーマンスの最適化を進めていく上で重要な技術です。とはいえ、ウェブサーバーの環境設定が必要なことから不安な方もいらっしゃると思います。先日より開始しておりますMovable Type EZでは、これらの設定が適用された環境を、メンテナンスフリーですぐにご利用いただけるようになっています。環境設定にご不安な方はぜひとも4週間無料トライアルをお試しください。
また10月8日にMovable Typeの11歳の誕生を迎えたことを記念して、2012年10月11日-25日の期間、Twitterプレゼントキャンペーン企画を開催しております。このリンクをクリックして、11周年記念キャンペーンサイトからお申し込み下さい!
Six Apart をフォローしませんか?