CDN de Site Completo Usando AWS CloudFront

Olá a todos. Recentemente, configurei minha instalação do Discourse usando o AWS CloudFront (CF) para aceleração total do site - e offloading de SSL usando certificados AWS no CF. Observe que esta instalação se desvia do guia oficial em relação à configuração de CDN e SSL - portanto, isso pode ser controverso e levar a problemas futuros de suporte. Então, esteja avisado… há dragões aqui. Estou compartilhando a configuração que funcionou para mim aqui:

  1. Configure o Discourse para escutar apenas na porta 80 e desabilite o Let’s Encrypt comentando as linhas indicadas em app.yml:

  2. Configure o Discourse para prestar atenção ao cabeçalho do CF, cloudfront-forwarded-proto, em vez de x-forwarded-proto (que o CF não passa - e estranhamente não pode ser configurado para passar para a origem… que chato! :angry:)

  3. Configure sua distribuição do CF com um cname para o nome de host público pretendido (por exemplo, forum.example.com) usando um certificado AWS ACM (que você gerou).

  4. Configure a origem do CF usando o IP elástico público do servidor EC2 que hospeda o Discourse (por exemplo, ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com). Configure-o apenas para http (ou seja, apenas porta 80 - sem 443). você não precisa configurar sua origem com um nome de host sofisticado no DNS como forum-origin.example.com. O nome de host ou IP do EC2 funciona bem.

  5. Configure os “comportamentos” do CF para os diferentes caminhos de solicitação. A chave aqui é configurar o comportamento de cache para coisas que são obviamente recursos estáticos; e configurar a não-cache para todo o resto (ou seja, essas solicitações são simplesmente passadas como estão para a origem sem cache). Outra coisa importante aqui é que a última regra de passagem (“padrão”) está usando uma “política de solicitação de origem” personalizada que passa todos os cabeçalhos originais para a origem, além do cabeçalho cloudfront-forwarded-proto do CF. Configure também redirecionamentos de http para https em seus comportamentos - para que todas as solicitações do usuário final sejam forçadas a ser https pelo CF.

  6. Não configure DISCOURSE_CDN_URL

  7. Habilite force https

  8. Não configure long polling base url - deixe em branco. Apesar de todos os avisos sombrios sobre isso ser problemático ao passar por um proxy, está funcionando bem para mim até agora. Talvez o keep alive padrão do CF seja longo o suficiente para evitar que ele perca a conexão.

Acho que é isso… :thinking:

O resultado final é que todas as solicitações, http/documentos, todos os recursos estáticos de suporte, todas as chamadas ajax, etc., são atendidas no mesmo nome de domínio (por exemplo, forum.example.com). O comportamento de cache (e comportamento de passagem) é ditado por seus “comportamentos” configurados no CF. E todas as conexões são criptografadas usando certificados AWS ACM terminados na borda do CF - e, em seguida, o tráfego não criptografado/http é enviado de volta para o servidor de origem.

Ouso dizer que isso pode ser mais limpo do que o que meta.discourse.org está fazendo no momento :shushing_face:.

7 curtidas

Olá @jaffadog

Estou em um cenário semelhante, mas em site completo com um CDN diferente. Em seu experimento, você já testou a configuração DISCOURSE_CDN_URL com a URL do domínio do site. Por exemplo, no modo CDN completo, se a URL do seu site for https://foo.bar.com; então a URL do CDN deve ser https://foo.bar.com também. Se deixarmos DISCOURSE_CDN_URL vazio, a URL dos ativos do site começará com um caminho relativo. Por exemplo, como no trecho abaixo,

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

Isso simplesmente não parece elegante em um site de produção, embora ambas as URLs façam requisições para https://foo.bar.com.