海外で展開しているサービスがある関係上各サーバの監視に利用しているZabbixサーバも海外にあるのですが、ほとんどチューニングされておらず、ZabbixのWebUIの画面をロードするのが遅くて遅くてしょうがないので頑張ってチューニングしてみた時の話です。
また、チューニング前後でダッシュボードのロードにかかった時間を計測してみました。
準備
まず、Google ChromeのDeveloper Toolsでキャッシュを無効にします。
チューニング前の状態
ZabbixはよくあるApache+mod_phpによる構成です。この状態でZabbixのダッシュボード(dashboard.php)にHTTPSでアクセスするとブラウザ左下のステータスバーにページのロードにかかった時間が表示されます。
2.7秒かかっています。すごく遅いです。体感でわかるくらい遅いです。
Zabbixが定期的にポーリングしているせいか放っておくとどんどんrequestsやtransferred、経過時間が増加していくので今後これと同じ26requests処理するのにかかった時間を計測していきます。
チューニング開始
というわけでチューニング開始です。とりあえずApacheの設定を変更していきます。
KeepAliveを有効にする
Chrome Developer Toolsで各リソースのレスポンスヘッダを確認すると「Connection: close」になってます。
これでKeepAliveが無効だったことがわかったので有効にしてみました。
KeepAlive On
キャッシュを無効にした状態でZabbixのダッシュボードを再びロードします。
おお、少し速くなりました。
gzip圧縮を有効にする
さらにレスポンスヘッダを見てみるとCSSやJavaScript、HTMLのどれにも「Content-Encoding: gzip」が付いてないのがわかりました。また、ステータスバーをよく見るとダッシュボードの画面を表示するのに766KBものデータがネットワークを流れています。
というわけでmod_deflate
で静的コンテンツを圧縮しましょう。
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
</IfModule>
キャッシュを無効にした状態でZabbixのダッシュボードを再びロードします。
ページのロードにかかる時間が約半分になりました!
Apacheの前にnginxを配置する
さて、実のところApacheはあまり得意ではないので自分の得意なnginxに切り替えたいところです。また、mod_phpを利用している関係上、ApacheのMPMはpreforkなのでmod_spdyが利用できません。
さらに言うとFastCGIの設定するのは面倒なのでやりたくありません。というわけでこれまでのチューニングを施したnginxを前段に配置してHTTPSのかわりにSPDY3.1で通信するようにしてみました。
1秒切りました!なお、できるだけApacheのときと同じネットワーク転送量になるように設定しましたが、自分でも知らない部分での最適化が効いてるかもしれません。
まとめ
海の向こうにあるZabbixサーバの表示をWebサーバのチューニングだけで高速化してみました。元は2.7秒かかっていましたが、
最終的に1秒を切ることができました。
実際にやったことは、
- KeepAliveを有効にする
- gzip圧縮を有効にする
- Apacheの前段にnginxを配置 & SPDY3.1化
上記では紹介していませんが実際にはこれに加えて
- TLS Session Ticketsの有効化
- OCSP Staplingの有効化
を行っています(TLS Session Cacheは最初から有効でした)。今回は地理的に遠いサーバだったのでネットワークの帯域やレイテンシを減らすのが効果的だったようです。