Nginx Yığınlı Aktarım Kodlamasını etkinleştirme


17

Nginx 0.8.35, yığın transfer kodlamasını destekleyebilir gibi görünüyor :

Nginx ile değişiklikler 0.8.35 01 Nis 2010

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

*) Feature: the "chunked_transfer_encoding" directive.

Bu harika, çünkü git-http-arka uç işlemine nginx ters proxy üzerinden push git değişiklikleri almaya çalışıyorum. Git HTTP, istemci tarafı verimlilik nedenleriyle yığın aktarım kodlamasından yararlanır .

Ancak, işe yarayamıyorum. Debian Lenny'de nginx 0.8.44'ü aşağıdaki yapılandırma çağrısıyla kullanıyorum:

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

Ve aşağıdaki conf dosyası:

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

Ve şöyle proxy.confgörünüyor:

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;

(Başlangıçta bu soruyu Stack Overflow'a gönderdim ancak Sunucu Hatası için daha uygun olduğu önerildi )


1
Parçalanmış kodlamanın yanı sıra arabelleğe sahip olamazsınız. Tamponlar veri göndermeyi bekler, yığınlar derhal göndermelidir.
Martin Fjordvald

Görünüşe göre Nginx, 1.3.9 sürümünden (27/11/2012) beri Chunked'i destekliyor. Ancak, bir akıllı telefon Nginx sunucuma yığın POST istekleri gönderdiğinde yine de "411 Uzunluk Gerekli" hata iletileri alıyorum. Herhangi bir tavsiye?
Meir

Yanıtlar:


25

Bu eski bir soru, biliyorum, ama sorun için bir arama geldi (ki öğleden sonra çözmeye çalışarak geçirdim). Martin F'nin yorumu bana çalışmasını sağlayacak kadar ipucu verdi!

Hile, proxy_buffering off;konum bloğunuzda ayarlamaktır . Akış yukarı sunucunuzun yığınlanmış yanıtlar geri gönderdiğini varsayarsak, bu nginx'in ayrı ayrı parçaları istemciye geri göndermesine neden olur - hatta gzip çıktı sıkıştırması açıksa bunları anında gzipleme.

Tamponlamayı kapatmanın başka dezavantajları olabileceğini unutmayın, bu yüzden nedenini anlamadan arabelleği kör olarak kapatmayın.


9

Açıklığa kavuşturmak için sorunuzu düzenlemenizi öneririz. Parçalanmış istekler ile toplanan yanıtlar arasında büyük bir fark vardır. John Dalton'un cevabı ikincisine hitap ediyor. Git her ikisini de yapar.

Nginx şu anda yığınlanmış POST isteklerini desteklememektedir ve bu yayın konuyla ilgili arama sonuçlarında üst sıralarda yer almaktadır. Yığınlanmış POST istekleri, önceden yüklenen veri miktarını bilmediğinizde kullanılır ve cep telefonları tarafından sıkça kullanılır.

Bulduğum tek çalışma çözümü şudur:

http://wiki.nginx.org/HttpChunkinModule

Ne yazık ki nginx yüklenebilir modülleri desteklemediğinden, nginx'in yeniden derlenmesini gerektirir.


Kabul ediyorum: HttpChunkinModule'un tek teorik çözüm olduğunu görüyorum ... ama durumumda bana açık değil. Başka bir şey yapıp yapamayacağını bilen var mı? (30 Ocak 2011'den beri herhangi bir değişiklik var mı?)
mdahlman

1
Bildiğim değişiklik yok. Bunu etkinleştirmek için geçen gün bir nginx derlemesi yaptım.
Roger Binns

2

Benim durumumda ... bir çok şey deniyorum ve son olarak sadece konfigürasyona eklemeliyim

proxy_http_version 1.1;

Ve çalışıyor...


Eklemek zorunda kaldım proxy_set_header Connection "";... -> forum.nginx.org/read.php?2,247883,247883#msg-247883
Christian Ulbrich

Bu benim için de işe yaradı. Ama nedenini gerçekten anlamıyorum.
Jeff

Son yorumumu güncelleyin .... Bu, yukarı akış sunucum HTTP 1.1'de ( en.wikipedia.org/wiki/Chunked_transfer_encoding ) tanıtılan Chunked Transfer Encoding kullandığından işe yaradı . Nginx proxy için varsayılan http protokolü sürümü 1.0'dır.
Jeff

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.