H2O on ubuntu

  • 投稿者:
  • 投稿カテゴリー:H2O

HTTP/2 については以下がとてもとても参考になりました
HTTP/2時代のウェブサイト設計

WEB前提

・ユーザのバンド幅が変わってもページロード時間は早くならない(1.6Mbpsで打ち止め)
→レイテンシが小さいほどページロード時間が早くなる

レイテンシを小さくするためには

多重通信 or レイテンシ自体がなくなる ことが必要

・HTTP/1.1は多重性がない
 厳密に言えば、仕様はあるが現実的ではない

・これ以上のレイテンシ減少は光ファイバの制約上難しい

HTTP/2とは

上記問題を解決するためのプロトコル
2015-09-22_115520
バイナリプロトコルだがh2iコマンドを利用することでやり取りを確認できる

小さなリクエストが大量時にメリットあり
以下URLより複数画像を表示する場合、高速化されていることがわかる
Compare resource loading between HTTP/2 (H2O) and HTTP/1.1 (Nginx)

HTTP/2ではレイテンシは最小限に抑えられ、結果的にバンド幅がボトルネックになるため
高速化するためには転送データ量を減らすべし

h2oとは

・2014年夏より開発されている、先進的な HTTP/2 サーバ(ディー・エヌ・エー発)
・現段階のソフトだと一番優秀。次点nghttp2
 (他のソフトだと優先度制御でうまく処理できない可能性が)

インストール

root@ubuntu14:/usr/local/src# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"

root@ubuntu14:/usr/local/src# aptitude install git build-essential cmake libssl-dev libyaml-dev
...

root@ubuntu14:/usr/local/src# git clone git://github.com/h2o/h2o.git
Cloning into 'h2o'...
...

root@ubuntu14:/usr/local/src# cd h2o/
root@ubuntu14:/usr/local/src/h2o# cmake .
...
root@ubuntu14:/usr/local/src/h2o# make
...
root@ubuntu14:/usr/local/src# h2o/h2o --help
h2o version 1.5.0-beta3

Usage:
  h2o [options]

Options:
  -c, --conf FILE    configuration file (default: h2o.conf)
  -m, --mode <mode>  specifies one of the following mode
                     - worker: invoked process handles incoming connections
                               (default)
                     - daemon: spawns a master process and exits. `error-log`
                               must be configured when using this mode, as all
                               the errors are logged to the file instead of
                               being emitted to STDERR
                     - master: invoked process becomes a master process (using
                               the `share/h2o/start_server` command) and spawns
                               a worker process for handling incoming
                               connections. Users may send SIGHUP to the master
                               process to reconfigure or upgrade the server.
                     - test:   tests the configuration and exits
  -t, --test         synonym of `--mode=test`
  -v, --version      prints the version number
  -h, --help         print this help

Please refer to the documentation under `share/doc/h2o` (or available online at
http://h2o.examp1e.net/) for how to configure the server.

設定

root@ubuntu14:/usr/local/src# mkdir /etc/h2o
root@ubuntu14:/usr/local/src# cp h2o/examples/h2o/h2o.conf /etc/h2o/
root@ubuntu14:/usr/local/src# vi /etc/h2o/h2o.conf
# to find out the configuration commands, run: h2o --help

listen: 80
hosts:
   defaultt:
    paths:
      /:
        file.dir: /var/www
    access-log: /var/www/access.log

### configチェック ###
root@ubuntu14:/usr/local/src# h2o -c /etc/h2o/h2o.conf -t
configuration OK
root@ubuntu14:/usr/local/src# cp -Rp h2o/share/h2o /usr/local/share/ # daemonとして起動のために必要
root@ubuntu14:/usr/local/src# cp h2o/h2o /usr/sbin/
root@ubuntu14:/usr/local/src# vi /var/www/index.html
<h1>Welcom to h2o</h1>

root@ubuntu14:/usr/local/src# h2o -m daemon -c /etc/h2o/h2o.conf
start_server (pid:3110) starting now...

root@ubuntu14:/usr/local/src# ps afx | grep h2o
 3144 pts/2    S+     0:00                          \_ grep --color=auto h2o
 3112 ?        S      0:00 perl -x /usr/local/share/h2o/start_server --log-file=/var/www/error.log --daemonize --port=0.0.0.0:80 -- h2o -c /etc/h2o/h2o.conf
 3113 ?        Sl     0:00  \_ h2o -c /etc/h2o/h2o.conf
 3114 ?        S      0:00      \_ perl -x /usr/local/share/h2o/annotate-backtrace-symbols

アクセスすると
2015-09-22_171713

アクセスログは

[clientIPaddress] - - [22/Sep/2015:17:16:10 +0900] "GET /index.html HTTP/1.1" 200 23 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"
[clientIPaddress] - - [22/Sep/2015:17:16:11 +0900] "GET /favicon.ico HTTP/1.1" 404 9 "http://104.199.129.118/index.html" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"

高速化のための設定

別サーバからabコマンドを利用する

ab -n 10000 -c 1000 http://104.199.129.118/index.html

初期

Requests per second: 913.69 [#/sec]

設定変更

# to find out the configuration commands, run: h2o --help

listen: 80
error-log: /var/www/error.log
# 自動でCPU数をみてスレッド数を設定する。以下のように手動で設定することも可能
num-threads: 2
max-connections: 10240
num-name-resolution-threads: 1

hosts:
   defaultt:
    paths:
      /:
        file.dir: /var/www
    access-log: /var/www/access.log

Requests per second: 1572.15 [#/sec]
「できるだけデフォルトを最適な形で提供しようとしている」らしくチューニングポイントは少ないとのこと

with PHP

# to find out the configuration commands, run: h2o --help

listen: 80
error-log: /var/www/error.log
# 自動でCPU数をみてスレッド数を設定するが手動で設定することも可能
num-threads: 2
max-connections: 10240
num-name-resolution-threads: 1

hosts:
   defaultt:
    paths:
      /:
        file.dir: /var/www
    access-log: /var/www/access.log

file.custom-handler:
  extension: .php
  fastcgi.connect:
    host: 127.0.0.1
    port: 9000
    type: tcp

※php-fpmを9000ポートで起動済みとする

アクセスするとPHPが実行された
2015-09-22_200305

Unix Socketも利用可能

file.custom-handler:
  extension: .php
  fastcgi.connect:
    host: 127.0.0.1
    port: /tmp/fcgi.sock
    type: unix

※fastcgi.spawnを利用するとH2Oがphpを起動、管理する

参考URL

HTTP/2時代のウェブサイト設計
HTTP/2時代のウェブサイト設計
H2O HTTP serverをちょっとだけ使ってみた
nginxのパラメータチューニングとh2o
H2O
新、PHPとH2OをfastCGIでつなぐ話、解決編
H2OとPHPの話
HTTP ベンチマークツール wrk の使い方..利用していないがメモ..