このエントリーをはてなブックマークに追加

あなたの OS X で、はじめてみよう! “h2o”

この記事は、h2o Advent Calendar 第四日目の記事です。

まず、h2o を実際にサーバ上で使うために、h2o は OS X に対応しているので、OS X 上で h2o をはじめてみましょう。

最初にインストール。これは、homebrew-headonly を使うと、次のように簡単にインストールすることができます。なお、Homebrew がインストールされていることが前提です。


$ brew tap homebrew/headonly
$ brew install homebrew/headonly/h2o

そうすると、最新の h2o が $HOMEBREW_ROOT/Cellar/h2o/HEAD にインストールされます。$HOMEBREW_ROOT/bin/h2o に symlink をはるので、まずはサンプルの設定ファイルで起動してみましょう。


$ cd [Homebrew のキャッシュパス]/cache/homebrew/h2o--git/
$ h2o -c examples/h2o/h2o.conf

さっそく、別のターミナルあるいはブラウザから、動作確認してみましょう。
サンプルの設定ファイルでは、HTTP は 8080 と HTTPS は 8081 ポートで起動する内容になっています。


$ curl localhost:8080

<!DOCTYPE html>
<html>
<header>
<title>Welcome to H2O</title>
</header>
<body>
<p>Welcome to H2O – an optimized HTTP server</p>
<p>It works!</p>
<body>
</html>

ちゃんと HTTP 接続できましたね!
h2o を停止するには、Ctrl-C コマンドを入力します。

サンプルの設定ファイルでは、次のようになっています。

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

listen: 8080
listen:
  port: 8081
  ssl:
    certificate-file: examples/h2o/server.crt
    key-file: examples/h2o/server.key
  hosts:
    default:
    paths:
      /:
      file.dir: examples/doc_root
    access-log: /dev/stdout

YAML 形式の設定ファイルで、とてもシンプルな設定ファイルになっていますね。

h2o –help をすると、設定ファイルで指定できるパラメータが分かりますので、ここから設定できるパラメータを勝手に日本語訳してみました。

listen: リクエストを受け付けポートの設定(listen:  あるいは、次のようにマッピングによる設定ができます)
  port: 待ち構えるポート番号あるいはサービス名
  host: 待ち構える IP アドレス
  ssl: SSL を使用するかどうか(デフォルト: none)、使用する場合は certificate-file と key-file を指定する

hosts: ホストごとのマッピングを設定します

paths: URL パスのマッピングを設定します

request-timeout: リクエストを受け付けたときのタイムアウト秒です(デフォルト 10 * 1000 秒)

limit-rquest-body: リクエストボディの最大サイズ(デフォルト: 無制限)

http1-upgrade-to-http2: HTTP/2 へのアップグレードを可能にするかフラグ(ON あるいは OFF、デフォルト ON)
http2-max-concurrent-requests-per-connection: HTTP/2 ストリームの内部で処理される最大リクエスト数(デフォルト: 16)

max-connections: 最大接続数(デフォルト: 1024)
num-threads: ワーカーのスレッド数(デフォルト: 1)

access-log: アクセスログのファイル名、マッピング情報の場合はフォーマットとの組み合わせで設定することができます、| から始まる場合はパイプの設定をすることができます、デフォルトのアクセスログフォーマットは。、「"%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\""」です

file.dir: 公開するディレクトリのパスです
file.index: インデックスを示すファイル名です
file.mime.settypes:  MIME タイプの設定です
file.mime.addtypes: 追加する MIME タイプの設定です
file.mime.removetypes: 削除する MIME タイプの設定です
file.mime.setdefaulttype: MIME タイプのデフォルト設定です

proxy.reverse.url: アップストリームの URL です(HTTP のみサポートされています)
proxy.keepalive:: Keepalive を有効にするかどうかです(デフォルト:OFF)
proxy.timeout.io: アップストリームの I/O タイムアウトミリ秒です(デフォルト: 5000 ミリ秒)
proxy.timeout.keepalive: アイドル接続のタイムアウトミリ秒です(デフォルト: 2000 ミリ秒)

例えば、実際設定例は、次のようになるようでしょう。file.index だけ設定をすると「in command file.index, argument cannot be a scalar」エラーがでてしまい、設定することができませんでした。

listen:
  port: 8080
  host: 127.0.0.1

max-connections: 1024
num-threads: 1

request-timeout: 1
hosts:
  default:
    paths:
      /:
        file.dir: /var/www/default
    access-log: 
      path: "|/usr/sbin/rotatelogs /var/log/h2o/access_log-%Y-%m-%d 3600"
      format: "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\""
  localhost:
    paths:
      /:
        file.dir: /var/www/localhost

h2o は、日々進化しているので、今後の進化に目が離せませんね。
現時点では、パフォーマンスが必要な静的ファイルの処理や、中間プロキシとして使うといいのかなと考えています。

あと、h2o の実装方法については、HTTP2 カンファレンスの動画、約3時間1分くらいから作者の @kazuho さんの講演があるので、実際にどうやって高速なコードを書くのか、その技術を詳しく解説しているので、興味のある人は要チェックだと思います。僕も拝見しましたが、とても勉強になりました。