Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумРазбор ошибок

502 от посредника: чей это отказ

Родион Гаев
Родион Гаев
Ветеран
сообщений 2420
с фев
8 июня, 11:17первое сообщение

Собираю выгрузку через свой промежуточный узел на nginx. Примерно одно обращение из тридцати возвращает 502, остальные двести с лишним в минуту проходят без единой заминки.

Смущает вот что: тот же адрес, отправленный напрямую с машины, отдаёт 200 и полное тело. Через узел он же ловит 502. И отказ приходит мгновенно, за 40 миллисекунд, то есть узел даже не пытался ждать сайт.

Как понять, чей это отказ: сайт отдал мусор и узел не смог его переварить, или узел сам споткнулся?

proxy_hands
proxy_hands
Знаток
сообщений 1405
с мая
15 ноября, 14:34#2

Мгновенные 40 миллисекунд уже говорят почти всё. Когда 502 прилетает от сайта или от чужого посредника впереди, вы сначала ждёте полный оборот до него и обратно. Ваши сорок миллисекунд означают, что бумага порвалась у вас на столе.

Дальше код ответа вам мало что даст, идите по трём приметам сразу.

Первое: заголовки ответа. Свой nginx подписывается своим Server и не ставит ничего от сайта, ни X-Cache, ни куки, ни характерных для площадки заголовков. Отказ от дальней стороны почти всегда тащит хвост её заголовков.

Второе: длина тела. Фирменная страница nginx весит около 150 байт и по содержанию всегда одна и та же. Ответ сайта такой ровной длины не даёт.

Третье, и оно закрывает вопрос: журнал ошибок самого узла. Он прямо пишет, на чём споткнулся.

смотрим, что пишет сам узел
смотрим, что пишет сам узел

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

Вика Сорокина
Вика Сорокина
Новичок
сообщений 85
с июл, второй сезон
22 апреля, 17:51#3

а как в теле отличить страницу nginx от чужой заглушки

kvadrat_ru
kvadrat_ru
Участник
сообщений 855
с июл
1 сентября, 08:08#4

Проще всего снять заголовки и тело вместе и посмотреть глазами, там всё видно с первого раза.

curl -sS -D - -o /tmp/telo.html -w '\nbytes=%{size_download} time=%{time_total}\n' \
  -x http://127.0.0.1:3128 https://target.example/catalog/8841
head -c 200 /tmp/telo.html

Стандартная страница узла коротка и подписана внизу его именем. Заглушка площадки почти всегда тяжелее и содержит их разметку либо их номер обращения.

Ирина Пахомова
Ирина Пахомова
Новичок
сообщений 280
с янв, второй сезон
8 февраля, 11:25#5
kvadrat_ru: посмотреть глазами, там всё видно с первого раза

Подтверждаю, так быстрее всего. Ещё примета по кодам: 502 говорит «ответ пришёл, разобрать не смог», а 504 говорит «ответа не дождался». Если у вас в логе прогона мешаются оба, это две разных истории и разбирать их надо порознь.

Родион Гаев
Родион Гаев
Ветеран
сообщений 2420
с фев
15 июля, 14:42#6

Разобрался, спасибо всем троим.

В журнале ошибок ровно первая строка из примера proxy_hands: заголовки не влезали в буфер. Площадка на части карточек ставит длинную пачку Set-Cookie, штук шесть, суммарно под шесть килобайт, и они перелезали через стандартный размер. Отсюда и одна тридцатая отказов: длинные куки прилетали только на карточках с открытой сессией показа.

Поднял два размера в конфиге узла:

proxy_buffer_size   16k;
proxy_buffers       8 16k;
proxy_busy_buffers_size 32k;

Перечитал конфиг, гоняю третьи сутки, 502 за это время ноль. Порядок действий на будущее: сначала померить время до отказа, потом снять заголовки ответа, и только потом лезть в журнал узла. Первые два шага занимают минуту и сразу говорят, в чью сторону смотреть.