テクノロジー · 実用ガイド

curl エラー28:上限を延ばす前にDNS・接続・TLS・先頭バイトを計測する

エラー28はタイムアウト条件に達したことだけを示し、待ちがどの層かは示しません。各段階を計測し、一つの条件だけ比較してから上限を変更します。

オリジナル編集イラスト:curlのタイムアウトをDNS、TCP、TLS、先頭バイト、本文の各段階へ対応付ける。
オリジナル編集イラスト:エラー28は予算警報であり、変更前に段階を測る。 Watch at Ease

curl 28 は時間予算の警報です。TCP接続前、TLSハンドシェイク中、最初の応答バイト待ち、または転送開始後にも起きます。同じ終了コードでも修正は異なります。失敗したコマンドと環境を保存し、累積時間を測り、変更は一つずつ行います。

上限変更前に再現条件を固定する

秘密を除いた正確なURL、HTTPメソッド、実行ホストまたはCI、プロキシ、DNS経路、IPファミリー、curl -Vを記録します。失敗環境で同じ要求を実行し終了コードを保存します。一方で成功し他方で失敗する事実は環境境界の証拠であり、すべての呼び出し元で正常という証明ではありません。

--write-outで段階台帳を出す

副作用のない要求で time_namelookup、time_connect、time_appconnect、time_starttransfer、time_total を出力します。開始時点からの累積値なので、隣接値の差でDNS、TCP、TLS、先頭バイト待ち、本文転送を分離します。

最初に完了しない段階を分類する

名前解決ならDNS到達性や方針、TCPなら経路・IP族・ファイアウォール・プロキシ・待受、TCP後のTLSなら信頼経路や協商を確認します。TLS後の先頭バイト待ちはサーバーや上流、受信開始後の総時間超過は帯域や本文停止を疑います。

制御した変数を一つだけ試す

メソッドと宛先を固定し、正常ホストと比較します。方針が許す場合だけ IPv4/IPv6、設定済みプロキシ、--resolve を一つずつ試します。代替ホストへ本番資格情報を送りません。各比較は一つの問いに答え、前後の時間を残します。

接続・全転送・再試行予算を分ける

--connect-timeout は接続段階、--max-time は各転送全体を制限します。再試行では試行ごとの計時が戻り、--retry-max-time が再試行窓を制限します。遅い段階が正常でジョブも安全に待てると証明した場合だけ上限を延ばします。

修正を再計測し簡単に戻せるようにする

元のコマンドを繰り返し、偶然の成功と区別します。段階時間、有効URL、応答コード、可能なら遠隔IP、終了コード、唯一の変更を保存します。原因不明なら元へ戻し台帳とともにエスカレーションし、証明書検証やネットワーク制御を外しません。

オリジナル編集イラスト:再現、計測、比較、一層だけ変更、証明の台帳。
オリジナル編集イラスト:前後記録を残し、上限増加で障害を隠さない。 Watch at Ease