H2O HTTP serverをちょっとだけ使ってみた

気まぐれにH2Oを使ってみた。環境はVagrant上のUbuntu 14.04 LTSです。

リポジトリの変更

Ubuntuは公式のBoxを持ってきたのだけど、リポジトリのURLが海外のままになっているので日本のサーバへ向くように修正する。

具体的には/etc/apt/sources.listarchive.ubuntu.comjp.archive.ubuntu.comにする。あとは$ sudo apt-get updateで。

コンパイル

依存しているパッケージなどをインストールして、リポジトリをクローン、コンパイルする。確かこんな感じだったと思う……

$ sudo apt-get install -y git build-essential cmake libssl-dev libyaml-dev
$ git clone git://github.com/h2o/h2o.git
$ cd ./h2o
$ git submodule update --init --recursive
$ cmake .
$ make h2o

これで実行ファイルができる。簡単だった。

実行

$ cd ../
$ ./h2o/h2o --help
H2O version 0.1

Usage:
  h2o [options]

Options:
  --conf=file  configuration file (default: h2o.conf)
  --help       print this help

Directives of the Configuration File:

    paths:
      map of URL-path -> configuration

    hosts:
      map of hostname -> map of per-host configs
    request-timeout:
      timeout for incoming requests in seconds (default: (10 * 1000))
    limit-request-body:
      maximum size of request body in bytes (e.g. content of POST)
      (default: unlimited)
    http1-upgrade-to-http2:
      boolean flag (ON/OFF) indicating whether or not to allow upgrade to HTTP/2
      (default: ON)
    http2-max-concurrent-requests-per-connection:
      max. number of requests to be handled concurrently within a single HTTP/2
      stream (default: 16)

    listen:
      port at which the server should listen for incoming requests (mandatory)
       - if the value is a scalar, it is treated as the port number (or as the
         service name)
       - if the value is a mapping, following properties are recognized:
           port: incoming port number or service name (mandatory)
           host: incoming address (default: any address)
           ssl:  if using SSL (default: none)
             certificate-file: path of the certificate file
             key-file:         path of the key file
    max-connections:
      max connections (default: 1024)
    num-threads:
      number of worker threads (default: 1)

    access-log:
      path (and optionally the format) of the access log (default: none)
       - if the value is a scalar, it is treated as the path of the log file
       - if the value is a mapping, its `path` property is treated as the path
         and `format` property is treated as the format
       - if the path starts with `|`, the rest of the path is considered as a
         command pipe to which the logs should be emitted

    file.dir:
      directory under which to serve the target path
    file.index:
      sequence of index file names (default: index.html index.htm index.txt)
    file.mime.settypes:
      map of mime-type -> (extension | sequence-of-extensions)
    file.mime.addtypes:
      map of mime-type -> (extension | sequence-of-extensions)
    file.mime.removetypes:
      sequence of extensions
    file.mime.setdefaulttype:
      default mime-type

    proxy.reverse.url:
      map of virtual-path -> http://upstream_host:port/path
    proxy.timeout.io:
      sets upstreamI/O timeout (in milliseconds, default: 5000)

ヘルプに設定ファイルの設定について書いてあるのすごい。

設定ファイルはサンプルを参考にしてh2o.confというファイル名で書いてみた。とてもシンプルで良い感じがする。

listen: 8080
hosts:
  default:
    paths:
      /:
        file.dir: .
    access-log: /dev/stdout

あと簡単なHTMLもindex.htmlというファイル名で置いておく。

Hello, h2o!

これだとただのテキストだけど。

./h2o/h2o

カレントディレクトリにh2o.confというファイル名があると、それをデフォルトで読んでくれるようなのでそのまま実行する。

アクセス

別のセッションからSSHでつないで、curlを実行してみる。

$ curl -i http://localhost:8080
HTTP/1.1 200 OK
date: Tue, 04 Nov 2014 09:54:08 GMT
server: h2o/0.1
connection: keep-alive
content-length: 12
content-type: text/html
last-modified: Tue, 04 Nov 2014 09:29:13 GMT
etag: "54589c69-c"

Hello, h2o!

レスポンスが返ってきた。

$ ./h2o/h2o
127.0.0.1 - - [04/Nov/2014:09:54:08 +0000] "GET / HTTP/1.1" 200 12

サーバの方もアクセスログが出力されてる。

本当に気まぐれにH2O使ってみよう、という感じでただインストールしてみただけなのでH2Oが売りにしている高速さというところはみてない。 あとwslayというのを入れていないのでWebSocketについても見れてない。今度node.jsの前に立たせてみようか。

ウェブアプリとか作ってないので機会はなさそうだけど。