WordPressの高速化ために、httpアクセラレータのVarnish Cache導入
タイトルにもありますように、僕がブログで使用ているWordpressを少しでも速くするためにVarnish Cacheをインストールをしてみました。
こないだ、STINGERの作者のENJILOGさんのブログでも紹介されていた、「Photon」などのWordpressのプラグインを利用する手段もありますが、僕の本業はサーバエンジニアをしているので、プラグインには頼らずエンジニアらしい方法でサーバのパフォーマンスアップを試みてみます。
でも、比較するため近いうちに「Photon」も試してみたいと思います。
photo credit: moogs via photopin cc
Varnishの概要を説明
Varnish は、Webアプリケーションアクセラレータです。これは、HTTPキャッシュのように機能するリバースプロキシです。
リバースプロキシの目的としては、コンテンツのキャッシュを介してサービスをスピードアップすることができるので、高トラフィックを持つWebアプリケーションやサービスにおいては、非常に便利なミドルウェアです。
図解で動きを説明すると、クライアントからhttpのリクエストをVarnishが受けてメモリ上にCache(キャッシュ)があれば、下の図のようにバックエンドのApacheには処理は渡しません。
もしリクエストを受けたVarnisがCacheに情報が無いときは、下の図のようにバックエンドのApacheに処理を渡しレスポンスを待ちます。
このようにサーバ全体において処理のオーバヘッドを減らすことができるので、非常に便利なミドルウェアだと思います。
Varnishをインストール
僕が利用しているサーバは「お名前.com」が提供しているVPSを利用しています。
サーバのスペックは以下の通りで、月額は1000円以下の費用ではあるので、スペックとしてはかなり低いです。
OS : CentOS release 6.4
HDD : 100GB
MEM : 1GB
CPU : 2cpu
WEBサーバ : Apache/2.2.15
OSはCentOSを使用しているので、インストールは非常に簡単です。
# yum install varnish
これだけです。
もし、インストールができないようであれば、EPELかREMIのリポジトリを使ってもらうとインストールができると思います。
Varnishの設定
Varnishの設定は非常に簡単です。
基本的にはこの2つのファイルを調整してもらえると使えるようになります。
“/etc/sysconfig/varnish”
…主に待ち受けポートや、割当メモリサイズを設定します。
“/etc/varnish/default.vcl”
…主にバックエンドのアパッチのポート番号を設定します。
・varnishを編集します。
# vim /etc/sysconfig/varnish
最低限として以下の内容を編集すれば大丈夫です。
VARNISH_LISTEN_ADDRESS= ///お使いのIPアドレスを入れます。 VARNISH_LISTEN_PORT=80 ///webサービスで使っているポート番号。ほとんどは80だと思います。 VARNISH_STORAGE_SIZE=512M ///キャッシュをするメモリのサイズ。G(ギガバイト)の設定も可能 VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}" ///キャッシュをファイルにするか、メモリにするかを設定
・default.vclを編集します。
# vim /etc/varnish/default.vcl
backend default { .host = "127.0.0.1"; ///アパッチが動いているサーバのIPアドレス。今回の場合は同一サーバ上にアパッチがあるので、127.0.0.1 .port = "8080"; ///アパッチの待ち受けポート番号 }
そしてデフォルトでは以下の行はコメントアウトされているので、解除します。
sub vcl_recv { if (req.restarts == 0) { if (req.http.x-forwarded-for) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For ", " client.ip; } else { set req.http.X-Forwarded-For = client.ip; } } if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE") { /* Non-RFC2616 or CONNECT which is weird. */ return (pipe); } if (req.request != "GET" && req.request != "HEAD") { /* We only deal with GET and HEAD by default */ return (pass); } if (req.http.Authorization || req.http.Cookie) { /* Not cacheable by default */ return (pass); } return (lookup); }
これでVarnish側の設定は概ね完了です。
Apacheの設定
同じマシン上で80番ポートはVarnishに割り当てているので、バックエンド側のApacheのポートをデフォルトの80番から他の番号に変える必要があります。
僕の場合は8080番に変更をしています。
変更が必要なファイルは以下の2点です。
httpd.conf
バーチャルホスト用の設定ファイル
# vim /etc/httpd/conf/httpd.conf
以下の設定をすべて8080に変更します。
Listen 8080 NameVirtualHost *:8080 ServerName zibunlog.com:8080
そして、バーチャルホストで定義しているポート番号も変更をします。
# vim //バーチャルホスト用設定ファイル//
これでApache側の設定も完了です。
スピードを計測と、まとめ
VarnishとApacheの設定変更を反映させるために、両方のデーモンを再起動します。
/etc/init.d/varnish restart && /etc/init.d/httpd restart
今回は他のサーバからアパッチベンチというベンチマークツールで、一つの画像ファイルに同時接続100にして1000回に到達するまで接続をして計測をします。
ab -n 1000 -c 100 http://zibunlog.com/wp-content/themes/stinger3ver20131012/images/stinger3.png
Varnish設定前の結果
Requests per second: 633.86 [#/sec] (mean)
Time per request: 157.762 [ms] (mean)
Time per request: 1.578 [ms] (mean, across all concurrent requests)
Transfer rate: 8702.02 [Kbytes/sec] received
Varnish設定後の結果
Requests per second: 734.83 [#/sec] (mean)
Time per request: 136.085 [ms] (mean)
Time per request: 1.361 [ms] (mean, across all concurrent requests)
Transfer rate: 10117.27 [Kbytes/sec] received
・・・設定後の方が遅くなっている。。。
もう一つ計測をするためにいつものGTmetrixで評価を見てみる。
Varnish設定前の結果
Varnish設定後の結果
Page Load timeがかなり僅かだけ良くなっているけど、これは変化はないと言ってよいでしょう。。。
Varnishを導入してみて大幅な改善があれば良かったけど、やっぱりマシンのスペックが良くないので、サーバのチューニングは限界にきているのかもしれないです。
今回のVarnishのような機能を生かすにも相応のマシンスペックを用意する必要があるのだと思います。
サーバにお金をかけたくはないので、サイトとしてのパフォーマンスを上げるにはやっぱりENJILOGさんのブログでも紹介されていた、「Photon」などのCDNを用意する方が手っ取り早そうだけど、本職はエンジニアとしてプラグインには頼らずにもう少し頑張ってみようと思います。