Habilitación de la codificación de transferencia fragmentada nginx

17

Parece que nginx 0.8.35 puede admitir la codificación de transferencia fragmentada :

Cambios con nginx 0.8.35 01 abr 2010

*) Change: now the charset filter runs before the SSI filter.

*) Feature: the "chunked_transfer_encoding" directive.

Esto es genial, porque estoy tratando de obtener cambios push git a través de un proxy inverso nginx a un proceso git-http-backend. Git HTTP aprovecha la codificación de transferencia fragmentada por razones de eficiencia del lado del cliente .

Sin embargo, no puedo hacer que funcione. Estoy usando nginx 0.8.44 en Debian Lenny con la siguiente invocación de configuración:

./configure \
--sbin-path=/usr/sbin \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--user=www-data \
--group=www-data \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module

Y el siguiente archivo conf:

server {
    server_name example.com;
    location / {
        proxy_pass  http://192.168.0.10;
        include     /etc/nginx/proxy.conf;
        chunked_transfer_encoding on;
    }
}

Y mi proxy.confaspecto es el siguiente:

proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    100M;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size       4k;
proxy_buffers           4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

(Originalmente publiqué esta pregunta en Stack Overflow pero se me informó que es más apropiada para la falla del servidor)

rentzsch
fuente
1
No puede tener buffers, así como codificación fragmentada. Los buffers esperan para enviar datos, los fragmentos deben enviarlos de inmediato.
Martin Fjordvald
Aparentemente, Nginx admite Chunked desde la versión 1.3.9 (27/11/2012). Sin embargo, sigo recibiendo mensajes de error de "longitud requerida 411" cuando un teléfono inteligente envía solicitudes POST fragmentadas a mi servidor Nginx. ¿Algún consejo?
Meir

Respuestas:

25

Esta es una vieja pregunta, lo sé, pero surgió en una búsqueda del problema (que pasé la tarde tratando de resolver). ¡El comentario de Martin F me dio una pista suficiente para que funcione!

El truco es establecer proxy_buffering off;en su bloque de ubicación. Suponiendo que su servidor ascendente está enviando respuestas fragmentadas, esto hará que nginx envíe los fragmentos individuales de vuelta al cliente, incluso comprimiéndolos sobre la marcha si tiene activada la compresión de salida gzip.

Tenga en cuenta que desactivar el almacenamiento en búfer puede tener otras desventajas, por lo tanto, no lo desactive ciegamente sin comprender por qué.

John Dalton
fuente
9

Sugiero editar su pregunta para aclarar. Hay una gran diferencia entre las solicitudes fragmentadas y las respuestas fragmentadas. La respuesta de John Dalton se dirige a este último. Git hace las dos cosas.

Actualmente, Nginx no admite solicitudes POST fragmentadas y esta publicación aparece alta en los resultados de búsqueda sobre el tema. Las solicitudes POST fragmentadas se utilizan cuando no conoce la cantidad de datos que se cargan por adelantado y los teléfonos móviles la utilizan con frecuencia.

La única solución de trabajo que encontré es esta:

http://wiki.nginx.org/HttpChunkinModule

Desafortunadamente, requiere volver a compilar nginx ya que nginx no admite módulos cargables.

Roger Binns
fuente
Estoy de acuerdo: descubro que HttpChunkinModule es la única solución teórica ... pero no está abierto para mí en mi situación. ¿Alguien sabe si se puede hacer algo más? (¿Algún cambio desde el 30 de enero de 2011?)
mdahlman
1
No hay cambios que yo sepa. Acabo de hacer una recompilación de nginx el otro día para habilitar esto.
Roger Binns
2

En mi caso ... pruebo muchas cosas y finalmente solo necesito agregar a la configuración

proxy_http_version 1.1;

Y funciona...

Cesar Gallego
fuente
Tuve que agregar proxy_set_header Connection "";... respuesta original de -> forum.nginx.org/read.php?2,247883,247883#msg-247883
Christian Ulbrich
Esto funcionó para mí también. Pero realmente no entiendo por qué.
Jeff
Actualice mi último comentario ... esto funcionó porque mi servidor ascendente estaba usando Chunked Transfer Encoding, que se introdujo en HTTP 1.1 ( en.wikipedia.org/wiki/Chunked_transfer_encoding ). La versión predeterminada del protocolo http para el proxy nginx es 1.0.
Jeff
1

Otras respuestas solían ser válidas, pero esta es una vieja pregunta.

Parece que Chunked Transfers son compatibles con nginx 1.3.9 [1], que fue lanzado a mediados de 2013, creo.

[1] http://wiki.nginx.org/HttpChunkinModule

Sandstrom
fuente