H2O HTTP serverをちょっとだけ使ってみた
気まぐれにH2Oを使ってみた。環境はVagrant上のUbuntu 14.04 LTSです。
リポジトリの変更
Ubuntuは公式のBoxを持ってきたのだけど、リポジトリのURLが海外のままになっているので日本のサーバへ向くように修正する。
具体的には/etc/apt/sources.list
のarchive.ubuntu.com
をjp.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の前に立たせてみようか。
ウェブアプリとか作ってないので機会はなさそうだけど。