Habilitando a codificação de transferência em pedaços nginx

17

Parece que o nginx 0.8.35 pode suportar a codificação de transferência em pedaços :

Alterações no nginx 0.8.35 01 de abril de 2010

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

*) Feature: the "chunked_transfer_encoding" directive.

Isso é ótimo, porque estou tentando obter alterações push git por meio de um proxy reverso nginx para um processo git-http-backend. O Git HTTP aproveita a codificação de transferência em pedaços por motivos de eficiência do lado do cliente .

No entanto, não consigo fazê-lo funcionar. Estou usando o nginx 0.8.44 no Debian Lenny com a seguinte chamada de configuração:

./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

E o seguinte arquivo conf:

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

E minha proxy.confaparência é assim:

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, eu postei esta pergunta no Stack Overflow, mas fui avisado que é mais apropriado para a falha do servidor)

rentzsch
fonte
11
Você não pode ter buffers nem codificação em blocos. Os buffers esperam para enviar dados, os blocos devem enviá-los imediatamente.
Martin Fjordvald
Aparentemente, o Nginx suporta o Chunked desde a versão 1.3.9 (27/11/2012). No entanto, ainda recebo mensagens de erro "411 Comprimento Necessário" quando um smartphone envia solicitações POST em pedaços ao meu servidor Nginx. Algum conselho?
Meir

Respostas:

25

Esta é uma pergunta antiga, eu sei, mas surgiu em uma busca pelo problema (que passei a tarde tentando resolver). O comentário de Martin F me deu uma pista suficiente para fazê-lo funcionar!

O truque é definir proxy_buffering off;no seu bloco de localização. Assumindo que seu servidor upstream esteja enviando respostas em pedaços, isso fará com que o nginx envie os pedaços individuais de volta para o cliente - até mesmo compactando-os em tempo real se a compactação de saída gzip estiver ativada.

Observe que desativar o buffer pode ter outras desvantagens; portanto, não desative cegamente o buffer sem entender o porquê.

John Dalton
fonte
9

Sugiro editar sua pergunta para esclarecer. Há uma grande diferença entre solicitações em pedaços e respostas em pedaços. A resposta de John Dalton aborda o último. Git faz os dois.

Atualmente, o Nginx não oferece suporte a solicitações de POST em partes e esta postagem mostra alto nos resultados de pesquisa sobre o tópico. As solicitações de POST em partes são usadas quando você não conhece a quantidade de dados que está sendo carregada com antecedência e é frequentemente usada por telefones celulares.

A única solução de trabalho que encontrei é esta:

http://wiki.nginx.org/HttpChunkinModule

Infelizmente, é necessário recompilar o nginx, pois o nginx não suporta módulos carregáveis.

Roger Binns
fonte
Concordo: estou descobrindo que o HttpChunkinModule é a única solução teórica ... mas não está aberto para mim na minha situação. Alguém sabe se algo mais pode ser feito? (Quaisquer mudanças desde 30 de janeiro de 2011?)
mdahlman
11
Nenhuma mudança que eu saiba. Acabei de fazer uma recompilação nginx no outro dia para permitir isso.
Roger Binns
2

No meu caso ... eu tento muitas coisas e finalmente só preciso adicionar à configuração

proxy_http_version 1.1;

E funciona ...

Cesar Gallego
fonte
Eu tive que adicionar proxy_set_header Connection "";... resposta original a partir de -> forum.nginx.org/read.php?2,247883,247883#msg-247883
Christian Ulbrich
Isso funcionou para mim também. Mas eu realmente não entendo o porquê.
22619 Jeff Jeff
Atualizar para o meu último comentário .... isso funcionou porque meu servidor upstream estava usando a Chunked Transfer Encoding, que foi introduzida no HTTP 1.1 ( en.wikipedia.org/wiki/Chunked_transfer_encoding ). A versão padrão do protocolo http para proxy nginx é 1.0.
22419 Jeff Jeff
1

Outras respostas costumavam ser válidas, mas esta é uma pergunta antiga.

Parece que as transferências em pedaços são suportadas pelo nginx 1.3.9 [1], que foi lançado em meados de 2013, eu acho.

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

sandstrom
fonte