в проде периодически (через ~6–12 часов) падают некоторые endpoint’ы с 502, но после перезапуска сервиса всё временно стабильно. Логи показывают: connect EPROTO и upstream read timeout, но не всегда. Предложите пошаговую стратегию воспроизведения + 3 реальные гипотезы (и как быстро их подтвердить). Не давайте только общий список - давайте конкретные команды/шаги.
TLS handshake/EPROTO from upstream (например, сервис A меняет cert/expired cert) → соединение падает. Quick check: curl -v https://upstream-host с сервера прокси в момент инцидента (или run periodically). Команды: openssl s_client -connect upstream-host:443 -showcerts - посмотреть cert validity. Если cert expired/intermittent, это будет видно.
upstream overcrowding / ephemeral port exhaustion. Check netstat/ss for TIME_WAIT count, sysctl -a | grep net.ipv4.ip_local_port_range, lsof -p <pid> and ss -s. Для воспроизведения - запустить нагрузочный скрипт (wrk/k6) и смотреть когда порт pool исчерпывается. Quick mitigation: уменьшить keepalive timeout или увеличить ephemeral port range.
memory leak в upstream service → GC pauses → таймауты. Проверяем метрики memory/GC на upstream (heap, p95 latency). Для проверки — воспроизвести load и снять heapdump при росте RSS. Tooling: curl /metrics (если prometheus), jmap/heapdump или node clinic.
Шаги: 1) включить детальный TLS logging на прокси, 2) запустить нагрузочный тест 30–60m чтобы воспроизвести, 3) собрать netstat/ss snapshots при инциденте.
делаем canary test: 1) настроить secondary upstream (backup) и включить healthchecks (fast) - при падении primary - переключение позволит не терять availability; 2) собираем tcpdump -w при инциденте (ограничьте фильтр по ip/port) это даст raw trace TLS handshake; 3) correlate with deploys/cron jobs, часто background tasks (backup, rotate certs) совпадают с таймингом проблем.
Ещё проверьте: не было ли межвузловой MITM или смены ALPN - EPROTO может означать mismatch TLS versions. Логи nginx/HAProxy + openssl помогут.
Добавьте circuit-breaker + retry с backoff
Конкретные команды для начала:
-
openssl s_client -connect upstream:443 -servername upstream -
ss -s; ss -tanp | grep :443 -
tcpdump -i any host <upstream-ip> and port 443 -w /tmp/tls.pcap -
curl -v --http2 https://upstream
Дальше смотрим pcap в Wireshark, проверяем TLS alerts.