Heroku は、あらかじめ設定された複数のプログラミング言語に対応するクラウド PaaS です。インフラは Heroku が担うため、コマンドライン作業ではなくアプリケーションに集中できます。
この記事では、トラフィックを HTTPS で配信するよう Heroku と Cloudflare を設定する方法を説明します。前提として、Cloudflare 上で有効なドメイン と、稼働中の Heroku アプリがあるものとします。
Heroku の手順に従います: Custom Domain Names for Apps ↗。
次に、サブドメインと apex ドメイン(ルートドメインとも呼ばれます)の DNS レコードを追加します。手順は Cloudflare での DNS レコードの管理 を参照してください。
Cloudflare ダッシュボードで DNS Records ページを開きます。
Records を開く ↗手順 1 でサブドメイン用に取得したカスタムドメイン(DNS target とも呼ばれます)を指す、www の CNAME レコードを追加します。
| タイプ | 名前 | ターゲット | プロキシの状態 |
|---|---|---|---|
CNAME |
www |
{example-domain}.herokudns.com |
Proxied |
Heroku にルートドメイン(apex ドメイン)を追加する場合も、ルートから指す CNAME レコードが必要です。Heroku は利用者向けに IP アドレスを公開しないため、A レコードは使えません。
ルートドメインへのリクエストは、Cloudflare の CNAME flattening で解決できます。
ルート用の CNAME レコードを追加し、手順 1 でドメイン用に取得した DNS target を指します。
| タイプ | 名前 | ターゲット | プロキシの状態 |
|---|---|---|---|
CNAME |
@ |
{example-domain}.herokudns.com |
Proxied |
ドメインで Cloudflare が動作しているかを確認するいちばん簡単な方法は、cURL コマンドを実行することです。
curl -I www.example.comHTTP/1.1 200 OK
Date: Tue, 23 Jan 2018 18:51:30 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Cache-Control: public, max-age=0
Last-Modified: Mon, 31 Dec 1979 04:08:00 GMT
X-Powered-By: Express
Server: cloudflare
CF-RAY: 3e1cf1d936f28c52-SFO-DOGCloudflare がプロキシしているリクエストは、CF-Ray レスポンスヘッダーで識別できます。このヘッダーがあれば、リクエストは Cloudflare によってプロキシされています。
DNS 設定に追加したサブドメインについても、同じ cURL コマンドを繰り返せます。
Cloudflare は有料プランすべてに SAN のワイルドカード証明書を、Free プランには SNI ワイルドカード証明書を提供します。SSL の詳細は Cloudflare の SSL ↗ を参照してください。
意味が分からない場合は、Cloudflare ダッシュボードの SSL/TLS アプリで Overview タブを開きます。一般の訪問者へサイトを HTTPS で配信するには、Flexible モードを選びます。
証明書の状態が • Active Certificate に変わると、着信トラフィックは HTTPS でサイトへ配信されます。訪問者のブラウザーバーには、ドメイン名の前に HTTPS が表示されます。
サイトへのトラフィックをすべて暗号化するには、Cloudflare で自動 HTTPS リダイレクトを強制できます。 設定方法は Always Use HTTPS を参照してください。
すべてのリクエストが HTTPS に強制されているかは、cURL コマンドで確認できます。
curl -I -L example.comHTTP/1.1 301 Moved Permanently
Date: Tue, 23 Jan 2018 23:17:44 GMT
Connection: keep-alive
Cache-Control: max-age=3600
Expires: Wed, 24 Jan 2018 00:17:44 GMT
Location: https://example.com/
Server: cloudflare
CF-RAY: 3e1e77d5c42b8c52-SFO-DOGドメインで SSL がまだ動作していない場合(たとえば SSL 証明書が未発行の場合)は、リダイレクトのあとに 525 または 526 の HTTP レスポンスが返ります。
Universal SSL 証明書の発行には、通常最大 24 時間かかります。有料の SSL 証明書は 10〜15 分で発行されます。