SENAN

4人の仲間が交代で書く雑記

H20をUbuntu14.04にインストールする。HTTP/2.0お試し。

      2016/01/13

前回からの続きです。前回はこちら

HTTP/2.0に最適化されたウェブサーバ、H2Oを試してみました。
(インストール途中でエラー出たりしましたが、思ってたよりも簡単にインストールできました)

h2o
H2O: https://h2o.examp1e.net/index.html

ちなみに、H2Oはレスポンスの速さを特徴としていて(HTTP/2.0利用前提)、
HTTP/2.0界隈ではApache, Nginxに続く第3勢力になると言われてたりするらしいです。

インストール先 & 参考資料


手順は以下を参考にし、Vagrant上のUbuntu 14.04 LTSにインストールしました。

https://github.com/h2o/h2o/wiki/%5Bobsolete%5D-Install-H2O-on-Ubuntu-14.04

ちなみに、今回は手動でインストールしようと思っているので、Vagrantfileはこれだけです。

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2" do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.network :forwarded_port, guest: 8080, host: 8080
config.vm.network :forwarded_port, guest: 8081, host: 8081
end

H2Oインストール


さっそくインストールしてみます

1. 準備

システムのアップデート

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade -y
sudo apt-get autoremove --purge -y
sudo apt-get autoclean -y

必要なパッケージインストール(リポジトリから落とせる分)

sudo apt-get install locate git cmake build-essential checkinstall autoconf pkg-config libtool python-sphinx wget libcunit1-dev nettle-dev libyaml-dev libuv-dev -y

2. Wslayインストール

H2OにはWslayというライブラリのが必要らしい・・・。
初めて見た名前なので調べてみたところ、WebSocketのライブラリでした。

Wslay は WebSocket の C ライブラリです. RFC 6455 準拠の version 13 プロトコルを実装します. Wslay は WebSocket のデータトランスファー部分のみの実装です. Wslay は それ自身では I/O を行わない設計です. I/O のためにユーザーコードが実装するコールバック関数を提供します. これによりユーザーは好みの I/O フレームワークや SSL, ソケットライブラリを使うことができます.

Wslayのビルド&インストール

$ cd ~/
$ git clone https://github.com/tatsuhiro-t/wslay.git
$ cd wslay/
$ autoreconf -i
$ automake
$ autoconf
$ ./configure
$ sudo make
$ sudo make install

正しくインストールされていれば/usr/local/libに配置されています。

vagrant@vagrant-ubuntu-trusty-64:~/wslay$ ls /usr/local/lib/
libwslay.a libwslay.la libwslay.so libwslay.so.0 libwslay.so.0.0.1 pkgconfig python2.7 python3.4 site_ruby

3. OpenSSLインストール

HTTP/2.0はHTTPS通信が基本(というか必須?)。
H2OではSSL部分のライブラリとしてLibreSSLもしくはOpenSSLが使えるらしいです。
今回は参考手順に沿ってOpenSSLを使うことに決定。

ただし、HTTP/2.0通信で使うALPN(Application Layer Protocol Negotiation)の仕組みは、
OpenSSLの場合、バージョン1.0.2以降からサポートされます。
執筆時点では、OpenSSL-1.0.2はリポジトリから取って来れないので、ソースからインストールします。

$ cd ~/
$ wget https://www.openssl.org/source/openssl-1.0.2e.tar.gz --no-check-certificate
$ tar -xvzf openssl-1.0.2e.tar.gz
$ mv openssl-1.0.2e openssl
$ cd openssl
$ vi openssl.ld

OPENSSL_1.0.0 {
global:
*;

local:
*;
};

OPENSSL_1.0.1 {
} OPENSSL_1.0.0;

OPENSSL_1.0.1d {
} OPENSSL_1.0.1;

OPENSSL_1.0.2 {
} OPENSSL_1.0.1d;

$ ./config -fPIC shared -Wl,--version-script=/home/vagrant/openssl/openssl.ld -Wl,-Bsymbolic-function
$ sudo make
$ sudo make install

インストール完了。念のためバージョンを確認。
(インストールパスが異なるので注意。普通にopensslコマンドを使うと/usr/bin/opensslが実行されます。)

$ /usr/local/ssl/bin/openssl version
OpenSSL 1.0.2e 3 Dec 2015

4. H2Oインストール

H2Oをビルドします。

$ git clone https://github.com/h2o/h2o.git
$ cd h2o
$ export OPENSSL_INCLUDE_DIR=/usr/local/ssl/include/
$ export OPENSSL_LIBRARIES='/usr/local/ssl/lib/libssl.so;/usr/local/ssl/lib/libcrypto.so'
$ export LD_LIBRARY_PATH=/usr/local/ssl/lib/
$ vim cmake/FindOpenSSL.cmake

FIND_PATH(OPENSSL_INCLUDE_DIR NAMES openssl/ssl.h)

INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(OPENSSL DEFAULT_MSG OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR)

$ sudo cmake -DCMAKE_INSTALL_PREFIX=/usr/local/h2o -DOPENSSL_LIBRARIES='/usr/local/ssl/lib/libssl.so;/usr/local/ssl/lib/libcrypto.so' -DOPENSSL_INCLUDE_DIR=/usr/local/ssl/include/
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
Call Stack (most recent call first):
/usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:315 (_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake-2.8/Modules/FindZLIB.cmake:85 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
CMakeLists.txt:42 (FIND_PACKAGE)

-- Configuring incomplete, errors occurred!
See also "/home/vagrant/h2o/CMakeFiles/CMakeOutput.log".
See also "/home/vagrant/h2o/CMakeFiles/CMakeError.log".

エラーになりました。。。
zlibが見つからないといわれているのでインストールして再チャレンジ。

$ sudo apt-get install zlib1g-dev
$ sudo cmake -DCMAKE_INSTALL_PREFIX=/usr/local/h2o -DOPENSSL_LIBRARIES='/usr/local/ssl/lib/libssl.so;/usr/local/ssl/lib/libcrypto.so' -DOPENSSL_INCLUDE_DIR=/usr/local/ssl/include/
-- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.8")
-- checking for module 'libuv>=1.0.0'
-- package 'libuv>=1.0.0' not found
-- Found LIBUV: /usr/lib/x86_64-linux-gnu/libuv.so
-- checking for module 'libwslay'
-- found libwslay, version 1.0.1-DEV
-- Configuring done
-- Generating done
-- Build files have been written to: /home/vagrant/h2o

成功!続いてmakeします。

$ sudo make
$ sudo make install

[ 41%] Building C object CMakeFiles/libh2o.dir/deps/libyrmcds/strerror.c.o
[ 41%] Building C object CMakeFiles/libh2o.dir/deps/picohttpparser/picohttpparser.c.o
[ 42%] Building C object CMakeFiles/libh2o.dir/lib/common/file.c.o
[ 42%] Building C object CMakeFiles/libh2o.dir/lib/common/filecache.c.o
[ 42%] Building C object CMakeFiles/libh2o.dir/lib/common/hostinfo.c.o
In file included from /home/vagrant/h2o/include/h2o/socket.h:60:0,
from /home/vagrant/h2o/include/h2o/multithread.h:27,
from /home/vagrant/h2o/include/h2o/hostinfo.h:32,
from /home/vagrant/h2o/lib/common/hostinfo.c:22:
/home/vagrant/h2o/include/h2o/socket/uv-binding.h:28:2: error: #error "libh2o (libuv binding) requires libuv version 1.x.y"
#error "libh2o (libuv binding) requires libuv version 1.x.y"
^
make[2]: *** [CMakeFiles/libh2o.dir/lib/common/hostinfo.c.o] Error 1
make[1]: *** [CMakeFiles/libh2o.dir/all] Error 2
make: *** [all] Error 2

はい、エラー・・・。
メッセージ的にはlibuvのバージョンが合ってないみたいなので、何が入っているか確認。
(ついでに、リポジトリから取ってこれる最新版が何かも確認)

$ dpkg -l | grep libuv
ii libuv0.10:amd64 0.10.22-2 amd64 asynchronous event notification library - runtime library

$ apt-cache search libuv
libuv-dev - asynchronous event notification library - development files
libuv0.10 - asynchronous event notification library - runtime library
libuv0.10-dbg - asynchronous event notification library - debugging symbols

結果、現状入っていたのはバージョン0.10でした。
そして、リポジトリ上の最新も同じっぽい。

しかたないので、libuvをソースからビルド&インストールします。

libuv0.10関係をアンインストール

$ apt-get --purge remove libuv-dev
$ sudo apt-get --purge remove libuv0.10
$ sudo rm /usr/local/lib/libuv.*

ソースから最新版をビルド&インストール

$ cd ~/
$ sudo git clone https://github.com/libuv/libuv.git
$ cd libuv/
$ sudo sh autogen.sh
$ sudo ./configure
$ sudo make
$ sudo make check
$ sudo make install

h2oのインストールを再チャレンジ

cd ~/h20
sudo make install

成功!

5. H2O起動&動作確認

まずは起動

$ sudo /usr/local/h2o/bin/h2o -c examples/h2o/h2o.conf

以下のURLにアクセスし、”It works!”と出てくればOKです。

  • http://localhost:8080/
  • https://localhost:8081/

表示内容はHTTPもHTTPSも同じですが、httpsの場合は通信プロトコルにHTTP/2.0が使われています。
私の場合はChromeの開発者ツールから確認してみました

Chromeでの通信プロトコルの確認の仕方:
https://ma.ttias.be/view-http-spdy-http2-protocol-google-chrome/

とりあえずインストールまでできました。
次はベンチマークとってみようかな?

 - その他