H2OとPHPの話
who am i ?
UZULLA
PHPer
Hachioji.pm
「メールフォームを書いて生活」
H2Oについて
• the optimized HTTP/1, HTTP/2 server
• https://github.com/h2o/h2o
• @kazuho さん作
• YAPC::Asia Tokyo 2015でのHTTP2のトーク
• http://yapcasia.org/2015/talk/show/
dead6890-09b7-11e5-998a-67dc7d574c3a
長所
• HTTP2を早速サポートしている
• 「デフォルトで」高速に動作する
• 日本人が作っている(!)
• PHPとの親和性がある気がしないでもない
短所(?)
• ググれない
• まだ事例が少ない
• GithubのコードとISSUEを読もう
• 「そうだ、本人に聞こう」
• 機能の数はちょっと少ない(nginxやApacheに比べて、相手が
悪い)
PHPとの関係は?
• 本来特にない!
• ファイル拡張子でハンドラ指定できる
• fastCGIが使える
• "fastcgi.spawn"
PHPerとしては
• 「デフォルトで使いたい」→デフォルトで早い
• 「設定は短いほうがいい」→運用アプリ次第
• 「安全なのがいい」→デフォルトで安全(っぽい)
• 「.htaccessが使いたい」→!(Apacheだけでしょw)
PHPとの連携設定
• file.custom-handlerを登録
• redirectを指定
• done!
file.custom-handler
• 指定の拡張子で何をするか指定
• PHPの場合はFastCGIにつなぐように
例 fastcgi.connectでtcpで接続
file.custom-handler:
extension: .php
fastcgi.connect:
host: 127.0.0.1
port: 9000
type: tcp
例 fastcgi.connectでUNIXドメインソケットで接続
file.custom-handler:
extension: .php
fastcgi.connect:
port: /tmp/fcgi.sock
type: unix
例 fastcgi.spawnでphpプロセスをh2oで管理
file.custom-handler:
extension: .php
fastcgi.spawn: "PHP_FCGI_CHILDREN=10 exec /path/to/php-cgi"
• php-fpmではなく、php-cgiな所に注意
fastcgi.connectとspawnの差
• connectは既存のfastcgiデーモンに繋ぎに行く
• 今まで同様、php-fpmなどで立てておく
• spawnは「H2Oが」phpを起動、管理しておいて、それを使
う
• php-fpm(マネージャ)が別途不要
どちらにすべきか
• どっちでもよさそう
• spawnはfcgiのconfigを書かなくて良い
• 当然、監視点も減る(はず)
• (H2Oのエラーログ日付がなくない?)
この時点で
• /index.phpとか /form.php?hoge=fuga みたいなのは動く
• / とか、 /user/123 みたいなのはうごかない
• "try_files"的指定が必要
try_filesとは?
• nginxではそう呼んでる
• アクセスされたURLに対応するファイルを順番に探す仕組み
• / にきたら /index.html が返されるじゃろ?ああいうのです
• 「.phpって見えるとダサイよね!」
nginxだと
try_files $uri $uri/ /index.php?$args;
• 一例です、nginx.confなどに書く
• ?の後にイチイチ$argsとつける
• これだけだと簡単にみえるが、実際には闇深い(時間ないので
説明は省略)
Apacheだと
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
• 一例です、http.confや.htaccessに書く
• 二行目の !-f は、ファイルがなかったら、というCond
• Apacheはルール行に「?」以降のargsの記述は不要
H2Oでの設定例
"doraperson2015.yapcasia.org:443":
paths:
/:
file.dir: /var/www/dpe/htdocs
redirect:
url: /index.php/
internal: YES
status: 307
• ファイルがなかったらindex.phpに内部リダイレクト
• .phpは前述のハンドラが登録されているので、fastCGIへ
例 勿論複数書ける、アプリ相乗り時には必須
"doraperson2015.yapcasia.org:443":
paths:
/auth:
file.dir: /var/www/dpe/htdocs/auth
redirect:
url: /auth/index.php/
internal: YES
status: 307
/:
file.dir: /var/www/dpe/app/htdocs
redirect:
url: /index.php/
internal: YES
status: 307
余談:file.custom-handlerを使わない方法
hosts:
"example.com:80":
paths:
"/app":
fastcgi.connect:
port: /tmp/fcgi.sock
type: unix
• こういうのも書けるけど、説明省略
簡単ですね!
• try_files的なのを理解してれば
• 拡張子で判定するので、コードお漏らししづらい、セキュア
• ただ、phpのアプリがドンドン相乗りすると設定ファイルは
のびていくな…htaccessほしい…
まとめ
• H2OとPHPは簡単に連携できる、apacheやnginxよりも簡
単!
• H2Oをつかうとhttp2がつかえてなんとなくオシャレ、しか
もデフォルトで早い(らしい)
• まだ設定のテンプレ(秘伝のたれ)はあまり見ないので、今
頑張ればブクマが稼げる!(?)
• やろう!H2O!

H2O and php