ขนาดบล็อกคำขอที่ไม่ถูกต้อง uwsgi


142

ฉันกำลังใช้ uwsgi ในโหมดจักรพรรดิ

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

และรับข้อผิดพลาดนี้

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

จะทำอย่างไร ?? ฉันยังลอง -b 32768


1
ขนาดบัฟเฟอร์ยังคงเป็นค่าเริ่มต้นอย่างชัดเจน (4096) ตรวจสอบให้แน่ใจว่าคุณกำลังทำงานกับอินสแตนซ์ที่ถูกต้อง คุณสามารถเขียน "-b 32k" ตรวจสอบให้แน่ใจด้วยว่าตัวเลือกนี้ (ขนาดบัฟเฟอร์) ยังไม่ได้ตั้งค่าในไฟล์กำหนดค่าบางไฟล์
zakinster

ไม่มีไฟล์กำหนดค่า ยังไม่ทำงาน :(
Kartik Rokde

8
uwsgi-docs.readthedocs.org/en/l ล่าสุด/ThingsToKnow.htmlคุณกำลังพยายามเชื่อมต่อกับซ็อกเก็ต uwsgi โดยใช้โปรโตคอล http นอกเหนือจากนี้ตัวเลือกที่ระบุไปยังจักรพรรดิจะไม่ได้รับมรดกมันเป็นเพียงผู้จัดการกระบวนการ
roberto

@zakinster ด้วยเหตุผลบางอย่างรูปแบบของค่าที่ใช้kไม่ได้สำหรับฉัน มีการระบุหมายเลขเต็ม ไม่พบพอยน์เตอร์ใด ๆ ในรูปแบบที่คุณสามารถใช้ได้ที่นี่
famousgarkin

คำตอบ:


207

ฉันยังพบปัญหาเดียวกันในขณะที่ติดตามการกวดวิชา ปัญหาก็คือว่าผมตั้งค่าตัวเลือกแทน socket = 0.0.0.0:8000 ตัวเลือกตั้งใจที่จะใช้กับเราเตอร์ของบุคคลที่สามบางอย่าง (เช่น nginx) ในขณะที่เมื่อมีการตั้งค่าตัวเลือก uwsgi สามารถรับคำขอ HTTP ขาเข้าและเส้นทางพวกเขาด้วยตัวเองhttp = 0.0.0.0:8000sockethttp


5
ฉันต้องการแสดงความคิดเห็นเกี่ยวกับสิ่งนี้: uwsgi มีตัวเลือก "http", "http-socket" และ "socket" ฉันต้องการเรียกสคริปต์ cgi python; "ซ็อกเก็ต" คือคำตอบ
NuclearPeon

ในไฟล์การกำหนดค่า Nginx เราอาจต้องการใช้สิ่งนี้: include / etc / nginx / uwsgi_params; uwsgi_pass django_upstream;
mennanov

3
มันไม่ใช่ทางออกที่ถูกต้อง เกิดอะไรขึ้นถ้าเราต้องการซ็อกเก็ตยูนิกซ์?
Farsheed

2
@Farsheed ฉันเพิ่งอธิบายว่าเหตุใด OP จึงเห็นข้อผิดพลาดนี้ วิธีการแก้ไขนั้นขึ้นอยู่กับคุณอย่างสมบูรณ์ อาจเป็นsocket = /tmp/myapp.sockหรือhttp = 0.0.0.0:8000อะไรก็ได้แล้วแต่ความต้องการของคุณ
Palasaty

1
ในขณะที่คำตอบนี้สามารถแก้ไขปัญหาได้ในบางสถานการณ์ฉันคิดว่าคำตอบที่ถูกต้องในกรณีทั่วไปคือคำตอบที่ @Farsheed ให้ไว้ด้านล่าง
Augusto Destrero

142

โซลูชันที่ถูกต้องไม่ได้เปลี่ยนเป็นโปรโตคอล HTTP คุณเพียงแค่ต้องเพิ่มขนาดบัฟเฟอร์ในการตั้งค่า uWSGI

buffer-size=32768

หรือในโหมด commandline:

-b 32768

อ้างจากเอกสารอย่างเป็นทางการ:

โดยค่าเริ่มต้น uWSGI จัดสรรบัฟเฟอร์ขนาดเล็กมาก (4096 ไบต์) สำหรับส่วนหัวของแต่ละคำขอ หากคุณเริ่มได้รับ“ ขนาดบล็อกคำขอที่ไม่ถูกต้อง” ในบันทึกของคุณอาจหมายถึงคุณต้องมีบัฟเฟอร์ที่ใหญ่กว่า เพิ่ม (สูงสุด 65535) ด้วยตัวเลือกขนาดบัฟเฟอร์

หากคุณได้รับ '21573' เป็นขนาดบล็อกคำขอในบันทึกของคุณอาจหมายถึงว่าคุณกำลังใช้โปรโตคอล HTTP เพื่อพูดกับอินสแตนซ์ที่พูดโปรโตคอล uwsgi อย่าทำอย่างนี้

จากที่นี่: https://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html


1
บางครั้งคุณต้องใช้โปรโตคอล http เนื่องจากซ็อกเก็ตยูนิกซ์มีเฉพาะในเครื่องโลคอลเท่านั้น พิจารณาสถานการณ์เมื่อคุณมีเครื่องจักรจำนวนมากและมีเครื่องถ่วงสมดุลอยู่ด้านบน - คุณต้องใช้http-socketที่นี่
Palasaty

@Palasaty หรือซ็อกเก็ต IP และuwsgiโปรโตคอลจากนั้นคุณอาจได้รับข้อผิดพลาดเช่นเดียวกับ OP
Andrei

2
@Palaty ไม่ว่าด้วยสาเหตุใดการแก้ไขขนาดบัฟเฟอร์จะช่วยแก้ปัญหาได้!
Farsheed

เมื่อใช้ Nginx เป็น proxy http-socketกลับผมใช้ อะไรก็ตามที่ทำให้ "502 Bad Gateway" แม้จะเพิ่มขนาดบัฟเฟอร์
Hubro

สำหรับเอกสารที่ยกมา "ถ้าคุณได้รับ '21573' เป็นขนาดบล็อกคำขอในบันทึกของคุณอาจหมายถึงว่าคุณกำลังใช้โปรโตคอล HTTP เพื่อพูดกับอินสแตนซ์ที่พูดโปรโตคอล uwsgi อย่าทำสิ่งนี้" เห็นได้ชัดว่าข้อเสนอแนะนั้นผิด .... นอกจากนี้ผู้ใช้ @Kartic ได้ลองใช้ตัวเลือก "-b" แล้ว ...
LittleEaster

14

ฉันวิ่งเข้าไปในปัญหาเดียวกันพยายามที่จะใช้ภายใต้ Nginx และได้รับการต่อไปเอกสารที่นี่ เป็นสิ่งสำคัญที่จะต้องทราบว่าเมื่อคุณสลับไปที่ nginx คุณต้องแน่ใจว่าคุณไม่ได้พยายามเข้าถึงแอปบนพอร์ตที่ระบุโดย --socket param แต่แทนที่จะเป็น "ฟัง" พอร์ตใน nginx.conf แม้ว่าปัญหาของคุณจะอธิบายแตกต่างกันชื่อเรื่องตรงกับปัญหาที่ฉันมี


ใช่ฉันวิ่งเข้าไปในสิ่งเดียวกัน กล่าวอีกนัยหนึ่งฉันได้รับข้อผิดพลาดเมื่อฉันขดพอร์ตในเครื่องในขณะที่ฉันสามารถนำทางไปยัง 'ตำแหน่งที่ตั้ง' ของ wsgi reverse-proxy ของฉันตามที่ระบุใน `nginx.conf 'ของฉันเพราะโปรโตคอลของเซิร์ฟเวอร์ wsgi บน ซ็อกเก็ตที่ฉันเลือกคือ wsgi และไม่ใช่ http
danyamachine

14

ฉันสามารถแก้ไขได้เพิ่ม --protocol = http ไปยัง uwsgi


2
ฉันจะตั้งค่านี้ในไฟล์ uWSGI settings ini ได้อย่างไร การกำหนดค่าของฉันทำงานร่วมกับข้อเสนอแนะของคุณ แต่เฉพาะในบรรทัดคำสั่ง
Henry คม

2
@HenryLynx เพียงแค่เพิ่มไฟล์protocol=httpของคุณ.ini
151291

7

ข้อผิดพลาดนี้จะปรากฏขึ้นเมื่อเซิร์ฟเวอร์ uWSGI กำลังใช้uwsgiโปรโตคอลและพยายามเข้าถึงผ่านhttpโปรโตคอลcurlหรือเว็บเบราว์เซอร์โดยตรง หากทำได้ให้ลองกำหนดค่าเซิร์ฟเวอร์ uWSGI ของคุณเพื่อใช้httpโปรโตคอลเพื่อให้คุณสามารถเข้าถึงผ่านเว็บเบราว์เซอร์หรือม้วนงอ

ในกรณีที่คุณไม่สามารถ (หรือไม่ต้องการ) เปลี่ยนคุณสามารถใช้ reverse proxy (เช่นnginx) หน้าเซิร์ฟเวอร์ uWSGI แบบโลคัลหรือรีโมตดูhttps://uwsgi-docs.readthedocs.org/en/latest/Nginx .html

ถ้ามันรู้สึกว่างานมากเกินไปให้ลองทำuwsgi-toolsแพ็คเกจหลาม:

$ pip install uwsgi-tools

$ uwsgi_curl 10.0.0.1:3030

นอกจากนี้ยังมีพร็อกซีเซิร์ฟเวอร์ย้อนกลับแบบง่ายuwsgi_proxyหากคุณต้องการเข้าถึงแอปพลิเคชันของคุณผ่านทางเว็บเบราว์เซอร์ ฯลฯ ดูคำตอบเพิ่มเติมที่ขยายเพิ่มเติมhttps://stackoverflow.com/a/32893520/179581


2

ตามที่ระบุไว้ในความคิดเห็นอื่นจากเอกสาร:

หากคุณได้รับ '21573' เป็นขนาดบล็อกคำขอในบันทึกของคุณอาจหมายถึงว่าคุณกำลังใช้โปรโตคอล HTTP เพื่อพูดกับอินสแตนซ์ที่พูดโปรโตคอล uwsgi อย่าทำอย่างนี้

หากคุณใช้ Nginx สิ่งนี้จะเกิดขึ้นหากคุณมีการกำหนดค่านี้

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

นี่กำลังพูด HTTP กับ uWSGI (ซึ่งทำให้ไม่พอใจ) ให้ใช้:

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

0

ผู้ชายฉัน havin ปัญหาเดียวกัน; ดังนั้นฉันจึงทำ ... ดูใช้ UWSGI + DJANGO + NGINX + ปฏิกิริยา +

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 module = prometheus_plataform.wsgi: แอปพลิเคชัน

master = กระบวนการจริง = 33 buffer-size = 32768

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

2 - ทำการอัปเกรดประสิทธิภาพอย่างจริงจังบน nginx ... ผู้ใช้ www-data;

อัตโนมัติ _processes; worker_processes 4; pid /run/nginx.pid; รวมถึง /etc/nginx/modules-enabled/*.conf;

กิจกรรม {worker_connections 4092; multi_accept on; }

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; ปิดการเข้าถึง;

## # การตั้งค่าพื้นฐาน ##

sendfile บน; tcp_nopush บน; tcp_nodelay บน; #keepalive_timeout 65; types_hash_max_size 2048; server_tokens ปิด;

server_names_hash_bucket_size 64; ปิด # server_name_in_redirect

รวมถึง /etc/nginx/mime.types; default_type application / octet-stream;

## # การตั้งค่า SSL ##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # การวาง SSLv3 อ้างอิง: POODLE ssl_prefer_server_ciphers เปิด;

## # การตั้งค่าการบันทึก ##

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

## # การตั้งค่า Gzip ##

gzip บน gzip_comp_level 2; gzip_min_length 1,000; gzip_proxied
หมดอายุแล้วไม่มีแคชไม่มีการจัดเก็บส่วนตัวรับรองความถูกต้อง; ข้อความ gzip_types / แอปพลิเคชันธรรมดา / ข้อความ x-javascript / ข้อความ xml / แอปพลิเคชัน css / xml; gzip_vary บน;

#gzip_proxied ใด ๆ ; #gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; #gzip_types ข้อความ / ข้อความธรรมดา / แอปพลิเคชัน css / แอปพลิเคชัน json / ข้อความ javascript / แอปพลิเคชัน xml / แอปพลิเคชัน xml / xml + rss text / javascript;

## # โฮสต์ของโฮสต์เสมือน ##

รวม /etc/nginx/conf.d/ .conf; รวม / etc / nginx / sites-enabled / ; }

3 - จากนั้น ... เริ่มบริการหรือรีบูตเซิร์ฟเวอร์ ...

systemctl เริ่มต้นใหม่ & systemctl รีสตาร์ท nginx

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.