直接回答
reset は TCP connection が予期せず閉じられた状態です。発生段階と connection 再利用の有無から stale pool と upstream 終了を分けます。
このガイドで解決できること
副作用を重複させず ECONNRESET、socket hang up、connection reset を解決する。
Node.js / Python HTTP clientreverse proxykeep-alive poolSSE streaming
01
症状
request または response 転送中に ECONNRESET、socket hang up、connection reset by peer が発生します。
idle connection 再利用、長い stream、大きい upload、proxy timeout 付近に集中することがあります。
02
主な原因
- server・proxy の idle timeout 後に古い keep-alive connection を再利用した。
- proxy、firewall、load balancer、upstream が能動的に接続を閉じた。
- 別レイヤーが read/write 中に client が cancel・abort した。
- hop 間で pool limit と lifecycle が不整合。
03
診断手順
- 01境界を確定write 中、first-byte 待ち、response 読み取り中のどこで reset したか記録します。
- 02基準を作成モデル一覧と短い non-stream request で基準を作ります。
- 03一項目を比較forced new connection と通常の keep-alive を比較します。
- 04決定的な証拠を記録UTC 時刻、connection metadata、request ID で proxy log を照合します。
最小診断コマンド言語:bash
curl -sS --http1.1 -H 'Connection: close' --connect-timeout 10 --max-time 60 -o /tmp/reset-body.json -w 'remote=%{remote_ip} status=%{http_code} total=%{time_total}
' 'https://<your-api-host>/v1/models' -H "Authorization: Bearer ${API_KEY:?set API_KEY first}"04
修正
- 01障害レイヤーを修正client idle lifetime を最短の server・proxy idle timeout より短くします。
- 02必要な動作を復元pool size、queue wait、keep-alive、read deadline を hop 間で調整します。
- 03一時回避策を除去再実行安全な操作だけを上限付き backoff と cleanup 付きで retry します。
05
検証
- pool size、idle lifetime、queue timeout が負荷下で安定する。
- upstream idle deadline 前に client が connection を破棄する。
- 安全な request だけが回数・総時間上限内で retry される。
- reset 後に tool call・external write が重複しない。
06
機密情報の扱い
- reset 検証のため TLS・proxy control を無効化しない。
- 曖昧な write は retry 前に完了済みの可能性を考慮する。
- header・payload を含む network trace を機密除去する。
- phase、reuse 状態、UTC 時刻、proxy layer、request ID で共有する。
公式情報と検証範囲
本ガイドはプロトコル仕様とクライアント公式文書を根拠にしています。エラー文、再試行ヘッダー、設定項目はサービスやバージョンで変わるため、参照元を確認し、ログとリクエスト例を秘匿してから共有してください。
ドキュメントの適用範囲を見る