最近気に入っていろいろ試している Web サーバ Caddy。
そんな Caddy のドキュメントを参照していたところ、
ある部分で目が止まりまして。

.RemoteIP
Returns the client’s IP address.

{{.RemoteIP}}

あれ? これって……これが作れるんじゃないの?

Chrome の例

これです。

……あ、IP アドレス出してますけど、サーバアドレスです。もう消してますよ。

cURL の例

(root だけどインスタンス起動してすぐの実行なので気にしないで……😉 )
知ってます? 自分の回線やサーバの公開 IP アドレスを知るために
IP アドレスだけをテキストで返してくれるサービスです。
これが意外と便利で世界中でサービスが公開されていたりします。

例えば ダイナミック DNS で使われています。
Caddy v1 のプラグインにも dyndns があるのですが……

http://whatismyip.akamai.com/ http://ipv4.myexternalip.com/raw 等を挙げてます。
で、ふとひらめいたのですね。💡

これを日本のサーバで用いたら、良いレスポンスが得られるのでは?
試してみましょう。

Caddyfile:

example.net.eu.org {
    tls [email protected]
    root * /home/balloon/example.net.eu.org
    templates
    encode zstd gzip
    file_server
}

Caddy v2 だと gzip 以外に Zstandard 圧縮もサポートしています。
これらを有効にしてみました。

ちなみに SSL 証明書を発行せず http 接続にしたい場合は、
ドメインに :80 を付けて tls の行を消して下さい。

Caddyfile:

example.net.eu.org:80 {
    root * /home/balloon/example.net.eu.org
    templates
    encode zstd gzip
    file_server
}

特に設定したての VPS・専用サーバではじめて Caddy にドメインを設定する場合、
Let’s Encrypt が証明書発行に失敗する事があります。
(例えばネームサーバの設定したてで Let’s Encrypt のサーバが参照できなかった)
発行失敗すると、レート制限で 1 時間保留が必要です。
なので、一度 http 接続で参照できる事を確認してから、
:80 削除・tls 追加で https 接続へ切り替えるようにすると確実ですよ。

index.html:

{{.RemoteIP}}

テンプレートを有効してあるので、index.html で処理できます。
IP アドレスのために PHP などを使用する必要がないんです。

ついでに さくらのレンタルサーバ (Apache 使用・HTTP/2 採用)で
SSI と PHP を使った場合も試してみましたよ。

index.shtml:

<!--#echo var="REMOTE_ADDR" -->

index.php:

<?php
echo $_SERVER['REMOTE_ADDR']."\n";

把握できた世界中のサービスも含めて計測。
初回はネームサーバ参照で遅れるのでこれを省いて数回参照し、
その平均としました。結果がこちら。

秒 サービス
0.02 http://whatismyip.akamai.com/
0.03 (Caddy http)
0.03 http://inet-ip.info/ip
0.04 (さくらのレンタルサーバ http SSI)
0.04 (さくらのレンタルサーバ http PHP)
0.04 http://icanhazip.com/
0.05 (Caddy https)
0.06 https://icanhazip.com/
0.09 https://canhazip.com/
0.12 (さくらのレンタルサーバ https SSI)
0.18 https://ip.now.sh/
0.20 (さくらのレンタルサーバ https PHP)
0.21 http://ifconfig.me/ip
0.24 https://bot.whatismyipaddress.com/
0.27 http://wgetip.com/
0.28 https://ifconfig.me/ip
0.29 https://ipecho.net/plain
0.29 https://ipinfo.io/ip
0.29 https://wgetip.com/
0.36 http://checkip.amazonaws.com/
0.47 http://alma.ch/myip.cgi
0.47 http://l2.io/ip
0.52 http://ident.me/
0.53 https://ifconfig.co/ip
0.55 http://eth0.me/
0.56 https://bot.whatismyipaddress.com/
0.57 http://ip.tyk.nu/
0.76 https://checkip.amazonaws.com/
0.77 https://api.ipify.org/
0.80 https://ipv4.wtfismyip.com/text
0.80 https://wtfismyip.com/text
0.85 http://tnx.nl/ip
0.97 https://alma.ch/myip.cgi
0.99 https://l2.io/ip
1.09 https://ident.me/
1.19 https://eth0.me/
1.20 https://ip.tyk.nu/
1.65 https://tnx.nl/ip

HTTP で 0.03 秒、HTTPS で 0.05 秒でした。HTTPS は最速です!! はやい!! 😲🤩😁

他のサービスでレスポンスがはやいのは Akamai と Cloudflare 関連で、
東京に CDN サーバがあるサービスになります。
さくらのレンタルサーバも HTTP は PHP 動作でも 0.04 秒となかなか良い数字です。
HTTPS で 0.12~0.20 秒とガクンと落ちてしまっているのは残念ですが……

これで「Caddy はやいなぁ~試してみようかな~」と思った人がいれば幸いです。
お試し下さい。


追加 2020/02/05

その後 Caddy 原作者の Matt さんとやりとりで(すっかり覚えられてしまった…… 😅)
2020/02/05 に v2 のソースでは respond で templetes が使えるように改修されました。
templetes は HTML である必要があるので、header で Content-Type を付けています。

Caddyfile:

example.net.eu.org {
    tls [email protected]
    templates
    header Content-Type text/html
    respond "{{.RemoteIP}}"
}

と index.html を作らず Caddyfile のみで対処できるようになりました。
ソースの改修状態なので、次のベータ版(おそらく 2.0.0b14)から含まれます。
いや、自分は動作確認のために go インストールしてビルドしましたけど…… 😆

それ以外にも「Caddy に入れてみたから確認してみてよ~」とか
英語でメッセージいただいたりしています 💻😲
でもさすがに Caddy でも日本-イギリスは 0.9 秒でした。遠すぎます~ 😆


追加 2020/02/06

さくらのレンタルサーバでは Apache を採用してて、SSI も動作します。
SSI だと Apache で処理が完結するので、PHP より速度が速くなる事を期待して追加しました。
特に https でだいぶ速くなっています。Apache でも工夫次第ではやくなりますね。


追加 2020/02/13

2月12日に 2.0 beta 14 が公開されています。

respond "{{.RemoteIP}}" という表記が
このバージョンのバイナリーでも使用できるようになっています。
ソースからのビルドは不要になりました。

結果に https://ip.now.sh/ を追加しています。
Vercel は東京にサーバがあります。https では良い数字が出ていますね


追加 2020/02/20

Caddy の使い方を簡単にまとめました。