HTTP2(Apache2.4 + mod_h2)の実験

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

昨日AkamaiさんのHTTP2セミナーに行ってきました。
非常に中身も濃く、色々環境は整ってきているなっていう印象を受けて刺激を貰って帰ってきました。
そこで熱が冷めないうちに弊社でもテスト的な環境を作ってみました。

テスト環境の構築

簡単にサーバを建てられるということで環境はAmazon Linuxを用いています。
列挙すると下記の通りです。

  • AmazonLinux 2015.03
  • Apache2.4
  • mod_h2

テストということもあり、非常に手作業の多い環境構築です:^)

環境構築

前準備

必要とされるパッケージを入れておきます。

$ sudo yum install httpd24-devel httpd24-tools
$ sudo yum groupinstall ‘Development Tools’
$ sudo yum install openssl-devel
$ sudo yum install libevent-devel
$ sudo yum install libxml2-devel
$ sudo yum install jemalloc-devel

nghttp2の構築

ここまで準備したあと依存しているnghttp2をまず構築します。
githubからcloneしてきます。

$ git clone https://github.com/tatsuhiro-t/nghttp2.git
Cloning into ‘nghttp2’…
remote: Counting objects: 23931, done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 23931 (delta 7), reused 0 (delta 0), pack-reused 23907
Receiving objects: 100% (23931/23931), 20.05 MiB | 3.77 MiB/s, done.
Resolving deltas: 100% (17102/17102), done.
Checking connectivity… done.
$

buildします。

$ autoreconf -i
$ automake
$ autoconf
$ ./configure
configure: summary of build options:

Version: 1.0.6-DEV shared 14:5:0
Host type: x86_64-unknown-linux-gnu
Install prefix: /usr/local
C compiler: gcc
CFLAGS: -g -O2
WARNCFLAGS:
LDFLAGS:
LIBS:
CPPFLAGS:
C preprocessor: gcc -E
C++ compiler: g++
CXXFLAGS: -g -O2 -std=c++11
CXXCPP: g++ -E
Library types: Shared=yes, Static=yes
Python:
Python: /usr/bin/python
PYTHON_VERSION: 2.7
pyexecdir: ${exec_prefix}/lib64/python2.7/dist-packages
Python-dev: yes
PYTHON_CPPFLAGS:-I/usr/include/python2.7
PYTHON_LDFLAGS: -L/usr/lib64 -lpython2.7
Cython:
Test:
CUnit: no
Failmalloc: yes
Libs:
OpenSSL: yes
Libxml2: yes
Libev: no
Libevent(SSL): yes
Spdylay: no
Jansson: no
Jemalloc: yes
Zlib: yes
Boost CPPFLAGS:
Boost LDFLAGS:
Boost::ASIO:
Boost::System:
Boost::Thread:
Features:
Applications: no
HPACK tools: no
Libnghttp2_asio:no
Examples: yes
Python bindings:no
Threading: yes
Third-party: yes

$ make
$ make install

少しサマリにnoが多いですが動作させるだけのテストなのでこのままインストールしました。
インストール先の/usr/local/lib/はライブラリのサーチパスに含まれていませんのでここで追加しておきます。

$ pwd
/etc/ld.so.conf.d
$ cat local.conf
/usr/local/lib/
$ sudo ldconfig
$ sudo ldconfig -p| grep libnghttp2
libnghttp2.so.14 (libc6,x86-64) => /usr/local/lib/libnghttp2.so.14
libnghttp2.so (libc6,x86-64) => /usr/local/lib/libnghttp2.so

無事に認識されていますので、安心して:)次の工程へ進めます。

mod_sslのインストール

mod_sslはNPN対応版が
必要になりますのでビルドします。
こちらで公開されているものを利用しました。
https://github.com/eousphoros/mod-spdy

依存しているライブラリを導入します。

$ sudo yum install pcre-devel pcre-tools

cloneしてビルドします。

$ git clone https://github.com/eousphoros/mod-spdy.git
Cloning into ‘mod-spdy’…
remote: Counting objects: 5791, done.
remote: Total 5791 (delta 0), reused 0 (delta 0), pack-reused 5791
Receiving objects: 100% (5791/5791), 8.50 MiB | 2.52 MiB/s, done.
Resolving deltas: 100% (1529/1529), done.
Checking connectivity… done.
$ cd mod-spdy/src
$ ./build_modssl_with_npn.sh
Not a directory: /home/ec2-user/mod-spdy/src/mod_ssl
Attempting to create: /home/ec2-user/mod-spdy/src/mod_ssl
Using buildroot: /home/ec2-user/mod-spdy/src/mod_ssl

バイナリの依存を簡単にみておきます。

$ ldd /home/ec2-user/mod-spdy/src/mod_ssl.so
linux-vdso.so.1 => (0x00007ffe551bf000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f555a47b000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f555a277000)
libc.so.6 => /lib64/libc.so.6 (0x00007f5559eb6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f555ab45000)
$

特に特殊な依存なしで動きそうですね。

Apacheのモジュールとしてインストールします。

$ sudo cp /home/ec2-user/mod-spdy/src/mod_ssl.so /etc/httpd/modules/mod_ssl.so

mod_h2

やっとmod_h2のインストールです。

$ git clone https://github.com/icing/mod_h2.git
Cloning into ‘mod_h2’…
remote: Counting objects: 4316, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 4316 (delta 1), reused 0 (delta 0), pack-reused 4307
Receiving objects: 100% (4316/4316), 5.28 MiB | 1.57 MiB/s, done.
Resolving deltas: 100% (3248/3248), done.
Checking connectivity… done.
$
$ autoreconf -i
$ automake
$ autoconf
$ ./configure
$ make
$ sudo make install

以上で/etc/httpd/conf.d/にh2.confも設置されますので通常通りSSL対応サーバとしての設定を行っておきます。

$ cat h2.conf
H2Engine on

コンフィグのテストを行ったら起動しておきましょう

$ sudo /etc/init.d/httpd start
Starting httpd: [ OK ]

なお、mod_sslをNPN未対応版を使うとこのような形でエラーログが吐かれmod_h2は動作しません

[Tue Jul ** 02:21:22.625103 2015] [h2:warn] [pid 7155] mod_ssl does not offer ALPN or NPN registration

テスト

やっと接続テストです。

接続

ブラウザはFirefox Developer Editionを用いました。about:configで設定をみるとHTTP2は有効になっているようです。
h2_Firefox Developer Edition_2015-7-7_11-15-42_No-00

アクセスしてみるとこんな感じですね。
h2_test_2015-7-7_13-32-35_No-00
ちゃんとVersion2.0で接続されている事が確認できました。

WordPressでありがちな画像多めの投稿の場合

アクセスしただけだとあまりにつまらないのでWordpressを動かして画像の投稿を実施してみました。
恣意的かもしれませんが、画像多めでの投稿の場合で確認しています。

テスト用コンテンツ
h2_test_WordPress_testcontents_2015-7-7_14-6-10_No-00
まずは無効状態(HTTP/1.1)での場合
h2_test_disable_2015-7-7_14-5-10_No-00
続いて有効化(HTTP2)した場合
h2_test_enable_2015-7-7_14-3-29_No-00
これくらいのコンテンツでも想定通り茶色の待ってる時間が減っていて、パラレルにコンテンツが受け取れているようですね。

OSの標準パッケージでより簡単に利用できると夢も広がりそうですね。

投稿者プロフィール

えんじにあん
インフラ系のエンジニアです。
運用系のスクリプトを書いたり、オートメーションな世界に向かって日々精進しています。

1 個のコメント

  • 【要注意】nginx1.9.5にアップデートしました

    今回のアップデートは、設定によってはこれまで通りのコンパイル・設定ファイルが使えなくなります。それは何故かと言うと、spdyではなくHTTP/2を使うようになったためです。 CHANGELOGに…

  • コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です

    Time limit is exhausted. Please reload CAPTCHA.

    ABOUTこの記事をかいた人

    インフラ系のエンジニアです。 運用系のスクリプトを書いたり、オートメーションな世界に向かって日々精進しています。