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)


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


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.


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.