Ember CLI está molestando a nginx

Así que estoy realizando una instalación no compatible de Docker.

Esto significa ejecutar Ember CLI en su propio contenedor con un volumen compartido en un puerto diferente y proxy, como se esperaba, al servidor Rails.

Desafortunadamente, para todos los activos .css, obtengo “Bad Gateway 502” de curl y del navegador cuando paso completamente a través de https y el proxy inverso nginx.

Parece que Ember CLI está agregando una cabecera Content-Length a pesar de que el servidor Rails ya agregó transfer-encoding: chunked.

(Puedo verificar la respuesta de Rails y Ember accediendo a diferentes puertos)

Esto no rompe oficialmente el estándar del protocolo HTTP 1.1, creo (se supone que debe ser ignorado):

  • “Si se recibe un mensaje con un campo de cabecera Transfer-Encoding y un campo de cabecera Content-Length, este último debe ser ignorado”.

… pero hace que nginx se tambalee y anuncie un 502 y no sirva el activo, por lo que esto es irrelevante.

Puedo navegar por un archivo css con curl directamente al contenedor en localhost, pero a nivel de nginx, NO está contento:

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

¿Alguien tiene alguna idea de cómo detener a Ember CLI haciendo esto o alguna solución alternativa? Me sorprende que esto no sea un problema con la instalación estándar (porque la cadena de comunicación debería ser muy similar).

La versión de Discourse es 2.8.9

Cabecera en el dock (cortes menores para brevedad):


< 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 me gusta

Solo usamos el proxy de Ember CLI en el desarrollo. En una instalación estándar, las solicitudes van del Usuario → NGINX → Rails. Sugeriría seguir ese patrón; no hemos diseñado nuestra configuración de Ember CLI para su uso en producción. Incluso si logras que funcione (lo cual no será fácil), es probable que existan problemas de seguridad y/o rendimiento.

6 Me gusta

Ajá, bueno, esta instalación es actualmente un híbrido de desarrollo/producción, por lo que tiene variables de entorno como:

RAILS_ENV: development

aunque tiene https completo y nginx en el front.

Pero podría cambiar eso en ‘development’ para que las cosas funcionen.

Sí, así que Ember CLI definitivamente no está listo para el horario de máxima audiencia en mi opinión, y me limitaré a usarlo solo para el desarrollo “real”.

¡Gracias por esa información crítica David, me has ahorrado mucho tiempo!

3 Me gusta

OK, esta historia, por cierto, se vuelve más extraña.

Tengo dos instalaciones, ambas configuraciones de ‘desarrollo’, esta y otra que es una configuración de Ubuntu sin Docker.

Noto que las llamadas a /stylesheets/ en el servidor de desarrollo sin Docker no incluyen “Transfer-Ecoding: chunked” en la cabecera del servidor Rails y en su lugar incluyen un valor “Content-Length”… ¿alguien puede explicar cómo podría ser diferente?

Actualización: podría explicarse por https://stackoverflow.com/questions/29112728/when-does-rails-respond-with-transfer-encoding-vs-content-length

1 me gusta

Voy a escribir un pequeño plugin para añadir la cabecera Content-Length a las respuestas de las hojas de estilo, solo para ver si puedo evitar una respuesta Transfer-Encoding: chunked.

¡Si alguien conoce una forma más sencilla de lograrlo, soy todo oídos!

(Para tu información, esto solo se usará en desarrollo y nunca en producción).

1 me gusta

Aquí hay una actualización sobre esto.

He engañado al sistema con éxito. He forzado una cabecera Content-Length anulando el StylesheetsController, lo que evita la respuesta fragmentada, sorteando el mal hábito de Ember CLI y evitando la alergia de nginx a las especificaciones incorrectas.

La forma en que llegué a esta solución fue notando otra configuración de Ember CLI/nginx a través de https, donde Rails optó por no fragmentar las respuestas de Stylesheet (¿alguien sabe por qué podría haber sido así?). Eso me llevó a intentar forzar la cabecera y, ¡sorpresa!, ¡funcionó!

Esto solo es necesario en el entorno de desarrollo, así que no me preocupa demasiado.

2 Me gusta

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