Ember CLI está chateando o nginx

Estou a tentar uma instalação Docker não suportada.

Isto significa executar o Ember CLI no seu próprio contentor com um volume partilhado numa porta diferente e fazer proxy, como esperado, para o servidor Rails.

Infelizmente, para todos os ativos .css, estou a receber “Bad Gateway 502” do curl e do navegador quando passo totalmente por https e pelo proxy reverso nginx.

Parece que o Ember CLI está a adicionar um cabeçalho Content-Length, apesar de já ter transfer-encoding: chunked adicionado pelo servidor Rails.

(Posso verificar a resposta do Rails e do Ember acedendo a portas diferentes)

Isto não quebra oficialmente o padrão do protocolo HTTP 1.1, creio eu (deve ser ignorado):

  • “Se uma mensagem for recebida com um campo de cabeçalho Transfer-Encoding e um campo de cabeçalho Content-Length, este último deve ser ignorado.”

… mas faz com que o nginx hesite e anuncie um 502 e não sirva o ativo, pelo que isto é irrelevante.

Posso navegar num ficheiro css com curl diretamente para o contentor em localhost, mas ao nível do nginx, ele NÃO está feliz:

upstream sent "Content-Length" and "Transfer-Encoding" headers at the same time while reading response header from upstream

Alguém tem alguma ideia de como impedir o Ember CLI de fazer isto ou uma solução alternativa? Surpreende-me que isto não seja um problema com a instalação padrão? (porque a cadeia de comunicação deve ser muito semelhante).

A versão do Discourse é 2.8.9

Cabeçalho no contentor (pequenos cortes para brevidade):

< content-transfer-encoding: binary
< content-type: text/css; charset=utf-8
< referrer-policy: strict-origin-when-cross-origin
< set-cookie: __profilin=p%3Dt; path=/forum; HttpOnly; SameSite=Lax
< **transfer-encoding: chunked**
< Vary: Accept, Accept-Encoding
< x-content-type-options: nosniff
< x-discourse-route: stylesheets/show
< x-download-options: noopen
< x-frame-options: SAMEORIGIN
< x-permitted-cross-domain-policies: none
< x-xss-protection: 0
< content-encoding: null
< **Content-Length: 3055**
1 curtida

Usamos o proxy do Ember CLI apenas em desenvolvimento. Em uma instalação padrão, as requisições vão do Usuário → NGINX → Rails. Eu sugiro manter esse padrão - nós não projetamos nossa configuração do Ember CLI para uso em produção. Mesmo que você consiga fazer funcionar (o que não será fácil), provavelmente haverá preocupações de segurança e/ou desempenho.

6 curtidas

Aha, bem, esta instalação é atualmente um híbrido de desenvolvimento/produção, então ela tem variáveis de ambiente como:

RAILS_ENV: development

mesmo que tenha https completo e nginx na frente.

Mas posso mudar isso em ‘development’ para que as coisas funcionem.

Sim, então o Ember CLI definitivamente não está pronto para o horário nobre, na minha opinião, e vou me ater a ele apenas para o desenvolvimento “verdadeiro”.

Obrigado por essa informação crucial, David, isso me poupou muito tempo!

3 curtidas

OK, esta história, aliás, fica mais estranha.

Tenho duas instalações, ambas configurações de ‘desenvolvimento’, esta e outra que é uma configuração não-docker do Ubuntu.

Percebo que as chamadas para /stylesheets/ no servidor de desenvolvimento não-docker não incluem “Transfer-Encoding: chunked” no cabeçalho do servidor Rails e, em vez disso, incluem um valor “Content-Length”… alguém pode explicar como isso pode ser diferente?

Atualização: pode ser explicado por https://stackoverflow.com/questions/29112728/when-does-rails-respond-with-transfer-encoding-vs-content-length

1 curtida

Então, vou escrever um pequeno plugin para adicionar o cabeçalho Content-Length às respostas de folha de estilo, apenas para ver se consigo evitar uma resposta Transfer-Encoding: chunked.

Se alguém souber de uma maneira mais simples de conseguir isso, estou à disposição!

(Para sua informação, isso será usado apenas em Desenvolvimento e nunca em Produção).

1 curtida

Então, uma atualização sobre isso.

Consegui enganar o sistema. Forcei um cabeçalho Content-Length substituindo o StylesheetsController, o que impede a resposta em blocos (chunked response), contornando o mau hábito do Ember CLI e evitando a alergia do nginx a especificações não conformes.

Como cheguei a essa solução foi notando outra configuração Ember CLI/nginx sobre https, onde o Rails optou por não enviar respostas de Stylesheet em blocos (alguém sabe por que isso pode ter acontecido?). Isso me levou a tentar forçar o cabeçalho e, adivinhem, funcionou!

Isso só é necessário em desenvolvimento, então não estou muito preocupado.

2 curtidas

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.