uwsgi geçersiz istek bloğu boyutu


142

İmparator modunda uwsgi kullanıyorum

uwsgi --emperor /path/to/vassals/ --buffer-size=32768

ve bu hatayı alıyorum

invalid request block size: 21327 (max 4096)...skip

Ne yapalım?? Ben de denedim -b 32768


1
Arabellek boyutu hala varsayılan değerdir (4096), doğru örnek üzerinde çalıştığınızdan emin olun. Ayrıca "-b 32k" yazabilirsiniz. Ayrıca bu seçeneğin (arabellek boyutu) bazı yapılandırma dosyalarında önceden ayarlanmadığından emin olun.
zakinster

Hiçbir yapılandırma dosyası yok. Hala çalışmıyor :(
Kartik Rokde

8
uwsgi-docs.readthedocs.org/tr/latest/ThingsToKnow.html http protokolünü kullanarak bir uwsgi soketine bağlanmaya çalışıyorsunuz, buna ek olarak imparator için belirtilen seçenekler devralınmıyor, sadece bir süreç yöneticisidir
roberto

@zakinster Herhangi bir nedenden dolayı değer formatı kbenim için çalışmadı. Tam sayı sağlamak zorunda kaldı. Burada kullanabileceğiniz biçimlerde hiçbir işaretçi bulamıyorum.
famousgarkin

Yanıtlar:


207

Ayrıca bazı öğretici izlerken aynı sorunla karşılaştı. Sorun ben socket = 0.0.0.0:8000yerine seçeneği ayarlamak oldu http = 0.0.0.0:8000. socketseçenek bazı üçüncü taraf yönlendiricilerle (örneğin nginx) kullanılmak üzere tasarlanırken, httpseçenek ayarlandığında uwsgi gelen HTTP isteklerini kabul edebilir ve bunları kendi kendine yönlendirebilir.


5
Ben sadece bu konuda yorum yapmak istiyorum: uwsgi "http", "http-soket" ve "soket" seçenekleri vardır. Cgi python betiklerini çağırmak istedim; Cevap "soket" idi.
NuclearPeon

Nginx yapılandırma dosyasında şunu kullanmak isteyebiliriz: include / etc / nginx / uwsgi_params; uwsgi_pass django_upstream;
mennanov

3
Doğru çözüm değil. Soketleri çözmek isterseniz ne olur?
Farsheed

2
@Farsheed, OP'nin bu hatayı neden gördüğünü açıkladım. Nasıl düzeltebileceğiniz tamamen size kalmış. Gereksinimlerinize bağlı olarak socket = /tmp/myapp.sockya http = 0.0.0.0:8000da her neyse olabilir.
Palasaty

1
Bu cevap bazı durumlarda sorunu çözse de, genel durumda doğru cevabın aşağıda @ Fararsheed tarafından verilen cevap olduğunu düşünüyorum.
Augusto Destrero

142

Doğru çözüm HTTP protokolüne geçmek değildir. Sadece uWSGI ayarlarında arabellek boyutunu artırmanız gerekir.

buffer-size=32768

veya komut satırı modunda:

-b 32768

Resmi belgelerden alıntı:

Varsayılan olarak uWSGI, her isteğin üstbilgileri için çok küçük bir arabellek (4096 bayt) ayırır. Günlüklerinizde "geçersiz istek bloğu boyutu" almaya başlarsanız, daha büyük bir ara belleğe ihtiyacınız olduğu anlamına gelebilir. Arabellek boyutu seçeneğiyle (65535'e kadar) artırın.

Günlüklerinizde istek bloğu boyutu olarak '21573' alırsanız, uwsgi protokolünü konuşan bir örnekle konuşmak için HTTP protokolünü kullandığınız anlamına gelebilir. Bunu yapma.

Buradan: https://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html


1
Bazen http protokolünü kullanmanız gerekir , çünkü unix soketleri yalnızca yerel makinede kullanılabilir. Çok sayıda makineniz ve bunların üstünde ayrı bir dengeleyicinizin olduğu bir durumu düşünün - http-socketburada kullanmanız gerekir .
Palasaty

@Palasaty veya bir IP soketi ve uwsgiprotokolü, o zaman OP ile aynı hatayı alabilirsiniz
Andrei

2
@Palasaty, herhangi bir nedenle, tampon boyutunun sabitlenmesi sorunu çözecektir!
Farsheed

Nginx'i ters proxy olarak kullanırken kullanmak zorunda kaldım http-socket. Arabellek boyutu artırılsa bile, herhangi bir şey "502 Bozuk Ağ Geçidi" verdi.
Hubro

Alıntılanan belgelere gelince, "Günlüklerinizde istek bloğu boyutu olarak '21573" alırsanız, uwsgi protokolünü konuşan bir örnekle konuşmak için HTTP protokolünü kullandığınız anlamına gelebilir. Bunu yapma. " Bu yüzden öneri yanlış olduğu açıktır .... Ayrıca, @Kartic kullanıcı zaten "-b" seçeneğini kullanmaya çalıştı ...
LittleEaster

14

Aynı sorunu nginx altında çalıştırmaya çalıştım ve burada belgeleri takip ediyordum . Nginx'e geçtikten sonra --socket parametresi tarafından belirtilen bağlantı noktasındaki uygulamaya değil, nginx.conf içindeki "listen" bağlantı noktasına erişmeye çalıştığınızdan emin olmanız gerektiğine dikkat etmek önemlidir. Sorununuz farklı açıklanmasına rağmen, başlık tam olarak yaşadığım sorunla eşleşiyor.


evet aynı şeyle karşılaştım. Diğer bir deyişle, bağlantı noktasını yerel olarak kıvrıldığımda bir hata aldım, oysa başarılı bir şekilde wsgi sunucumun protokolü 'nginx.conf' da belirtildiği gibi wsgi reverse-proxy'nin 'konumuna' gidebilirim, çünkü wsgi sunucusunun protokolü benim seçilen soket wsgi ve http değil
danyamachine

14

Uwsgi --protocol = http ekleyerek düzeltebilirim


2
Bunu uWSGI ayarları ini dosyasında nasıl ayarlayabilirim? Yapılandırmam önerinizle çalışıyor ancak yalnızca komut satırında çalışıyor.
Henry Lynx

2
@HenryLynx, sadece eklemek protocol=httpiçin için .inidosyanın
151291

7

Bu hata, uWSGI sunucusu uwsgiprotokolü kullandığında ve buna httpprotokol yoluyla curlveya web tarayıcısıyla doğrudan erişmeye çalıştığında gösterilir . Yapabiliyorsanız, uWSGI sunucunuzu httpprotokol kullanacak şekilde yapılandırmayı deneyin , böylece web tarayıcısı veya kıvrılma yoluyla erişebilirsiniz.

Değiştiremezseniz (veya değiştirmek istemiyorsanız) nginx, yerel veya uzak uWSGI sunucusunun önünde ters proxy (örn. ) Kullanabilirsiniz, bkz. Https://uwsgi-docs.readthedocs.org/tr/latest/Nginx .html

Çok fazla iş gibi geliyorsa, uwsgi-toolspython paketini deneyin :

$ pip install uwsgi-tools

$ uwsgi_curl 10.0.0.1:3030

uwsgi_proxyUygulamalarınıza web tarayıcısı vb. Yoluyla erişmeniz gerekiyorsa basit bir ters proxy sunucusu da vardır . Daha genişletilmiş cevaba bakın https://stackoverflow.com/a/32893520/179581


2

Dokümanlardaki başka bir yorumda belirtildiği gibi:

Günlüklerinizde istek bloğu boyutu olarak '21573' alırsanız, uwsgi protokolünü konuşan bir örnekle konuşmak için HTTP protokolünü kullandığınız anlamına gelebilir. Bunu yapma.

Nginx kullanıyorsanız, bu yapılandırmaya (veya benzer şekilde garip bir şeye) sahipseniz bu gerçekleşir:

proxy_pass http://unix:/path/to/socket.sock

bu HTTP ile uWSGI (huysuz yapan) konuşuyor. Bunun yerine şunu kullanın:

uwsgi_pass unix:/path/to/socket.sock;

0

aynı sorunu yaşayan adamım; bu yüzden yaptım ... UWSGI + DJANGO + NGINX + REACT + kullanarak bak

1 - nano /etc/uwsgi/sites/app_plataform.ini [uwsgi]

DJANGO_SETTINGS_MODULE = app_plataform.settings env = DJANGO_SETTINGS_MODULE settings.configure ()

chdir = / home / app_plataform home = / root / app_plataform modül = prometheus_plataform.wsgi: uygulama

master = gerçek işlemler = 33 tampon boyutu = 32768

soket = /home/app_plataform/app_plataform.sock chmod-soket = 777 vakum = doğru

2 - nginx'te ciddi bir performans yükseltmesi yapın ... kullanıcı www-verileri;

worker_processes otomatik; işçi_işlemleri 4; pid /run/nginx.pid; /etc/nginx/modules-enabled/*.conf;

olaylar {worker_connections 4092; multi_accept on; }

http {## YÜKSELTME YAPILANDIRMALARI

client_body_buffer_size 16K; client_header_buffer_size 16k; müşteri_max_body_size 32m; #large_client_header_buffers 2 1k;

client_body_timeout 12; client_header_timeout 12; keepalive_timeout 15; send_timeout 10; access_log kapalı;

## # Temel Ayarlar ##

sendfile; tcp_nopush; tcp_nodelay açık; #keepalive_timeout 65; type_hash_max_size 2048; server_tokens kapalı;

server_names_hash_bucket_size 64; # server_name_in_redirect kapalı;

/etc/nginx/mime.types; default_type uygulama / octet-stream;

## # SSL Ayarları ##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # SSLv3 bırakılıyor, ref: POODLE ssl_prefer_server_ciphers;

## # Günlük Ayarları ##

access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;

## # Gzip Ayarları ##

gzip; gzip_comp_level 2; gzip_min_length 1000; gzip_proxied
süresi dolmuş önbellek yok mağaza yok özel yetkilendirme; gzip_types metin / düz uygulama / x-javascript metin / xml metin / css uygulama / xml; gzip_vary;

#gzip_proxied herhangi biri; #gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; #gzip_types metin / düz metin / css uygulaması / json uygulaması / javascript metni / xml uygulaması / xml uygulaması / xml + rss metni / javascript;

## # Sanal Ana Bilgisayar Yapılandırmaları ##

/etc/nginx/conf.d/ .conf; / etc / nginx / sites-etkin / ; }

3 - o zaman ... hizmetleri yeniden başlatın veya sunucuyu yeniden başlatın ...

systemctl yeniden başlatma uwsgi & systemctl yeniden başlatma nginx

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.