tamanho inválido do bloco de solicitação do uwsgi

142

Estou executando o uwsgi no modo imperador

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

e recebendo esse erro

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

O que fazer?? Eu também tentei -b 32768

Kartik Rokde
fonte
1
Obviamente, o tamanho do buffer ainda é o valor padrão (4096), verifique se você está trabalhando na instância correta. Você também pode escrever "-b 32k". Verifique também se esta opção (tamanho do buffer) ainda não está definida em algum arquivo de configuração.
zakinster
Não há arquivo de configuração. Ainda não está funcionando :(
Kartik Rokde 08/04
8
uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html você está tentando se conectar a um soquete uwsgi usando o protocolo http, além disso, as opções especificadas para o imperador não são herdadas, é apenas um gerenciador de processos
roberto
@zakinster Por algum motivo, o formato do valor knão funcionou para mim. Tinha que fornecer o número completo. Não encontra indicadores sobre os formatos que você pode usar aqui.
precisa saber é o seguinte

Respostas:

207

Eu também tive o mesmo problema enquanto seguia algum tutorial. O problema foi que eu configurei a opção em socket = 0.0.0.0:8000vez de http = 0.0.0.0:8000. socketopção destinada a ser usada com algum roteador de terceiros (nginx, por exemplo), enquanto que quando a httpopção está configurada, o uwsgi pode aceitar solicitações HTTP de entrada e encaminhá-las por si só.

Palasaty
fonte
5
Eu gostaria de comentar sobre isso: o uwsgi possui as opções "http", "http-socket" e "socket". Eu queria chamar scripts python cgi; "soquete" foi a resposta.
NuclearPeon
No arquivo de configuração do Nginx, podemos usar isso: include / etc / nginx / uwsgi_params; uwsgi_pass django_upstream;
mennanov
3
Não é a solução correta. E se quisermos unix soquetes?
Farsheed 21/08/2015
2
@ Farsheed, acabei de descrever por que o OP está vendo esse erro. Como corrigi-lo é totalmente sua. Pode ser socket = /tmp/myapp.sockou http = 0.0.0.0:8000ou o que for, dependendo de suas necessidades.
Palasaty
1
Embora essa resposta possa resolver o problema em algumas situações, acho que a resposta correta no caso geral é a fornecida pelo @Farsheed abaixo.
Augusto Destrero 15/11/19
142

A solução correta é não mudar para o protocolo HTTP. Você só precisa aumentar o tamanho do buffer nas configurações do uWSGI.

buffer-size=32768

ou no modo de linha de comando:

-b 32768

Citação da documentação oficial:

Por padrão, o uWSGI aloca um buffer muito pequeno (4096 bytes) para os cabeçalhos de cada solicitação. Se você começar a receber "tamanho de bloco de solicitação inválido" em seus logs, isso pode significar que você precisa de um buffer maior. Aumente-o (até 65535) com a opção de tamanho do buffer.

Se você receber '21573' como o tamanho do bloco de solicitação em seus logs, isso pode significar que você está usando o protocolo HTTP para falar com uma instância que fala o protocolo uwsgi. Não faça isso.

A partir daqui: https://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html

Farsheed
fonte
1
Às vezes, você precisa usar o protocolo http, pois os soquetes unix estão disponíveis apenas na máquina local. Considere uma situação em que você tenha várias máquinas e um balanceador separado em cima delas - você deve usar http-socketaqui.
Palasaty
@Palasaty ou um IP soquete e uwsgiprotocolo, então você também pode obter o mesmo erro como OP
Andrei
2
@Palasaty, por qualquer motivo, a fixação do tamanho do buffer corrigirá o problema!
Farsheed 01/12/2015
Ao usar o nginx como proxy reverso, tive que usar http-socket. Qualquer outra coisa deu "502 Bad Gateway", mesmo quando o tamanho do buffer foi aumentado.
Hubro 29/08/16
Quanto à documentação citada "Se você receber '21573' como o tamanho do bloco de solicitação em seus logs, pode significar que você está usando o protocolo HTTP para falar com uma instância que fala o protocolo uwsgi. Não faça isso." Então, é claro que a sugestão é errado .... Além disso, o usuário @Kartic já tentou usar "-b" opção ...
LittleEaster
14

Encontrei o mesmo problema ao tentar executá-lo no nginx e estava seguindo os documentos aqui . É importante observar que, depois de mudar para o nginx, você deve garantir que não está tentando acessar o aplicativo na porta especificada pelo parâmetro --socket, mas sim na porta "listen" no nginx.conf. Embora seu problema seja descrito de maneira diferente, o título corresponde exatamente ao problema que tive.

Paulo SantAnna
fonte
Sim, encontrei a mesma coisa. em outras palavras, recebi um erro quando enrolava a porta localmente, enquanto eu conseguia navegar com êxito até o 'local' do meu proxy reverso wsgi conforme especificado no meu `nginx.conf ', porque o protocolo do servidor wsgi no my socket escolhido foi wsgi e não http
danyamachine
14

Eu poderia corrigi-lo adicionando --protocol = http ao uwsgi

ajamardo
fonte
2
Como posso configurar isso no arquivo ini de configurações do uWSGI? Minha configuração funciona com sua sugestão, mas apenas na linha de comando.
Henry Lynx
2
@HenryLynx, basta adicionar protocol=httpao seu .iniarquivo
151291
7

Este erro é mostrado quando o servidor uWSGI está usando o uwsgiprotocolo e tenta-se acessá-lo via httpprotocolo pelo curlnavegador da web ou diretamente. Se puder, tente configurar o servidor uWSGI para usar o httpprotocolo, para que você possa acessá-lo via navegador da Web ou enrolar.

Caso você não possa (ou não queira) alterá-lo, use um proxy reverso (por exemplo nginx) na frente do servidor uWSGI local ou remoto, consulte https://uwsgi-docs.readthedocs.org/en/latest/Nginx .html

Se parecer muito trabalho, tente o uwsgi-toolspacote python:

$ pip install uwsgi-tools

$ uwsgi_curl 10.0.0.1:3030

Também existe um servidor proxy reverso simples uwsgi_proxyse você precisar acessar seus aplicativos via navegador da web etc. Veja mais respostas expandidas https://stackoverflow.com/a/32893520/179581

Andrei
fonte
2

Como apontado em outro comentário dos documentos:

Se você receber '21573' como o tamanho do bloco de solicitação em seus logs, isso pode significar que você está usando o protocolo HTTP para falar com uma instância que fala o protocolo uwsgi. Não faça isso.

Se você estiver usando o Nginx, isso ocorrerá se você tiver esta configuração (ou algo similarmente estranho):

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

isso está falando HTTP para o uWSGI (o que o torna irritado). Em vez disso, use:

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

o homem está tendo o mesmo problema; então eu fiz isso ... olha usando 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: aplicativo

master = processos verdadeiros = 33 tamanho do buffer = 32768

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

2 - faça uma atualização de desempenho séria no nginx ... user www-data;

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

eventos {conexões de trabalho 4092; multi_accept on; }

http {## CONFIGURAÇÕES DE ATUALIZAÇÃO

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;

## # Configurações básicas ##

sendfile ativado; 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;

inclua /etc/nginx/mime.types; aplicativo default_type / octet-stream;

## # Configurações SSL ##

protocolos ssl TLSv1 TLSv1.1 TLSv1.2; # Ignorando SSLv3, ref: POODLE ssl_prefer_server_ciphers on;

## # Configurações de log ##

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

## # Configurações de Gzip ##

gzip on; gzip_comp_level 2; gzip_min_length 1000; gzip_proxied
expirou no-cache no-store auth privado; gzip_types text / aplicativo simples / 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 texto / texto sem formatação / aplicativo css / aplicativo json / texto javascript / aplicativo xml / aplicativo xml / xml + texto rss / javascript;

## # Configurações de host virtual ##

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

3 - então ... reinicie os serviços ou reebote o servidor ...

systemctl restart uwsgi e systemctl restart nginx

Renan Moura
fonte