h2oでreverse proxy

HTTP/2対応の高速なHTTPサーバ、h2oを使ってみた。

今回、HTTP/2でリクエスト受けて裏側のアプリサーバへHTTP/1.1で流すreverse proxyとして動かしてみた。reverse proxy先へはunix domain socket経由で、またdaemontools経由で起動させるようにした。

環境

  • h2o v1.4.3
  • OS CentOS 6.5

インストール

自前でbuildした

cmake & libyaml

$ sudo yum install cmake libyaml

libuv

libuv 1.0.0 以上が必要。CentOSのパッケージのバージョンは古いため自前でbuild。libuvをbuildするためにはlibtoolが必要だったのでyumで入れた。

sudo yum install libtool
cd /var/tmp
wget https://github.com/libuv/libuv/archive/v1.7.0.tar.gz
tar zxvf v1.7.0.tar.gz
cd libuv-1.7.0
./autogen.sh
./configure --prefix=/usr/local/libuv-1.7.0
make
sudo make install

h2o

cd /var/tmp
wget https://github.com/h2o/h2o/archive/v1.4.3.tar.gz
tar zxvf v1.4.3.tar.gz
cd h2o-1.4.3/
PKG_CONFIG_PATH=/usr/local/libuv-1.7.0/lib/pkgconfig/ cmake -DWITH_BUNDLED_SSL=on -DCMAKE_INSTALL_PREFIX=/usr/local/h2o-1.4.3 .
make
sudo make install
sudo ln -s /usr/local/h2o-1.4.3 /usr/local/h2o

設定

設定はこんな感じ。

#/etc/h2o/h2o.conf
---
max-connections: 1024
num-threads: 4
user: nobody
hosts:
  "www.example.com:80":
    listen:
      host: 0.0.0.0
      port: 80
    paths:
      "/":
        redirect: https://www.example.com/
  "www.example.com:443":
    listen:
      host: 0.0.0.0
      port: 443
      ssl:
        certificate-file: /etc/h2o/www.example.com.cer
        key-file: /etc/h2o/www.example.com.key.pem
    proxy.timeout.io: 30000
    paths:
      "/":
        proxy.reverse.url: http://[unix:/tmp/unicorn.sock]/
        proxy.preserve-host: ON
      "/assets":
        file.dir: /path/to/app/public/assets
access-log: /var/log/h2o/access.log
error-log: /var/log/h2o/error.log
pid-file: /var/spool/h2o/pid
http2-reprioritize-blocking-assets: ON
  • 基本HTTPSで受ける(HTTPできたらHTTPSにリダイレクト)
  • 裏側のアプリ(Rails)とのつなぎはTCPではなくunix domain socket経由にしてみた

起動スクリプト

ちゃんと動かすために今回はdaemontools経由で起動させてみた。

#/service/h2o/run
#!/bin/sh
exec 2>&1
DAEMON=/usr/local/h2o/bin/h2o
CONFIG=/etc/h2o/h2o.conf

if [ ! -x "$DAEMON" ]; then
  echo "not executable: $DAEMON" >&2
  exit 1
fi

# Test configuration
$DAEMON -t -c $CONFIG
if [ $? -ne 0 ]; then
  echo "Failed to test $CONFIG" >&2
  exit 1
fi

ulimit -n 32896

exec 
  setuidgid root 
  $DAEMON 
  -m master 
  -c $CONFIG 
  ;
  • -t で起動せずコンフィグのsyntaxチェックできる。
  • -m master でh2oを起動するとデーモンモードで動く。HUPシグナルを受け取るとgraceful restartしてくれるモード。
  • -m asterで起動すると中ではServer::Starterがh2oを起動してる
  • abで負荷かけつつサーバ側でwhile [ 1 ]; do sleep 1 ; echo ok ; svc -h /service/h2o/ ; doneやってみたけど無事捌いてくれた。

まとめ

以上、h2oを動かした。

社内にあるほぼ個人プロジェクトサイトをSSL化するついでにnginxからh2oに置き換えて様子見中。自分で構築したサイトでChromeのSPDY indicatorが青く(HTTP/2)に光るの嬉しいな。

参考