CLOVER🍀

That was when it all began.

Go製Webサーバー、Caddyで遊ぶ

ちょっとした調べ物をしていたら、CaddyというGo製のWebサーバーが便利だということを知りまして。

Caddy

CADDYで手軽にHTTP/2サーバを立てる - yuw27b’s blog

Caddy で HTTP/2 と php-fpm を利用する - Qiita

Caddy?

Goで実装されたWebサーバーだそうです。

Caddy

https://github.com/mholt/caddy

機能はこちら。
Features

  • 設定ファイルが簡単&バリデーションができる
  • 静的ファイル配信&動的配信(テンプレート、プロキシ、FastCGI)が可能
  • CLIサポート
  • プラグイン
  • マルチコア対応
  • 組み込みWebサーバーとして使用可能
  • コマンド起動が可能
  • Let's Encrypt対応
  • 自己書名証明書の自動生成も可能
  • HTTP/2、QUIC、WebSocketが使える

などなど、いろいろあるようですが、ちょっとしたWebサーバーとして扱うことも簡単にできそうなので、良さそうだなぁと。

というわけで、ちょっと試してみます。

インストール

ダウンロードは、こちらから。
Download

今回は、無料のPersonalライセンスを選択します。ページ下部にダイレクトリンクができるので、そちらを使ってダウンロード。

現時点でのバージョンは、0.10.10のようです。

$ wget https://caddyserver.com/download/linux/amd64?license=personal -O caddy_v0.10.10_linux_amd64_personal.tar.gz

ダウンロード時に、プラグインを付けることもできるみたいですね。

https://caddyserver.com/download/linux/amd64?plugins=http.prometheus&license=personal

とっかかりは、このあたりを見るとよいでしょう。

Quick Start

Begginer Tutorial

今回は、特になにも付けずダウンロード、展開。

$ tar -zxvf caddy_v0.10.10_linux_amd64_personal.tar.gz

起動は、カレントディレクトリに展開された「caddy」ファイルを実行します。

ファイル一覧。

$ ls -1
CHANGES.txt
EULA.txt
LICENSES.txt
README.txt
caddy
caddy_v0.10.10_linux_amd64_personal.tar.gz
init

起動。

$ ./caddy 
Activating privacy features... done.
http://:2015
WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with "ulimit -n 8192".

ファイルディスクリプタ数の警告が設定によっては出るみたいですが、これでカレントディレクトリをドキュメントルートとして2015ポートをリッスンして
起動します。

確認。

$ curl localhost:2015/README.txt
CADDY 0.10.10

Website
	https://caddyserver.com

Community Forum
	https://caddy.community

Twitter
	@caddyserver

Source Code
	https://github.com/mholt/caddy
	https://github.com/caddyserver


For instructions on using Caddy, please see the docs on the
website. For a list of what's new in this version, see
CHANGES.txt.

For a good time, follow @mholt6 on Twitter.

Want to get involved with Caddy's development? We love to have
contributions! Please file an issue on GitHub to discuss a
change or fix you'd like to make, then submit a pull request
and we'll review it! Your contributions will reach millions
of people who connect to sites served by Caddy.

Extend Caddy by developing a plugin for it! Instructions on
the project wiki: https://github.com/mholt/caddy/wiki

And thanks - you're awesome!

If you think Caddy is awesome too, consider sponsoring it:
https://caddyserver.com/pricing - and help keep Caddy free
for personal use.


---
(c) 2015-2017 Light Code Labs, LLC

はい。

CLIでオプション指定

caddyコマンドには、けっこうな数の起動オプションがあり、設定を変更できます。

Command Line Interface

いくつか、使いそうなものを。

ポートの変更。リッスンポートを8080に。

$ ./caddy -port 8080

ドキュメントルートの変更。

## コンテンツ作成
$ mkdir docroot
$ echo 'Hello Caddy!' > docroot/hello.txt

## ドキュメントルートを指定して起動
$ ./caddy -root docroot

## 確認
$ curl localhost:2015/hello.txt
Hello Caddy!

Caddyfileを作成する

設定は、CLIで指定するだけではなく、「Caddyfile」という設定ファイルを使って指定することもできます。

Caddyfile Syntax

先ほどの、ポート8080でdocrootな指定の例だとこうなるのですが…
※ちなみに、ポートを指定しないと80でリッスンしようとするみたいです
Caddyfile

:8080
root docroot

このまま起動すると、デフォルトでメールアドレスの入力を求められ、Let's Encryptを使おうとします。

$ ./caddy 
Activating privacy features...
Your sites will be served over HTTPS automatically using Let's Encrypt.
By continuing, you agree to the Let's Encrypt Subscriber Agreement at:
  https://acme-v01.api.letsencrypt.org/terms
Please enter your email address so you can recover your account if needed.
You can leave it blank, but you'll lose the ability to recover your account.
Email address:

とりあえず、HTTPSについてはオフにしたい場合は、「tls off」を指定します。
Caddyfile

:8080
root docroot

tls off

これで起動すると

$ ./caddy

先ほどCLIで指定した内容を、合わせた挙動になります。

$ curl localhost:8080/hello.txt
Hello Caddy!

デフォルトではカレントディレクトリにある「Caddyfile」を読み込むようですが、別ディレクトリにある場合は「-conf」で指定すればよいようです。

$ ./caddy -conf /path/to/Caddyfile

ちなみに、自己書名証明書をCaddyに自動生成させる場合は、「tls self_signed」と指定します。
tls

tls self_signed

確認。

$ curl -k https://localhost:8080/hello.txt
Hello Caddy!

このあたりを見ていると、もっと複雑な設定が書けそうですが、今回は対象外。

GitHub - caddyserver/examples: OBSOLETE. This repo was for Caddy v1. For v2 and newer, see our forum's wiki category.

プロキシ

最後に、プロキシサーバーとして使ってみましょう。

proxy

172.17.0.2にnginxサーバーを立てたとします。

$ curl 172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

このサーバーにプロキシしてみましょう。

Caddyfileを、次のように設定します。
Caddyfile

:2015
tls off

proxy / 172.17.0.2/

proxyディレクティブを指定します。

これで起動して

$ ./caddy

確認。

$ curl localhost:2015
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

無事、プロキシできたようです。

お手軽に使えそうで、なかなか便利そうな感じですね。ちょっとしたところから、使っていってみようかなと思います。