uwsgi taille de bloc de demande non valide

142

J'exécute uwsgi en mode empereur

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

et obtenir cette erreur

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

Que faire?? J'ai aussi essayé -b 32768

Kartik Rokde
la source
1
La taille du tampon est évidemment toujours la valeur par défaut (4096), assurez-vous que vous travaillez sur la bonne instance. Vous pouvez également écrire "-b 32k". Assurez-vous également que cette option (taille du tampon) n'est pas déjà définie dans certains fichiers de configuration.
zakinster
Il n'y a pas de fichier de configuration. Ne fonctionne toujours pas :(
Kartik Rokde
8
uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html vous essayez de vous connecter à une socket uwsgi en utilisant le protocole http, en plus de cela les options spécifiées à l'empereur ne sont pas héritées, c'est seulement un gestionnaire de processus
roberto
@zakinster Pour une raison quelconque, le format de valeur avec kne fonctionnait pas pour moi. J'ai dû fournir le nombre complet. Vous ne trouvez aucun pointeur sur les formats que vous pouvez utiliser ici.
famousgarkin

Réponses:

207

J'ai également rencontré le même problème en suivant un tutoriel. Le problème était que je définissais l'option socket = 0.0.0.0:8000au lieu de http = 0.0.0.0:8000. socketoption destinée à être utilisée avec un routeur tiers (nginx par exemple), tandis que lorsque l' httpoption est définie, uwsgi peut accepter les requêtes HTTP entrantes et les acheminer par lui-même.

Palasaty
la source
5
Je voudrais juste commenter ceci: uwsgi a les options "http", "http-socket" et "socket". Je voulais appeler des scripts python cgi; "socket" était la réponse.
NuclearPeon
Dans le fichier de configuration Nginx, nous souhaitons peut-être utiliser ceci: include / etc / nginx / uwsgi_params; uwsgi_pass django_upstream;
mennanov le
3
Ce n'est pas la bonne solution. Et si nous voulons unix des sockets?
Farsheed
2
@Farsheed, je viens de décrire pourquoi OP voit cette erreur. Comment résoudre ce problème dépend entièrement de vous. Cela peut être socket = /tmp/myapp.sockou http = 0.0.0.0:8000ou quoi que ce soit selon vos besoins.
Palasaty
1
Bien que cette réponse puisse résoudre le problème dans certaines situations, je pense que la bonne réponse dans le cas général est celle fournie par @Farsheed ci-dessous.
Augusto Destrero
142

La bonne solution est de ne pas passer au protocole HTTP. Il vous suffit d'augmenter la taille de la mémoire tampon dans les paramètres uWSGI.

buffer-size=32768

ou en mode ligne de commande:

-b 32768

Citation de la documentation officielle:

Par défaut, uWSGI alloue un très petit tampon (4096 octets) pour les en-têtes de chaque requête. Si vous commencez à recevoir une «taille de bloc de demande non valide» dans vos journaux, cela peut signifier que vous avez besoin d'un tampon plus grand. Augmentez-le (jusqu'à 65535) avec l'option de taille de tampon.

Si vous recevez «21573» comme taille de bloc de requête dans vos journaux, cela peut signifier que vous utilisez le protocole HTTP pour parler avec une instance parlant le protocole uwsgi. Ne fais pas ça.

De là: https://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html

Farsheed
la source
1
Parfois, vous devez utiliser le protocole http, car les sockets unix ne sont disponibles que sur la machine locale. Considérez une situation où vous avez un certain nombre de machines et un équilibreur séparé dessus - vous devez utiliser http-socketici.
Palasaty
@Palasaty ou une socket IP et un uwsgiprotocole, vous pouvez également obtenir la même erreur que OP
Andrei
2
@Palasaty, quelle qu'en soit la cause, la correction de la taille du tampon résoudra le problème!
Farsheed
Lors de l'utilisation de nginx comme proxy inverse, j'ai dû utiliser http-socket. Tout le reste a donné "502 Bad Gateway", même lorsque la taille de la mémoire tampon a été augmentée.
Hubro
Quant à la documentation citée "Si vous recevez '21573' comme taille de bloc de requête dans vos journaux, cela peut signifier que vous utilisez le protocole HTTP pour parler avec une instance parlant le protocole uwsgi. Ne faites pas cela." Il est donc clair que la suggestion est fausse .... De plus, l'utilisateur @Kartic a déjà essayé d'utiliser l'option "-b" ...
LittleEaster
14

J'ai rencontré le même problème en essayant de l'exécuter sous nginx et je suivais les documents ici . Il est important de noter qu'une fois que vous passez à nginx, vous devez vous assurer que vous n'essayez pas d'accéder à l'application sur le port spécifié par le paramètre --socket mais plutôt sur le port "listen" dans nginx.conf. Bien que votre problème soit décrit différemment, le titre correspond exactement au problème que j'ai eu.

Paulo SantAnna
la source
oui je suis tombé sur la même chose. en d'autres termes, j'ai eu une erreur lorsque j'ai bouclé le port localement, alors que je pouvais naviguer avec succès vers le 'emplacement' de mon proxy inverse wsgi comme spécifié dans mon `nginx.conf ', car le protocole du serveur wsgi sur mon socket choisi était wsgi et non http
danyamachine
14

Je pourrais le réparer en ajoutant --protocol = http à l'uwsgi

Ajamardo
la source
2
Comment puis-je configurer cela dans le fichier ini des paramètres uWSGI? Ma configuration fonctionne avec votre suggestion mais uniquement dans la ligne de commande.
Henry Lynx
2
@HenryLynx, ajoutez simplement protocol=httpà votre .inifichier
151291
7

Cette erreur s'affiche lorsque le serveur uWSGI utilise le uwsgiprotocole et que l'on essaie d'y accéder via le httpprotocole curlou le navigateur Web directement. Si vous le pouvez, essayez de configurer votre serveur uWSGI pour utiliser le httpprotocole, afin de pouvoir y accéder via un navigateur Web ou curl.

Si vous ne pouvez pas (ou ne voulez pas) le changer, vous pouvez utiliser un proxy inverse (par exemple nginx) devant le serveur uWSGI local ou distant, voir https://uwsgi-docs.readthedocs.org/en/latest/Nginx .html

Si cela vous semble trop de travail, essayez le uwsgi-toolspackage python:

$ pip install uwsgi-tools

$ uwsgi_curl 10.0.0.1:3030

Il existe également un simple serveur proxy inverse uwsgi_proxysi vous devez accéder à vos applications via un navigateur Web, etc. Voir la réponse plus étendue https://stackoverflow.com/a/32893520/179581

Andrei
la source
2

Comme indiqué dans un autre commentaire de la documentation:

Si vous recevez «21573» comme taille de bloc de requête dans vos journaux, cela peut signifier que vous utilisez le protocole HTTP pour parler avec une instance parlant le protocole uwsgi. Ne fais pas ça.

Si vous utilisez Nginx, cela se produira si vous avez cette configuration (ou quelque chose de similaire étrange):

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

c'est parler HTTP à uWSGI (ce qui le rend grincheux). À la place, utilisez:

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

l'homme im havin même problème; alors je l'ai fait ... regardez en utilisant 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 = vrais processus = 33 taille du tampon = 32768

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

2 - effectuez une mise à niveau sérieuse des performances sur nginx ... utilisateur www-data;

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

événements {worker_connections 4092; multi_accept activé; }

http {## CONFIGURATIONS DE MISE À JOUR

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;

## # Paramètres de base ##

sendfile activé; tcp_nopush activé; tcp_nodelay activé; #keepalive_timeout 65; types_hash_max_size 2048; server_tokens off;

server_names_hash_bucket_size 64; # server_name_in_redirect off;

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

## # Paramètres SSL ##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Suppression de SSLv3, ref: POODLE ssl_prefer_server_ciphers activé;

## # Paramètres de journalisation ##

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

## # Paramètres Gzip ##

gzip on; gzip_comp_level 2; gzip_min_length 1000; gzip_proxied
expiré no-cache no-store private auth; gzip_types text / plain application / x-javascript text / xml text / css application / xml; gzip_vary activé;

#gzip_proxied any; #gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; #gzip_types texte / texte brut / application css / application json / texte javascript / application xml / application xml / xml + texte rss / javascript;

## # Configurations d'hôte virtuel ##

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

3 - puis ... redémarrez les services ou le serveur reebot ...

systemctl redémarrer uwsgi & systemctl redémarrer nginx

Renan Moura
la source