HTTP/2対応の軽量Webサーバー”Caddy”を使ってみた

先日、偶然こんな記事を見つけました。
Caddy - HTTP/2対応の開発用HTTPサーバ MOONGIFT

HTTP/2対応・単一バイナリのWebサーバーがあるらしい。
ということで、本家サイトでさらに情報収集してみる。
https://caddyserver.com/

特徴としては

  • 単一のバイナリファイル
  • Go言語で実装されている
  • リリースされたばかり(2015.4.30)
  • HTTP/2対応
  • Markdown記法対応
  • TLS1.2対応
  • リバースプロキシ対応
  • その他、主要な機能もだいたい備えてる

f:id:noobow34:20150524095116p:plain

FAQ(https://caddyserver.com/docs/faq)を要約すると

  • Apacheやnginxとは異なる特徴、目的利点がある
  • 特別な知識なしにWeb開発、デプロイ、ホスティングをできるようにする
  • 主目的はnginxはリバースプロキシであるのに対して、Caddyは静的ファイルの配信
  • 開発者だけでなくデザイナーやライターにも使えるように

ということが考えられているようです。

HTTP/2に対応しているWebサーバーはまだ少ないですし、出たばかりでこれだけ機能を備えているのはすごいし、設定も簡単そうなのでためしてみることにしました。

以下、さくらVPS上のCentOS6で試した結果になります。
まずは、ダウンロード。

$ wget https://github.com/mholt/caddy/releases/download/v0.6.0/caddy_linux_amd64.zip
$ mkdir Caddy
$ unzip caddy_linux_amd64.zip -d Caddy
Archive:  caddy_linux_amd64.zip
  inflating: Caddy/caddy             
  inflating: Caddy/CHANGES.txt       
  inflating: Caddy/README.txt

デフォルト設定で動かすならcaddyを実行するだけ。2015番ポートで起動します。

$ ./caddy
0.0.0.0:2015

とりあえず、テストしやすいように80番ポートで起動。80番で起動するにはsudoで起動しないとダメでした。

$ sudo ./caddy -port="80"
0.0.0.0:80

何もドキュメントがないので404になりますがサーバーが起動するのがわかります。
f:id:noobow34:20150524104731p:plain

コマンドラインのオプションでもいくつか設定できることはありますが、基本的にはCaddyfileと呼ばれる設定ファイルに設定を書きます。
The Caddyfile - Caddy
1行目にリッスンするアドレスとポート。それ以下は各ディレクティブを書きます。

0.0.0.0:80
gzip
log ../access.log

いくつか試してみましょう。

  • ドキュメントルートを設定
  • ファイルの拡張子を省略する設定(Clean URL)
0.0.0.0:80
root ./doc
ext .html

Caddyfileを指定して起動します。

$ sudo ./caddy -conf="./Caddyfile"

※ちなみにCaddyfileのファイル名がCaddyfileなら-confは省略できます。
拡張子無しで./doc/test.htmlにアクセスできました。
f:id:noobow34:20150524110840p:plain

さて、Caddyの一番の特徴であるHTTP/2を試してみましょう。
HTTP/2は規格上は暗号化は必須ではないようですが、CaddyではTLSを使ってやる必要があります。
設定で無効にしないかぎり、TLSを使えば勝手にHTTP/2になります。
私はStartSSLで、無料で正規の証明書を取得してますが、試すだけならオレオレ証明書でもいいでしょう。
(参考)
無料のSSL証明書StartSSLを活用する - Qiita
オレオレ証明書をopensslで作る(詳細版) - ろば電子が詰まっている

CaddyfileにTLSディレクティブを書きます。(TLS 公開鍵 秘密鍵
さらに、httpはhttpsにリダイレクトするようにしてみました。
TLSを有効にするときは、リッスンするアドレスにhttpとhttpsを明示したほうがいいみたいです。

http://xxx.xx {
        redir https://xxx.xx
}

https://xxx.xx {
root ./doc
ext .html
tls ./ssl/ssl.crt ./ssl/ssl3.key
}

無事、HTTP/2で通信できました。
Chrome ExtensionのHTTP/2 and SPDY indicatorで確認しました。青い稲妻が出てますね。
f:id:noobow34:20150524124502p:plain

ちなみ、暗号化方式はこんな感じ。(多分設定を変える方法は無い)→v0.7.0で設定可能になりました
f:id:noobow34:20150524141301p:plain

簡単な設定で使うことができ、今後にも期待できるWebサーバーだと思いました。