H2O - the optimized HTTP server の設定メモ
このスクラップについて
このスクラップは、
の設定についてのメモです。
設定を行うためのヒントは上記プロジェクトページか、
を参照すると良いです。
h2o で hanlder の実行順序を制御する
サンプル
hosts:
"example.com":
"/":
- "mruby.handler": /path/to/script.rb
- "file.dir": /path/to/media
概要
h2o で各ハンドラの実行順序を制御したい場合には paths.{path_info}
に配列を指定する。
そうすると配列の先頭からハンドラが実行される。
出典
- Syntax and Structure - Configure - H2O - the optimized HTTP server
- Path-level configuration セクションの
Starting from version 2.1
から始まる行に情報がある
mruby.handler
で次の handler の処理を呼び出す
サンプル
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-IP
は fly.io で利用される クライアントの IP が入るヘッダ
参考情報
- Advice on caching and compressing HTML? · Issue #1863 · h2o/h2o
- この Issue の i110 さんのコメンドに上記コードのヒントがあった
mruby
でファイル操作をする際の注意点
デフォルト設定において h2o
はプロセスを nobody:nobody
で生やすため、mruby
ハンドラでファイル操作をする場合、パーミッションに気を付ける必要がある。
また nobody:nobody
という設定にしているのはセキュリティ上の理由であるため、 mruby
ハンドラでファイル操作をするためには、
$ chown -R nobody:nobody /path/to/dir
と、特定のディレクトリのみに適用すると良い。
h2o で nginx の try_files のようなことをする
サンプル
hosts:
"example.com":
"/":
"file.dir": "/path/to/dir"
"proxy.reverse.url": "http://localhost:8080/"
解説
h2o で nginx の try_files
のような機能を実現するためには、file.dir
と proxy.reverse.url
などのバックエンドへ繋ぐ系のハンドラを組合わせれば良い。
上記の例の場合、例えは http://example.com/foo
へアクセスした場合、まず /path/to/dir/foo
が存在するか参照され、次に http://localhost:8080/foo
が参照されるようになる。
なおハンドラの実行順序を確実に制御したい場合には、上記の "/":
以下の値を配列形式で指定すること。
header.set
を使う
h2o でヘッダを完全に上書きしたい場合には サンプル
hosts:
"example.com":
"/":
"header.set":
- "Access-Control-Allow-Origin: *"
"file.dir": "/path/to/dir"
解説
h2o でヘッダを書き換える際に、既存のヘッダを完全に置き換えたい場合には header.set
を使うこと。
参考
ヘッダ周りのディレクティブについては下記のページに全て掲載されている: