Nginx uwsgi (104: connexion réinitialisée par peer) lors de la lecture de l'en-tête de réponse en amont

Environnement est Nginx + uwsgi.

obtention d'une erreur de mauvaise passerelle 502 de Nginx sur certaines requêtes GET. Semble être liée à la longueur de l'URL. Dans notre cas particulier, il s'agissait d'une longue liste de paramètres GET. Raccourcissez les paramètres GET et pas d'erreur 502.

De la nginx/erreur.log

[error] 22113#0: *1 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.1.100, server: server.domain.com, request: "GET <long_url_here>"

aucune information dans le journal des erreurs uwsgi.

37
demandé sur user3470130 2014-03-27 23:39:49

6 réponses

Après avoir passé beaucoup de temps sur ce, j'ai enfin compris. Il existe de nombreuses références à Nginx et à la réinitialisation de la connexion par peer. La plupart d'entre eux semblaient être liés à PHP. Je n'ai pas trouvé de réponse spécifique à Nginx et uwsgi.

j'ai finalement trouvé une référence à fastcgi et une erreur 502 bad gateway ( https://support.plesk.com/hc/en-us/articles/213903705 ). Cela m'amène à chercher une limite de taille de tampon dans la configuration uwsgi qui existe sous la forme buffer-size . La valeur par défaut est 4096. D'après la documentation, il est écrit:

si vous prévoyez de recevoir de grandes requêtes avec beaucoup d'en-têtes, vous pouvez augmenter cette valeur jusqu'à 64k (65535).

il y a plusieurs façons de configurer uwsgi, il se trouve que j'utilise un .fichier ini. Donc, dans mon .fichier ini j'ai essayé:

buffer-size=65535

Cela a réglé le problème. Tu peux ajuster ça au goût. Peut-être commencer avec le max et le travail jusqu'à ce que vous avez une valeur acceptable, ou tout simplement laisser au max.

c'était frustrant de retrouver la piste parce qu'il n'y avait pas d'erreur du côté de l'uwsgi.

68
répondu user3470130 2018-01-17 06:51:01

Merci, la même solution est adoptée dans le cas d'un serveur PHP. Nous avons juste besoin d'augmenter l'attribut "output_buffering" valeur, en php.ini, à une valeur plus grande comme 65535 ou une autre valeur appropriée.

3
répondu Eduan Lenine 2015-02-24 20:30:39

j'ai eu la même erreur nginx et aussi il n'y avait aucune information dans le journal uwsgi. Le problème était que, dans certains cas, la demande ne consommait pas l'ensemble du corps de la requête comme indiqué dans http://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html :

si une requête HTTP a un corps (comme une requête POST générée par un formulaire), vous devez la lire (la consommer) dans votre application. Si vous ne le faites pas, l' la prise de communication avec votre serveur web peut être fracassée. Si vous êtes paresseux, vous pouvez utiliser l'option post-buffering qui lira automatiquement les données pour vous. Pour les applications Rack, cela est automatiquement activé.

bien sûr, ce n'est pas un problème dans votre cas, mais il peut être utile pour d'autres qui obtiennent la même erreur nginx.

2
répondu Rinas 2014-06-29 18:40:31

lorsque nous recevons un message comme (104: Connection reset by peer) while reading response header from upstream , le plus souvent, nous pourrions blâmer le côté amont de ce genre d'erreur.

comme décrit, la connexion a été réinitialisée par le Pair amont, pas par nginx lui-même. Nginx en tant que client peut à peine faire quoi que ce soit pour le rendre juste.

je me demande si modifier la taille du tampon fera la magie. Fondamentalement, la commande change la taille du tampon où les en-têtes de réponse sont mis en cache. Cela prendrait effet au moment où l'en-tête de réponse est trop grand, auquel cas nous recevons un message disant upstream sent too big header while reading response header from upstream , et c'est totalement différent de connection reset by peer .

étant donné que ce genre d'erreur se déclenche de façon aléatoire, je vous suggère de vérifier si nginx utilise keepalive en parlant à upstreams. Si tel était le cas, la connexion pourrait être réinitialisée par le serveur amont lorsque le ralenti s'est arrêté alors que nginx ne savait pas que la connexion avait été interrompue, transmettant ainsi la requête en utilisant le même connexion.

il n'y a pas de solution élégante pour le réparer autant que je sache. Vous pouvez réessayer ou définir une valeur keepalive_timeout pour le pool de connexion amont de nginx pour éviter le problème.

référencement:

Apache HttpClient Interim Error: NoHttpResponseException

http://tengine.taobao.org/document/http_upstream_keepalive_timeout.html

0
répondu bjrara 2016-01-26 03:42:04

--post-buffering 32768 travaillé pour moi comme suggéré (et découragé) ici Nginx + uWSGI connexion Reset par Peer

Je n'ai pas le temps de l'approfondir pour le moment (Mode prototypage rapide :), mais comme il m'a fallu beaucoup de temps pour trouver ce hack, il pourrait être intéressant de poster ici.

0
répondu Łukasz Kidziński 2017-06-19 20:01:32

vous devez réinstaller PHP:

apt-get install --reinstall php5-fpm
-7
répondu Lebnik 2015-04-21 13:04:35