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/latest/ThingsToKnow.html您正在尝试使用http协议连接到uwsgi套接字,此外,不继承指定给皇帝的选项,它只是一个进程管理器
roberto

@zakinster由于某种原因,值格式k对我不起作用。必须提供完整的号码。在此处可以使用的格式上找不到任何指针。
2015年

Answers:


207

在阅读一些教程时,我也遇到了同样的问题。问题是我设置了选项socket = 0.0.0.0:8000而不是http = 0.0.0.0:8000socket该选项旨在与某些第三方路由器(例如nginx)一起使用,而http设置了该选项时,uwsgi可以接受传入的HTTP请求并自行路由。


5
我只想对此发表评论:uwsgi具有“ http”,“ http-socket”和“ socket”选项。我想调用cgi python脚本;答案是“ socket”。
NuclearPeon 2014年

在Nginx配置文件中,我们可能要使用此文件:include / etc / nginx / uwsgi_params; uwsgi_pass django_upstream;
mennanov

3
这不是正确的解决方案。如果要unix套接字怎么办?
Farsheed

2
@Farsheed,我刚刚描述了OP为什么看到此错误。如何解决它完全取决于您。可能是socket = /tmp/myapp.sockhttp = 0.0.0.0:8000或其他取决于您的需求。
2015年

1
虽然此答案可以在某些情况下解决问题,但我认为一般情况下正确的答案是下面@Farsheed提供的答案。
奥古斯托·德斯特罗

142

正确的解决方案是不要切换到HTTP协议。您只需要在uWSGI设置中增加缓冲区大小即可。

buffer-size=32768

或在命令行模式下:

-b 32768

引用官方文档:

默认情况下,uWSGI为每个请求的标头分配一个很小的缓冲区(4096字节)。如果您开始在日志中收到“无效的请求块大小”,则可能意味着您需要更大的缓冲区。使用buffer-size选项将其增加(最多65535)。

如果您在日志中收到“ 21573”作为请求块大小,则可能意味着您正在使用HTTP协议与使用uwsgi协议的实例进行通信。不要这样

从这里: https //uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html


1
有时您必须使用http协议,因为unix套接字仅在本地计算机上可用。考虑一下当您有一台机器并在其上有一个单独的平衡器时的情况-您必须在http-socket这里使用。
Palasaty 2015年

@Palasaty或IP套接字和uwsgi协议,那么您可能还会收到与OP相同的错误
Andrei

2
@Palasaty,无论出于任何原因,修复缓冲区大小都可以解决问题!
Farsheed

当使用nginx作为反向代理时,我不得不使用http-socket。即使缓冲区大小增加,其他所有内容都将显示“ 502 Bad Gateway”。
哈博

至于引用的文档“如果您在日志中收到'21573'作为请求块大小,则可能意味着您正在使用HTTP协议与使用uwsgi协议的实例进行通信。请不要这样做。” 显然,该建议是错误的。...此外,@ Kartic用户已经尝试使用“ -b”选项...
LittleEaster19年

14

我在尝试在nginx下运行它时遇到了同样的问题,并在这里关注文档。重要的是要注意,一旦切换到nginx,就必须确保没有尝试通过--socket参数指定的端口访问应用程序,而是尝试访问nginx.conf中的“监听”端口。尽管您对问题的描述有所不同,但标题与我遇到的问题完全匹配。


是的,我遇到了同样的事情。换句话说,当我在本地卷曲端口时出现错误,而我可以成功导航到“ nginx.conf”中指定的wsgi反向代理的“位置”,因为wsgi服务器的协议位于我选择的套接字是wsgi,而不是http
danyamachine 2014年

14

我可以修复--utogi添加--protocol = http


2
如何在uWSGI设置ini文件中进行设置?我的配置符合您的建议,但只能在命令行中使用。
亨利·林克斯

2
@HenryLynx,只需将添加protocol=http到您的.ini文件中
151291

7

当uWSGI服务器使用uwsgi协议并且尝试通过http协议curl或Web浏览器直接通过协议访问它时,将显示此错误。如果可以,请尝试配置您的uWSGI服务器以使用http协议,以便可以通过Web浏览器或curl访问它。

如果您无法(或不想)更改它,可以nginx在本地或远程uWSGI服务器之前使用反向代理(例如),请参见 https://uwsgi-docs.readthedocs.org/en/latest/Nginx .html

如果感觉工作太多,请尝试使用uwsgi-toolspython包:

$ pip install uwsgi-tools

$ uwsgi_curl 10.0.0.1:3030

uwsgi_proxy如果您需要通过Web浏览器等访问您的应用程序,则还有一个简单的反向代理服务器。请查看更多扩展的答案https://stackoverflow.com/a/32893520/179581


2

正如文档中的另一条评论所指出的:

如果您在日志中收到“ 21573”作为请求块大小,则可能意味着您正在使用HTTP协议与使用uwsgi协议的实例进行通信。不要这样

如果您使用的是Nginx,如果您具有以下配置(或类似的奇怪内容),则会发生这种情况:

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

这是与uWSGI对话的HTTP(这使它变得脾气暴躁)。而是使用:

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

0

我也有同样的问题;所以我做到了...使用UWSGI + DJANGO + NGINX + REACT +

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模块= prometheus_plataform.wsgi:应用程序

主=真实进程= 33缓冲区大小= 32768

套接字= /home/app_plataform/app_plataform.sock chmod-socket = 777真空= true

2-对Nginx ...用户www-data进行严重的性能升级;

worker_processes自动;worker_processes 4; pid /run/nginx.pid; 包括/etc/nginx/modules-enabled/*.conf;

事件{worker_connections 4092; multi_accept on; }

http {##升级配置

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关闭;

## # 基本设置 ##

发送文件; tcp_nopush on; 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应用程序/八位字节流;

###SSL设置##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #删除SSLv3,参考:POODLE ssl_prefer_server_ciphers on;

###记录设置##

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

###Gzip设置##

gzip on; gzip_comp_level 2; gzip_min_length 1000; gzip_proxied
过期的无缓存无存储私有身份验证;gzip_types文本/普通应用程序/ x-javascript文本/ xml文本/ css应用程序/ xml; gzip_vary on;

#gzip_proxied任何;#gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; #gzip_types text / plain text / css application / json application / javascript text / xml application / xml application / xml + rss text / javascript;

###虚拟主机配置##

包括/etc/nginx/conf.d/ .conf; 包括/ etc / nginx / sites-enabled / ; }

3-然后...重新启动服务或reebot服务器...

systemctl重新启动uwsgi和systemctl重新启动nginx

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.