h2o and php
TRANSCRIPT
H2OとPHPの話
who am i ?
UZULLAPHPerHachioji.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 OnRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^ 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!