Apache2のmod_proxy_http2を試す

去年ぐらいからApache2.4にも実装されたmod_proxy_http2を今更ながら試す。

mod_proxy_http2はリバースプロキシとして動作する際に、バックエンドのサーバと通信する際にもhttp2を使えるようにするモジュールである。

f:id:ASnoKaze:20170531004524p:plain


今回はxenialを使うが、通常降ってくるapache2だとこの機能は入っていないのでざっとtrunkをビルドする。

ビルド

#ちょっと余分なのもあるが
$ apt-get install libnghttp2-dev libexpat1-dev gcc g++ libpcre3-dev libcunit1-dev libev-dev \
                libjansson-dev libjemalloc-dev cython make binutils autoconf automake autotools-dev \
                libtool pkg-config zlib1g-dev libssl-dev libxml2-dev libevent-dev python3.4-dev libevent-openssl-2.0-5


$ svn checkout http://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x httpd-2.4.x
$ cd ../httpd-2.4.x/
$ svn co http://svn.apache.org/repos/asf/apr/apr/trunk srclib/apr
$ ./buildconf

$ ./configure  --enable-proxy-http2 --enable-http2 --enable-proxy-http
$ make

$ sudo make install

設定

# /usr/local/apache2/conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule http2_module modules/mod_http2.so
LoadModule proxy_http2_module modules/mod_proxy_http2.so

Protocols h2 h2c http/1.1
H2Direct on

ProxyPass "/app" "h2c://localhost"

確認

#起動
$ sudo /usr/local/apache2/bin/httpd

#アクセス
$ curl localhost/app

#ログ
$ tail /usr/local/apache2/logs/access_log
127.0.0.1 - - [30/May/2017:15:51:50 +0000] "GET / HTTP/2.0" 200 45
127.0.0.1 - - [30/May/2017:15:51:50 +0000] "GET /app HTTP/1.1" 200 45

http/1.1でアクセスした際に、自身へのプロキシはh2で行ってることが確認できた。

簡単。

あとは、コネクション使いまわすか後日確認する
=> 子プロセス毎にコネクションを再利用するように見えました。多分、再利用条件はRFCの通り(h2cであれば、IPが一緒のことだが、もともとの:authorityじゃないからちょっとよくわからない)