クライアントがリクエストの送信に時間をかけすぎました。
使いどころ
アイドル状態の接続。クライアントは安全に再試行できます。
よくある原因と対処法
クライアントが時間内に完全なリクエストを送らなかったため、サーバーが接続を閉じました。よくある原因は、大きなアップロード中の遅いモバイル回線、ブラウザーが投機的に開いたまま何も送らない接続、サーバーの上限を超えてアイドル状態が続いた keep-alive 接続です。nginx のタイマーは client_header_timeout と client_body_timeout で、どちらもデフォルトは 60 秒です。
アイドル状態の keep-alive 接続が閉じられるとブラウザーは透過的に再試行するため、ユーザーが 408 を目にすることはほとんどありません。主にアクセスログで気づくことになり、リクエスト行のないエントリーはプリコネクトによるもので無害です。遅い回線での大きなアップロードには、client_body_timeout を引き上げるか、チャンク分割による再開可能なアップロードに切り替えてください。サーバーはリクエストを処理していないので、クライアントは安全に再試行できます。
クライアントエラー (4xx)
4xx はクライアントエラーです。リクエスト自体が誤っている、認証されていない、または存在しないものを指しています。同じリクエストを再試行しても解決しません。
レスポンスでの表示
HTTP/1.1 408 Request Timeout返し方
| Node.js / Express | res.status(408).end() |
|---|---|
| Python / Flask | return '', 408 |
| nginx | return 408; |
確認方法
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/