WordPressをHTTP/2+HHVMで動かす環境をdocker-composeで構築してみた
TL;DR
このリポジトリを clone
して docker-compose up -d
して下さい
(要 バージョン 1.6.0 以上)。
その後 open "https://$(docker-machine ip default)"
すると、ブラウザでWordPressが立ち上がります。
動機
WordPressをHHVMで動かしたら超速くなった!やったぜ!!という記事はをよく見るのだけれど、 具体的にどうやって構築しているのか解説している記事があんまり無かったので、実際にやってみることにしました。
ついでに、HTTP/2で提供出来るとイケてる気がしたので、併せて対応してみることにします。
HHVM
HHVMは、Facebookがオープンソースとして開発している仮想実行環境で、 PHPとHackを動かすための環境らしいです。
まぁ、個人的にはHackもHHVMも すごいPHP ぐらいの認識しかありませんが…。 Hackは言語的にすごくて、HHVMは実行環境がすごい。今回用があるのはHHVMだけです。
HTTP/2
HTTP/2は… すごいHTTP です。
HTTP/1.xとの互換性を保ちつつ、効率化したもののようです。ヘッダの圧縮とか、リクエストの多重化とか。 RFC7540 日本語訳や日本語のFAQもあります。 自分は全然見てないけれど…必要になったら読みます。
とにかく、このプロトコルで配信するだけでより効率的でより早くなる、ということです。
HTTP/2 の実装
nginxの1.9.5からHTTP/2をサポートしているようです1。 公式Dockerリポジトリで配信されている最新イメージでもちゃんとサポートされていました。
他にもApache HTTP Server 2.4.17+や DeNAのH2Oなど色々あるようです。
今回はApacheよりは速かろうというのと、WordPress稼動の実例も多いことから、nginxを選択しました。適当。
構成
リライトルールとか複雑なリクエスト制御が不要なら、 HHVMに組込みのWebサーバーがあるのでそれを使うのが簡単だし、速度面でも問題なさそうです。
ただ、WordPressでパーマリンクを利用する場合はURLのリライトが必須です。
HHVMでもバーチャルホスト切ってリライトの設定するとか出来るみたいですが、 iniファイルに設定書いていくのは何だかしんどそうです。
他にもSSLとか静的ファイルの配信とか諸々考えると、餅は餅屋ということでリバースプロキシを立てた方がよさそうですね。
というわけで、リバースプロキシとして nginx を立てて、HHVMをFastCGIモードで起動してバックエンドとします。
今回はとにかくお手軽に手元で動かしてみたかったので、諸々Dockerで動かすことにしました。 雑に図解すると以下のような感じです:
FrontとかBackはDockerのユーザー定義ネットワークです。
Docker 1.10.0で link に代わるものとして導入されたような気がします。
/etc/hosts
じゃなくてDNSで名前解決出来るようになってて最高にハッピーですね。
FastCGIはUnixソケットで通信した方が速いと思うんですが、 今回は nginx と HHVM を別々のコンテナで動かすので、TCPで通信するようにしました。 同一システム上にFastCGIサーバとプロセスが稼動するって、実環境でもあんまり無いような気がするけど、どうなんだろう?
コンテナひとつひとつ立てていくのは辛いので、常套手段の docker-compose
を使って作ります。
動かす
このリポジトリに実際に稼動するものが置いてあります。
clone
して docker-compose up -d
すれば、HTTP/2でWordPressが動いている様子が確認出来ます。
nginxやHHVMの設定はほぼデフォルトのままいじってないので、本気で動かすなら細かいチューニングは必要です。 が、全体の構成は実環境でもこのようになると思います。
終わりに
以上で、お手軽に手元でHTTP/2+HHVMなWordPressを試すことが出来るようになりました。
あとは実環境へのデプロイだけなんですが、さてどうしたものか。
docker-compose.yml
からいい感じにデプロイしてくれるような何か、ありませんかねぇ。