uWSGI无效的请求块大小

184

我正在以 emperor 模式运行 uwsgi

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

并且收到以下错误信息

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

怎么办?我也尝试了 -b 32768


3
缓冲区大小显然仍然是默认值(4096),确保你正在操作正确的实例。您也可以写“-b 32k”。还要确保此选项(buffer-size)没有在某些配置文件中设置。 - zakinster
没有配置文件。仍然无法工作 :( - Kartik Rokde
9
您正在尝试使用HTTP协议连接到uwsgi套接字,并且除此之外,向皇帝指定的选项不会被继承,它仅是一个进程管理器。请见https://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html。 - roberto
@zakinster 由于某种原因,使用“k”格式的值对我不起作用。必须提供完整数字。找不到可以在此处使用的格式的任何指针。 - famousgarkin
9个回答

265

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


6
我想对此发表评论:uwsgi有“http”、“http-socket”和“socket”选项。我想调用cgi python脚本,而“socket”是答案。 - NuclearPeon
在Nginx配置文件中,我们可能想要使用以下内容:include /etc/nginx/uwsgi_params; uwsgi_pass django_upstream; - mennanov
4
不是正确的解决方案。如果我们想要使用UNIX套接字呢? - Farshid Ashouri
3
@Farsheed,我刚刚解释了为什么OP看到这个错误。如何修复完全取决于你。根据你的需求,可能是socket = /tmp/myapp.sock或者http = 0.0.0.0:8000,或者其他内容。 - Palasaty
1
虽然这个答案可以解决一些情况下的问题,但我认为在一般情况下正确的答案是下面由@Farsheed提供的那一个。 - Augusto Destrero

201

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

buffer-size=32768
或者在命令行模式下:
-b 32768

官方文档中的引用:

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

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

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


2
有时候你必须使用http协议,因为Unix套接字仅在本地机器上可用。考虑这样一种情况:当你有多台机器和一个独立的负载均衡器时,你必须在它们之上使用http-socket - Palasaty
如果您使用@Palasaty或IP套接字和uwsgi协议,则可能会遇到与OP相同的错误。 - Andrei
2
@Palasaty,无论什么原因,修复缓冲区大小都会解决问题! - Farshid Ashouri
当使用nginx作为反向代理时,我不得不使用http-socket。其他任何东西都会出现“502 Bad Gateway”的错误,即使增加了缓冲区大小也是如此。 - Hubro
1
关于引用文档:“如果您在日志中收到‘21573’作为请求块大小,这可能意味着您正在使用HTTP协议与使用uwsgi协议的实例进行通信。不要这样做。” 因此很明显该建议是错误的.... 另外,@Kartic用户已尝试使用“-b”选项... - LittleEaster
@LittleEaster 实际上这是一种可行的“解决方法”。 - Farshid Ashouri

20

我可以通过在uwsgi中添加--protocol=http来修复它。


2
我该如何在uWSGI设置ini文件中进行设置?您的建议可以在命令行中使用,但我的配置只能在命令行中工作。 - Henry Lynx
3
@HenryLynx,只需在您的.ini文件中添加protocol=http即可。 - 151291

14

我在尝试在nginx下运行时遇到了同样的问题,并且正在按照这里的文档进行操作。需要注意的是,一旦转换为nginx,您必须确保您不是在访问--socket参数指定的端口上的应用程序,而是在nginx.conf中“listen”的端口上访问应用程序。虽然你的问题描述不同,但标题完全匹配我曾经遇到的问题。


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

9
当uWSGI服务器使用协议,而尝试通过或Web浏览器直接访问它的协议时,会显示此错误。如果可能,请尝试配置您的uWSGI服务器使用协议,这样您就可以通过Web浏览器或curl访问它。
如果您无法(或不想)更改它,则可以在本地或远程uWSGI服务器前使用反向代理(例如),请参见https://uwsgi-docs.readthedocs.org/en/latest/Nginx.html 如果感觉太麻烦,可以尝试使用 Python包:
$ pip install uwsgi-tools

$ uwsgi_curl 10.0.0.1:3030

如果您需要通过Web浏览器等方式访问应用程序,还可以使用简单的反向代理服务器uwsgi_proxy。更多详细答案请参见https://dev59.com/SGjWa4cB1Zd3GeqPoCwW#32893520


6

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

如果您在日志中收到“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 module = prometheus_plataform.wsgi:application

master = true processes = 33 buffer-size=32768

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

2 - 对nginx进行重大性能升级... 用户www-data;

worker_processes auto; worker_processes 4; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf;

events { 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 off;

## # 基本设置 ##

sendfile on; tcp_nopush on; tcp_nodelay on; #keepalive_timeout 65; types_hash_max_size 2048; server_tokens off;

server_names_hash_bucket_size 64; # server_name_in_redirect off;

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

## # 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
expired no-cache no-store private auth; gzip_types text/plain application/x-javascript text/xml text/css application/xml; gzip_vary on;

#gzip_proxied any; #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;

## # 虚拟主机配置 ##

include /etc/nginx/conf.d/.conf; include /etc/nginx/sites-enabled/; }

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

systemctl restart uwsgi & systemctl restart nginx


0

对于这个特定的错误 invalid request block size: 21327 (max 4096)...skip,它取决于您在本地计算机还是远程服务器(AWS......)上运行解决方案。

这个解决方案对我有用,因为我在我的本地计算机和 Docker 容器中都能正常工作。 1 -- 在您的 ini 文件中将 socket = :8000 更改为 http= :8000

这样也可以在 Docker 中完美地工作。


-1

您可以在uWSGI设置中增加缓冲区大小。

快速解决方案是,从浏览器中删除该URL的cookie。

打开浏览器的开发者工具>转到应用程序选项卡并>删除与该URL相关联的cookie。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接