HTTPの新しい規格であるHTTP/2。
HTTP/2対応が簡単にできてしかも高速で動くと言われているWebサーバであるH2Oを使ってZabbixのフロントエンドのPHP WebGUIをHTTP/2化してみます。
Zabbixは設定を行ったり、監視結果を見たりする管理画面はPHPのWebアプリケーションとして稼働します。
通常、公開されているrpm等のパッケージからインストールした場合はApache HTTP Serverを使って構成するようになっています。
このApache HTTP ServerをH2Oで置き換えて、Zabbixの管理画面のGUIをHTTP/2化してみます。
前提となる環境は以下の通りです。
- OS: CentOS6.7
- Zabbix: 2.2.10
- PHP: 5.3.3
- H2O: 1.6.0
H2Oのインストール
まずはH2Oをインストールします。
H2O自体はGithub上で公開されているのでここからソースコードを取得。
$ wget https://github.com/h2o/h2o/archive/v1.6.0.tar.gz
インストール作業に入る前にH2Oのbuildに必要なパッケージをインストールします。
$ sudo yum groupinstall "Development Tools"
$ sudo yum install libyaml-devel
$ sudo yum install cmake
H2Oのbuild&install
$ tar xvzf v1.6.0.tar.gz
$ cd h2o-1.6.0
$ cmake .
$ make h2o
$ sudo make install
これで/usr/local/bin以下にH2Oがインストールされます。
SSL証明書の設定
HTTP/2自体はHTTPおよびHTTPSどちらでも対応していますが、ブラウザ(Chrome)から見るときにはHTTP宛だと自動的にブラウザ側でHTTP1.1で処理するため、サーバ側をHTTPSで対応できるようにしておきます。
今回はテストのため適当にSSLの自己署名証明書を発行しておきます。
# cd /etc/h2o
# openssl genrsa 2048 > cert.key
# openssl req -new -key cert.key > cert.csr
# openssl x509 -days 3650 -req -signkey cert.key < cert.csr > cert.pem
※参考
h2o.conf設定
H2Oの起動時に引き渡す設定ファイル(/etc/h2o/h2o.conf)を新規作成し、以下のように設定を行います。
user: apache
listen: 80
listen:
port: 443
ssl:
certificate-file: /etc/h2o/cert.pem
key-file: /etc/h2o/cert.key
file.custom-handler:
extension: .php
fastcgi.spawn: "PHP_FCGI_CHILDREN=10 exec /usr/bin/php-cgi"
hosts:
default:
paths:
/zabbix:
file.dir: /usr/share/zabbix
access-log: /tmp/h2o_https_access.log
今回、Zabbixを公式のパッケージにてインストール済みの環境に対してH2Oを追加導入して設定を行っているので、php関連のファイルのアクセス権限の問題からH2Oの起動ユーザはapacheユーザを指定しています。
user:指定がない場合にはnobodyといったユーザにて実行されます。
cgiとして、php-cliに含まれているphp-cgiを利用して処理させています。
この設定を行うことで.php関連の処理がphp-cgi経由で処理を行います。
とてもシンプルで簡単です。
※参考
PHP関連設定をPHP側に設定
Zabbixの標準のApacheの設定ファイルだと以下のようにPHPの設定値をApache側の設定ファイルに指定されています。
Alias /zabbix /usr/share/zabbix
<Directory "/usr/share/zabbix">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
php_value date.timezone Asia/Tokyo
</Directory>
・・・略
この設定をPHP側の設定ファイルに持っていきます。
一例として、/etc/php.iniに以下のように設定を行います。
max_execution_time = 300
memory_limit = 128M
post_max_size = 16M
upload_max_filesize = 2M
max_input_time = 300
date.timezone = "Asia/Tokyo"
H2O起動
起動は以下のコマンドの通り-cで設定ファイルを指定して実行するだけでOKです。
$ sudo /usr/local/bin/h2o -c /etc/h2o/h2o.conf &
起動すると、80ポート、443ポートにてサービスが立ち上がります。
ブラウザからアクセス
あとは普通にブラウザからZabbixにアクセスすればOKです。
Chromeのエクステンションで「HTTP/2 and SPDY indicator」というのをインストールしておけば、ブラウザ上にHTTP2で通信していれば稲妻マークが表示されます。
無事HTTP2通信できています。
ちょっと試しに画像をたくさん表示するスクリーンにアクセスしてみる
HTTP2化できたので、その効果を確認するため、1ページで多くのリクエスト処理を行わなければならないスクリーンを作ってその際の通信を確認してみます。
スクリーン画面はこんな感じで1ページに10個のシンプルグラフを並べたもの。
HTTP2通信
このページに対してhttpsでアクセスしHTTP2での挙動を見るとGoogleのDeveloper toolで確認したところ以下のような感じになっています。
この結果からわかるようにプロトコルとしてはh2を使っていて、各グラフの画像取得処理を全て並行でリクエスト送付して処理していることがわかります。
HTTP1.1通信
次に、同じページに対してhttpでアクセスしHTTP1.1の挙動を見てみると、以下の図の通り、一度に送付しきれなかったリクエストがキューに貯められて段階を踏んでリクエスト処理されているのがわかります。
まとめ
このようにHTTP2化することで通信処理自体は非常に効率よく行われます。ZabbixのWebGUIについても同様です。
しかし、Zabbixの場合、画面表示でボトルネックになる部分はどちらかと言うと、通信処理部分というよりZabbixが内部で監視結果を取ってきたりする部分であることが多いので本質的に画面の表示を速くするという点に対する効果は薄いかもしれないですね。
今回はHTTP2というかH2Oを少し試したかったということでこんなテーマでお届けしましたー
実際にやるならnginxとかがいいかもです。
Advent Calendarの記事も残りわずかになってきました。
次回の記事は2box2boさんです。よろしくお願いします!