Подтвердить что ты не робот

Nginx uwsgi (104: Соединение reset от однорангового узла) при чтении заголовка ответа от восходящего потока

Среда - Nginx + uwsgi.

Получение ошибочной ошибки шлюза 502 от Nginx по некоторым запросам GET. Кажется, это связано с длиной URL-адреса. В нашем конкретном случае это был длинный список параметров GET. Сократите параметры GET и не получите ошибки 502.

Из nginx/error.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>"

В журнале ошибок uwsgi нет информации.

4b9b3361

Ответ 1

Потратив много времени на это, я наконец понял это. Есть много ссылок на Nginx и сброс соединения по пиру. Большинство из них, похоже, были связаны с PHP. Я не смог найти ответ, относящийся к Nginx и uwsgi.

Я наконец нашел ссылку на fastcgi и ошибку 502 неверного шлюза (https://support.plesk.com/hc/en-us/articles/213903705). Это привело меня к поиску ограничения размера буфера в конфигурации uwsgi, которое существует как размер буфера. Значение по умолчанию 4096. Из документации написано:

Если вы планируете получать большие запросы с большим количеством заголовков, вы можете увеличить это значение до 64 КБ (65535).

Есть много способов настроить uwsgi, я использую файл .ini. Итак, в моем файле .ini я попытался:

buffer-size=65535

Это решило проблему. Вы можете настроить это по вкусу. Возможно, начните с максимума и продолжайте работу до тех пор, пока не получите приемлемое значение, или просто оставьте его на максимуме.

Это было неприятно отследить, потому что не было никакой ошибки в uwsgi стороне вещей.

Ответ 2

Мы просто увеличиваем значение атрибута "output_buffering" в php.ini до большего значения, например 65535, или другого подходящего значения.

Ответ 3

Я получал ту же ошибку nginx, а также не было информации в журнале uwsgi. Проблема заключалась в том, что в некоторых случаях приложение не потребляло весь орган запроса, как указано в http://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html:

Если HTTP-запрос имеет тело (например, POST-запрос, сгенерированный формой), вы должны его прочитать (использовать) в своем приложении. Если вы этого не сделаете, сокет связи с вашим веб-сервером может быть заблокирован. Если вы ленивы, вы можете использовать опцию пост-буферизации, которая автоматически будет считывать данные для вас. Для приложений Rack это автоматически активируется.

Конечно, это не проблема в вашем случае, но может быть полезно для тех, кто получает ту же ошибку nginx.

Ответ 4

Когда мы получаем сообщение типа (104: Connection reset by peer) while reading response header from upstream, чаще всего, мы можем обвинить вышеописанную сторону такого рода ошибок.

Как описано выше, соединение было reset с восходящим одноранговым узлом, а не с самим nginx. Nginx как клиент не может ничего сделать, чтобы сделать это правильно.

Я подозреваю, что изменение размера буфера сделает магию. В основном команда изменяет размер буфера, в котором кэшируются заголовки ответов. Это вступает в силу, если заголовок ответа слишком велик, и в этом случае мы получаем сообщение с сообщением upstream sent too big header while reading response header from upstream, и это совершенно другое дело от connection reset by peer.

Поскольку такой тип ошибки запускается случайным образом, я бы предложил вам проверить, использует ли nginx keepalive при обращении к восходящим потокам. Если это было так, соединение могло бы быть reset сервером восходящего потока, когда тайм-аут в режиме ожидания, в то время как nginx не знал, что соединение было удалено, следовательно, пересылка запроса с использованием того же соединения.

Там нет элегантного решения, чтобы исправить это, насколько я знаю. Вы можете повторить попытку или установить значение keepalive_timeout для пула соединений вверх по потоку в nginx, чтобы избежать проблемы.

реферирование:

Временная ошибка Apache HttpClient: NoHttpResponseException

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

Ответ 5

--post-buffering 32768 работал у меня, как было предложено (и обескуражено) здесь NGINX + uWSGI Connection Reset by Peer

У меня нет времени, чтобы исследовать его дальше в настоящий момент (быстрый режим прототипирования:), но так как мне потребовалось много времени, чтобы найти этот хак, возможно, стоит опубликовать здесь.

Ответ 6

Вам нужно переустановить PHP:

apt-get install --reinstall php5-fpm