Caddy v2 で IP アドレスだけを返すサーバを作ってみたら。
最近気に入っていろいろ試している Web サーバ Caddy。
そんな Caddy のドキュメントを参照していたところ、
ある部分で目が止まりまして。
.RemoteIP
Returns the client’s IP address.
{{.RemoteIP}}
あれ? これって……これが作れるんじゃないの?
これです。
……あ、IP アドレス出してますけど、サーバアドレスです。もう消してますよ。
(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 の使い方を簡単にまとめました。