Open6

H2O - the optimized HTTP server の設定メモ

にゃるら / カラクリスタにゃるら / カラクリスタ

h2o で hanlder の実行順序を制御する

サンプル

h2o.conf
hosts:
  "example.com":
    "/":
      - "mruby.handler": /path/to/script.rb
      - "file.dir": /path/to/media

概要

h2o で各ハンドラの実行順序を制御したい場合には paths.{path_info} に配列を指定する。

そうすると配列の先頭からハンドラが実行される。

出典

にゃるら / カラクリスタにゃるら / カラクリスタ

mruby.handler で次の handler の処理を呼び出す

サンプル

h2o.conf
hosts:
  "example.com":
    "/":
      - "mruby.handler": |
          lambda do |env|
            env['HTTP_X_FORWARDED_FOR'] = env['HTTP_FLY_CLIENT_IP']
            return H2O.next.call(env)
          end
      - "file.dir": /path/to/media

解説

mruby.handler で次に処理されるハンドラを呼び出したい場合、H2O.next.call(env)でその処理を呼び出せる。

上記の例だと Fly-Client-IP ヘッダを X-Forwarded-For にマップした上で file.dir を呼び出している。

※ なお Fly-Client-IPfly.io で利用される クライアントの IP が入るヘッダ

参考情報

にゃるら / カラクリスタにゃるら / カラクリスタ

mruby でファイル操作をする際の注意点

デフォルト設定において h2o はプロセスを nobody:nobody で生やすため、mruby ハンドラでファイル操作をする場合、パーミッションに気を付ける必要がある。

また nobody:nobodyという設定にしているのはセキュリティ上の理由であるため、 mruby ハンドラでファイル操作をするためには、

$ chown -R nobody:nobody /path/to/dir

と、特定のディレクトリのみに適用すると良い。

にゃるら / カラクリスタにゃるら / カラクリスタ

h2o で nginx の try_files のようなことをする

サンプル

h2o.conf
hosts:
  "example.com":
    "/":
      "file.dir": "/path/to/dir"
      "proxy.reverse.url": "http://localhost:8080/"

解説

h2o で nginx の try_filesのような機能を実現するためには、file.dirproxy.reverse.url などのバックエンドへ繋ぐ系のハンドラを組合わせれば良い。

上記の例の場合、例えは http://example.com/foo へアクセスした場合、まず /path/to/dir/foo が存在するか参照され、次に http://localhost:8080/foo が参照されるようになる。

なおハンドラの実行順序を確実に制御したい場合には、上記の "/": 以下の値を配列形式で指定すること。

にゃるら / カラクリスタにゃるら / カラクリスタ

h2o でヘッダを完全に上書きしたい場合には header.set を使う

サンプル

h2o.conf
hosts:
  "example.com":
    "/":
      "header.set":
        - "Access-Control-Allow-Origin: *"
      "file.dir": "/path/to/dir"

解説

h2o でヘッダを書き換える際に、既存のヘッダを完全に置き換えたい場合には header.set を使うこと。

参考

ヘッダ周りのディレクティブについては下記のページに全て掲載されている:

https://h2o.examp1e.net/configure/headers_directives.html