ukuran blok permintaan uwsgi tidak valid

142

Saya menjalankan uwsgi dalam mode kaisar

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

dan mendapatkan kesalahan ini

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

Apa yang harus dilakukan?? Saya juga mencoba -b 32.768

Kartik Rokde
sumber
1
Ukuran buffer jelas masih merupakan nilai default (4096), pastikan Anda bekerja pada instance yang benar. Anda juga dapat menulis "-b 32k". Pastikan juga opsi ini (ukuran buffer) belum diatur dalam beberapa file konfigurasi.
zakinster
Tidak ada file konfigurasi. Masih tidak bekerja :(
Kartik Rokde
8
uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html Anda mencoba untuk terhubung ke soket uwsgi menggunakan protokol http, selain itu opsi yang ditentukan untuk kaisar tidak diwariskan, itu hanya manajer proses
roberto
@ zakinster Entah mengapa format nilai dengan ktidak berfungsi untuk saya. Harus memberikan nomor lengkap. Tidak dapat menemukan petunjuk apa pun pada format yang dapat Anda gunakan di sini.
famousgarkin

Jawaban:

207

Saya juga mengalami masalah yang sama saat mengikuti beberapa tutorial. Masalahnya adalah saya mengatur opsi socket = 0.0.0.0:8000alih-alih http = 0.0.0.0:8000. socketopsi yang dimaksudkan untuk digunakan dengan beberapa router pihak ketiga (misalnya nginx), sedangkan ketika httpopsi diatur uwsgi dapat menerima permintaan HTTP yang masuk dan merutekannya dengan sendirinya.

Palasaty
sumber
5
Saya hanya ingin mengomentari ini: uwsgi memiliki opsi "http", "http-socket" dan "socket". Saya ingin memanggil skrip python cgi; "soket" adalah jawabannya.
NuclearPeon
Dalam file konfigurasi Nginx kita mungkin ingin menggunakan ini: include / etc / nginx / uwsgi_params; uwsgi_pass django_upstream;
mennanov
3
Itu bukan solusi yang benar. Bagaimana jika kita ingin melepas soket?
Farsheed
2
@Feedeed, saya baru saja menjelaskan mengapa OP melihat kesalahan ini. Cara memperbaikinya sepenuhnya terserah Anda. Mungkin socket = /tmp/myapp.sockatau http = 0.0.0.0:8000atau apa pun tergantung pada kebutuhan Anda.
Palasaty
1
Walaupun jawaban ini dapat menyelesaikan masalah dalam beberapa situasi, saya pikir jawaban yang benar dalam kasus umum adalah yang diberikan oleh @Feedeed di bawah ini.
Augusto Destrero
142

Solusi yang benar adalah tidak beralih ke protokol HTTP. Anda hanya perlu menambah ukuran buffer di pengaturan uWSGI.

buffer-size=32768

atau dalam mode commandline:

-b 32768

Kutipan dari dokumentasi resmi:

Secara default, uWSGI mengalokasikan buffer yang sangat kecil (4096 byte) untuk header dari setiap permintaan. Jika Anda mulai menerima "ukuran blok permintaan tidak valid" di log Anda, itu bisa berarti Anda membutuhkan buffer yang lebih besar. Tingkatkan (hingga 65535) dengan opsi ukuran buffer.

Jika Anda menerima '21573' sebagai ukuran blok permintaan dalam log Anda, itu bisa berarti Anda menggunakan protokol HTTP untuk berbicara dengan instance yang berbicara dengan protokol uwsgi. Jangan lakukan ini.

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

Farsheed
sumber
1
Terkadang Anda harus menggunakan protokol http, karena soket unix hanya tersedia di mesin lokal. Pertimbangkan situasi ketika Anda memiliki sejumlah mesin dan penyeimbang terpisah di atasnya - Anda harus menggunakannya di http-socketsini.
Palasaty
@Palasaty atau soket IP dan uwsgiprotokol, maka Anda mungkin juga mendapatkan kesalahan yang sama dengan OP
Andrei
2
@Palasaty, dengan alasan apa pun, memperbaiki ukuran buffer akan memperbaiki masalah!
Farsheed
Saat menggunakan nginx sebagai proxy terbalik saya harus menggunakan http-socket. Ada lagi yang memberi "502 Bad Gateway", bahkan ketika ukuran buffer ditingkatkan.
Hubro
Adapun dokumentasi yang dikutip "Jika Anda menerima '21573' sebagai ukuran blok permintaan dalam log Anda, itu bisa berarti Anda menggunakan protokol HTTP untuk berbicara dengan instance berbicara protokol uwsgi. Jangan lakukan ini." Jadi jelas bahwa sarannya salah .... Juga, pengguna @Kartic telah mencoba menggunakan opsi "-b" ...
LittleEaster
14

Saya mengalami masalah yang sama mencoba menjalankannya di bawah nginx dan mengikuti dokumen di sini . Penting untuk dicatat bahwa setelah Anda beralih ke nginx, Anda harus memastikan Anda tidak mencoba mengakses aplikasi pada port yang ditentukan oleh param --socket tetapi lebih ke port "listen" di nginx.conf. Meskipun masalah Anda dijelaskan secara berbeda, judulnya sama persis dengan masalah yang saya miliki.

Paulo SantAnna
sumber
ya saya mengalami hal yang sama. dengan kata lain, saya mendapat kesalahan ketika saya meringkuk port secara lokal, sedangkan saya bisa berhasil menavigasi ke 'lokasi' dari wsgi-reverse-proxy saya sebagaimana ditentukan dalam `nginx.conf 'saya, karena protokol server wsgi di soket yang saya pilih adalah wsgi dan bukan http
danyamachine
14

Saya bisa memperbaikinya dengan menambahkan --protocol = http ke uwsgi

ajamardo
sumber
2
Bagaimana saya bisa mengatur ini di file pengaturan uWSGI ini? Konfigurasi saya berfungsi dengan saran Anda tetapi hanya di baris perintah.
Henry Lynx
2
@HenryLynx, tambahkan saja protocol=httpke .inifile Anda
151291
7

Kesalahan ini ditampilkan ketika server uWSGI menggunakan uwsgiprotokol dan seseorang mencoba mengaksesnya melalui httpprotokol oleh curlatau browser web secara langsung. Jika Anda bisa, coba konfigurasikan server uWSGI Anda untuk menggunakan httpprotokol, sehingga Anda dapat mengaksesnya melalui browser web atau ikal.

Jika Anda tidak dapat (atau tidak ingin) mengubahnya, Anda dapat menggunakan proxy terbalik (mis. nginx) Di depan server uWSGI lokal atau jarak jauh, lihat https://uwsgi-docs.readthedocs.org/en/latest/Nginx .html

Jika terasa terlalu banyak pekerjaan, cobalah uwsgi-toolspaket python:

$ pip install uwsgi-tools

$ uwsgi_curl 10.0.0.1:3030

Ada juga server proxy terbalik sederhana uwsgi_proxyjika Anda perlu mengakses aplikasi Anda melalui browser web dll. Lihat jawaban yang lebih luas https://stackoverflow.com/a/32893520/179581

Andrei
sumber
2

Seperti yang ditunjukkan dalam komentar lain dari dokumen:

Jika Anda menerima '21573' sebagai ukuran blok permintaan dalam log Anda, itu bisa berarti Anda menggunakan protokol HTTP untuk berbicara dengan instance yang berbicara dengan protokol uwsgi. Jangan lakukan ini.

Jika Anda menggunakan Nginx, ini akan terjadi jika Anda memiliki konfigurasi ini (atau sesuatu yang serupa aneh):

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

ini berbicara HTTP ke uWSGI (yang membuatnya galak). Sebaliknya, gunakan:

uwsgi_pass unix:/path/to/socket.sock;
Demitri
sumber
0

man im havin masalah yang sama; jadi saya melakukannya ... lihat menggunakan UWSGI + DJANGO + NGINX + REACT +

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

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

chdir = / home / app_plataform home = / root / app_plataform module = prometheus_plataform.wsgi: application

master = true proses = 33 ukuran buffer = 32768

socket = /home/app_plataform/app_plataform.sock chmod-socket = 777 vacuum = true

2 - melakukan peningkatan kinerja yang serius pada nginx ... pengguna www-data;

pekerja_proses otomatis; proses pekerja_ 4; pid /run/nginx.pid; termasuk /etc/nginx/modules-enabled/*.conf;

events {worker_connections 4092; multi_menerima pada; }

http {## UPGRADE CONFIGS

client_body_buffer_size 16K; client_header_buffer_size 16k; client_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 off;

## # Pengaturan dasar ##

sendfile aktif; tcp_nopush aktif; tcp_nodelay aktif; #keepalive_timeout 65; types_hash_max_size 2048; server_token off;

server_names_hash_bucket_size 64; # server_name_in_redirect mati;

termasuk /etc/nginx/mime.types; default_type application / octet-stream;

## # Pengaturan SSL ##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Menjatuhkan SSLv3, ref: POODLE ssl_prefer_server_ciphers aktif;

## # Pengaturan Logging ##

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

## # Pengaturan Gzip ##

gzip aktif; gzip_comp_level 2; gzip_min_length 1000; gzip_proxied
kedaluwarsa no-cache no-store auth private; gzip_types teks / aplikasi biasa / x-javascript teks / xml teks / aplikasi css / xml; gzip_vary aktif;

#gzip_proxied any; #gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; #gzip_types teks / teks biasa / aplikasi css / aplikasi json / teks javascript / aplikasi xml / aplikasi xml / xml + rss teks / javascript;

## # Konfigurasi Host Virtual ##

termasuk /etc/nginx/conf.d/ .conf ; termasuk / etc / nginx / situs-enabled / ; }

3 - lalu ... mulai ulang layanan atau masukkan kembali server ...

restart sistemctl uwsgi & systemctl restart nginx

Renan Moura
sumber