去年ぐらいからApache2.4にも実装されたmod_proxy_http2を今更ながら試す。
mod_proxy_http2はリバースプロキシとして動作する際に、バックエンドのサーバと通信する際にもhttp2を使えるようにするモジュールである。
今回は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じゃないからちょっとよくわからない)