AWS CloudFront を使用したフルサイト CDN

皆さん、こんにちは。最近、AWS CloudFront (CF) を使用して、AWS 証明書で SSL オフロードを行い、サイト全体を高速化するように Discourse のインストールを設定しました。このインストールは、CDN と SSL の設定に関して公式ガイドから逸脱していることに注意してください。そのため、議論を呼ぶ可能性があり、将来のサポートに問題が生じる可能性があります。注意してください…そこには危険があります。ここで機能した設定を共有します。

  1. Discourse がポート 80 のみでリッスンするように設定し、app.yml の該当行をコメントアウトして Let’s Encrypt を無効にします。

  2. Discourse が x-forwarded-proto ではなく、CF ヘッダー cloudfront-forwarded-proto に注意を払うように設定します (CF はこれを渡さず、奇妙なことにオリジンに渡すように設定できません…信じられません :angry:)

  3. CF ディストリビューションを、AWS ACM 証明書 (生成したもの) を使用して、意図した公開ホスト名 (例: forum.example.com) の CNAME で設定します。

  4. CF オリジンを、Discourse をホストしている EC2 サーバーの公開 Elastic IP (例: ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com) を使用して設定します。HTTP のみ (つまりポート 80 のみ - 443 なし) で構成します。オリジンを forum-origin.example.com のような派手なホスト名で DNS に設定する必要はありません。EC2 ホスト名または IP で問題ありません。

  5. 異なるリクエストパスの CF 「ビヘイビア」を設定します。ここで重要なのは、明らかに静的リソースであるもののキャッシュ動作を設定し、それ以外 (つまり、キャッシュなしでオリジンにそのまま渡されるリクエスト) のキャッシュを行わないように設定することです。もう 1 つ重要な点は、最後のパススルー ルール (「デフォルト」) がカスタム「オリジン リクエスト ポリシー」を使用しており、CF cloudfront-forwarded-proto ヘッダーに加えて、すべての元のヘッダーをオリジンに渡すことです。また、ビヘイビアで HTTP から HTTPS へのリダイレクトを設定して、すべてのエンドユーザー リクエストが CF によって HTTPS に強制されるようにします。

  6. 「DISCOURSE_CDN_URL」を設定しないでください。

  7. 「force https」を有効にしてください。

  8. 「long polling base url」を設定しないでください - 空のままにします。プロキシ経由で渡す際に問題があるというすべての警告にもかかわらず、今のところ問題なく動作しています。CF のデフォルトのキープアライブは、接続がドロップするのを防ぐのに十分長いのかもしれません。

これで全部だと思います… :thinking:

結果として、HTTP/ドキュメント、すべてのサポート静的リソース、すべての AJAX 呼び出しなど、すべてのリクエストが同じドメイン名 (例: forum.example.com) で処理されます。キャッシュ動作 (およびパススルー動作) は、CF で設定された「ビヘイビア」によって決まります。すべての接続は、CF エッジで終了する AWS ACM 証明書を使用して暗号化され、その後、暗号化されていない/HTTP トラフィックがオリジン サーバーに送信されます。

これは、meta.discourse.org の現在の設定よりもクリーンかもしれないとさえ言えます :shushing_face:

「いいね!」 7

Hi @jaffadog

私は同様のシナリオで、フルサイトと異なるCDNを使用しています。あなたの実験では、ウェブサイトのドメインURLでDISCOURSE_CDN_URLを構成することをテストしましたか?例えば、フルCDNモードでは、ウェブサイトのURLがhttps://foo.bar.comの場合、CDN URLもhttps://foo.bar.comであるべきです。DISCOURSE_CDN_URLを空のままにすると、ウェブサイトのアセットURLは相対パスで始まります。例えば、以下のスニペットのように、

      <link rel="preload" href="/extra-locales/admin?v=8f522e122c802d1ed66dfa7fecafbb35" as="script">
      <script defer src="/extra-locales/admin?v=8f522e122c802d1ed66dfa7fecafbb35"></script>

どちらのURLもhttps://foo.bar.comにリクエストしますが、これは本番のウェブサイトではエレガントに見えません。