# Cloudflare ってなんだ?
WARNING
書きかけです。
(…世界中のプロダクトオーナーの皆様…聞こえますか… いまあなたの心に直接語りかけています… 表示速度は正義です…サイトの表示時間が0.1秒遅くなるごとに…ECの売り上げば1%下がります…会員登録率も…継続率も…広告をうつまえに…とりあえず速度を上げるのです…)
— 深津 貴之 / THE GUILD / note (@fladdict) November 28, 2016
# 仕組みと構成
設定にあたってほしい知識
昔 NHK のニュースを見ていた時に...
以下のサイトがとても参考になります。
- 第1回 CDN の 仕組み - キャッシュ屋blog (opens new window)
- CDN 料金 一覧2017年(高いCDNと安いCDNの違い) - キャッシュ屋blog (opens new window)
# 環境
今回の環境は、次の通りになります。 バリュー・ドメインで example.com と言うドメインを買いました。 Heroku にアップロードしたウェブアプリに、 Cloudflare を使ってルートドメインを割り当てます。 パソコンは Mac を使いました。
作業OS | macOS |
サーバ | Heroku |
レジストラ | バリュー・ドメイン |
裏技 DNS サーバ | Cloudflare |
ちなみに Cloudflare 以外にも AWS の Route53 で alias recoed (opens new window) というのを使っても同じことができそう。試してはいません。
# Step 1. アカウントの登録
# Step 2. ドメインの登録
# Step 3. リソースレコードの追加
DNS サーバの設定、1行1行のことをリソースレコードということがあります。
# (1) 固定の IP アドレスが払い出されている場合
# (2) DNS サーバが払い出されている場合
PaaS である Heroku や、あるいはレンタルサーバであるロリポップなどは DDNS を使い固定 IP アドレスではなく DNS サーバをはらい出してくれます。
CNAME レコードを追加します。 これについては後述させていただきます。
Cloudflare に Heroku の DNS サーバを登録 Heroku が出してくれた DNS target を Cloudflare の DNS サーバに登録します。
Cloudflare > DNS > DNS Records
Type Name Value TTL
CNAME example.com dnstarget.herokudns.com Automatic
ビックリマーク !
がつきますが特に問題ありません。
ビックリマーク !
の上にカーソルを合わせると
次のようなメッセージが表示され、和訳すると以下のようなものです。
このレコードには CNAME Flattening が適用されます。 なぜならルート(即ちエイペックス)CNAME レコードは、 DNS の仕様で制限されているためでしょう。 詳細はこちら
CNAME Flattening will be applied to this record since root (i.e. apex) CNAME records are limited by the DNS specification. Learn more
# Step 4. ネームサーバの変更
VALUE-DOAMIN に登録 Cloudflare > DNS > Cloudflare Nameservers に書かれている DNS サーバを VALUE-DOMAIN に登録する。
VALUE-DOAIMN > ネームサーバーの変更 を開き追記。
# Step 5. TTL が過ぎるのを待つ
TTL が経過するまで待つ。TTL は dig コマンドで確認できる。 3, 4 日待たされました。
# 設定反映前
$ dig @8.8.8.8 +trace python.ms
; <<>> DiG 9.8.3-P1 <<>> @8.8.8.8 +trace python.ms
; (1 server found)
;; global options: +cmd
. 153864 IN NS m.root-servers.net.
. 153864 IN NS b.root-servers.net.
. 153864 IN NS c.root-servers.net.
. 153864 IN NS d.root-servers.net.
. 153864 IN NS e.root-servers.net.
. 153864 IN NS f.root-servers.net.
. 153864 IN NS g.root-servers.net.
. 153864 IN NS h.root-servers.net.
. 153864 IN NS i.root-servers.net.
. 153864 IN NS a.root-servers.net.
. 153864 IN NS j.root-servers.net.
. 153864 IN NS k.root-servers.net.
. 153864 IN NS l.root-servers.net.
;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 46 ms
ms. 172800 IN NS ns.cocca.fr.
ms. 172800 IN NS ns.coccaregistry.org.
ms. 172800 IN NS ms-ns.anycast.pch.net.
;; Received 253 bytes from 192.203.230.10#53(192.203.230.10) in 28 ms
python.ms. 86400 IN NS ns1.value-domain.com.
python.ms. 86400 IN NS ns2.value-domain.com.
;; Received 79 bytes from 185.17.236.111#53(185.17.236.111) in 306 ms
;; connection timed out; no servers could be reached
$
# 設定反映後
$ dig python.ms @8.8.8.8 +trace
; <<>> DiG 9.8.3-P1 <<>> python.ms @8.8.8.8 +trace
;; global options: +cmd
. 192234 IN NS m.root-servers.net.
. 192234 IN NS b.root-servers.net.
. 192234 IN NS c.root-servers.net.
. 192234 IN NS d.root-servers.net.
. 192234 IN NS e.root-servers.net.
. 192234 IN NS f.root-servers.net.
. 192234 IN NS g.root-servers.net.
. 192234 IN NS h.root-servers.net.
. 192234 IN NS i.root-servers.net.
. 192234 IN NS j.root-servers.net.
. 192234 IN NS a.root-servers.net.
. 192234 IN NS k.root-servers.net.
. 192234 IN NS l.root-servers.net.
;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 436 ms
ms. 172800 IN NS ns.cocca.fr.
ms. 172800 IN NS ms-ns.anycast.pch.net.
ms. 172800 IN NS ns.coccaregistry.org.
;; Received 253 bytes from 192.36.148.17#53(192.36.148.17) in 159 ms
python.ms. 86400 IN NS pablo.ns.cloudflare.com.
python.ms. 86400 IN NS abby.ns.cloudflare.com.
;; Received 83 bytes from 204.61.216.33#53(204.61.216.33) in 118 ms
python.ms. 300 IN A 104.24.98.177
python.ms. 300 IN A 104.24.99.177
;; Received 59 bytes from 173.245.58.100#53(173.245.58.100) in 24 ms
$
# CNAME Flattening
CloudFlare では CNAME Flattening を提供してくれている。 ただ、この機能はおろか CloudFlare が何者なのかさえわからない...。
Cloudflare は CDN に分類されるらしい。CDN が何かも知らない。
有名な大学のビジネスコンテストで1位を取ったらしいけど、 CDN やってくれて高性能な DNS サーバまで提供してくれる。 いまのところ無課金です。
もはや慈善団体以外の何物にも感じられない。 はやくどのタミングで課金されるか調べないと...
ここでは CNAM Flattening について考えます。
# (1) 概要
CloudFlare の CNAME レコードを書き込むと
CNAME example.com jkjfas.herokudns.com
CNAME example.com jkjfas.herokudns.com
CloudFlare の実際の設定は、 A レコードに変換してくれている。
python.ms. 300 IN A 104.24.99.177
python.ms. 300 IN A 104.24.98.177
- Herokuで有料Dynoを使いつつ、独自ドメインをCloudflareでSSL対応(https化)してルートドメイン設定する方法 (opens new window)
- Cloudflareによるドメイン設定がうまくいきません(Heroku)- teratail (opens new window)
- デザイナーがHerokuでプロフィールページを実装するまで【ドメイン発行料以外0円】 (opens new window)
# (2) 仕組み
「権威サーバ」として答えるだけではなく、 「DNS リゾルバ」として A レコードを見つけまで問い合わせ続け、 A レコーをの結果を返す。
CNAME Flattening の導入 (opens new window)
Introducing CNAME Flattening - CloudflareCNAME Flattening を実現するために、「権威 DNS サーバ」の構成を、 特定の場合において、「DNS リゾルバ」として動作するように拡張しました。
To accomplish this, we extended our authoritative DNS infrastructure to, in certain cases, act as a kind of DNS resolver.これによって、もしルートに CNAME があった場合、 直接レコードを返すのではなく
What happens is that, if there's a CNAME at the root, rather than returning that record directlyA レコードを発見するまで CNAME の連なりを再帰的に処理します。
we recurse through the CNAME chain ourselves until we find an A Record.A レコードを発見した箇所で、A レコードと関連する IP アドレスを返します。
At that point, we return the IP address associated with the A Record.
# (3) 現在の解決策 CNAME Flattening
またその禁止されていることを CNAME で可能にする方法を CNAME Flattening というらしい。
CNAME Flattening を理解し設定する - Cloudflare (opens new window)
Understand and configure CNAME Flattening - CloudflareCNAME Flattening は DNS の仕様に反することなくルートドメインに対して CNAME レコードを作成することができます。
CNAME Flattening allows a CNAME record to be created for the root domain without violating DNS specifications.DNS の仕様 (RFC) によって、ドメインは CNAME レコードと他の異なるタイプの DNS レコードが、 同じ名前を共有するように設定することはできない。 また DNS の仕様 (RFC) は、CNAME レコードではなく A レコードと関係している MX レコードを書くように定めている。
Per DNS specifications (RFCs), a domain cannot have a CNAME record and another DNS record of a different type if both records would share the same name. DNS RFCs also require an MX record to correspond to a related A record and not a CNAME.あなたの root への CNAME レコード(例えば example.com から example.herokuapp.com への CNAME レコード)が必要になった時、 このような仕様は問題になり得る(なんで?)。 しかもまた root ドメインにおいて、例えば メール配信のための MX レコードのような別の DNS レコードの種類が必要なります。
This is problematic when you need a CNAME for your root (for example, a CNAME from example.com to example.herokuapp.com) but also need another type of DNS record at the root domain such as an MX record for mail delivery.Typically, the aforementioned situation would cause problems receiving email. However, CNAME Flattening ensures the chain of CNAMEs is followed to an A or AAAA record to allow mail delivery while still adhering to DNS RFCs. The CNAME responses are cached and DNS TTLs are respected.
CNAME Flattening still works if the corresponding DNS CNAME record is "grey clouded" in the DNS app of the Cloudflare dashboard.
# 参考文献
サイトを Cloudflare に登録する 基本は公式サイトに載っている。
- [Configure Cloudflare and Heroku over HTTPS](Configure Cloudflare and Heroku over HTTPS)
日本語の説明も充実している。
2018/09/28 【完全無料】Herokuで独自ドメイン + HTTPS に対応する【Rails】 (opens new window)
2018/02/02 『Heroku + Cloudflare』でルートドメインかつSSLでサイトを運用する (opens new window)
2015/01/06 Set up CloudFlare's free SSL on Heroku (opens new window)
# おわりに
以上になります。ありがとうございました。