2026年5月31日

2026年5月31日

HTTP 408 Request Timeout の原因と直し方|閲覧者側・サーバー側(Nginx / Apache)・CDN の切り分けと 504 との違い

「HTTP 408 Request Timeout」は、閲覧者(ブラウザー)がリクエストを送り終える前に、サーバー側の待ち時間が切れたことを示すエラーです。サーバーが処理に時間をかけすぎたときの 504 とは向きが逆で、原因の多くはサーバーに届く前の区間(閲覧者の回線やブラウザー、途中のプロキシ)か、サーバーの「受信待ちの上限」の短さにあります。

結論を先にまとめます。

  • 1 人の閲覧者だけで起きるなら、閲覧者側(回線、ブラウザーの拡張機能、VPN やウイルス対策のプロキシ)が原因であることが多く、サーバーの設定を変えても直りません。
  • WordPress で大きなファイルのアップロードのときだけ起きるなら、Nginx の client_body_timeout、Apache の RequestReadTimeout、前段のロードバランサーや CDN のタイムアウトのどれかが短いのが原因です。
  • アクセスログに 408 が大量に残っていても、ブラウザーが先回りして開いた接続が何も送らずに切れた記録であることが多く、閲覧者には見えていません。
  • 処理が重くて時間切れになるのは 408 ではなく 504(または 502)です。先に次の表でどちらかを確かめてください。
408 と 504 の違い。408 はリクエストの受信待ちが切れたとき、504 は処理の待ちが切れたときに返る

408 とは、504 との違い

408 Request Timeout とは、サーバーがリクエストの受信を待っている間に、決められた時間内にリクエストが完成しなかったことを示す HTTP の状態コードです(RFC 9110 15.5.9)。つまり「サーバーは暇だったが、閲覧者からの送信が終わらなかった」という状況です。

項目 408 Request Timeout 504 Gateway Timeout
待っていた相手 閲覧者(ブラウザー)からの送信 後ろのサーバー(PHP-FPM、別のサーバー)からの応答
起きる区間 閲覧者 → Web サーバー Web サーバー → PHP やデータベース
典型的な原因 遅い回線、大きなアップロード、短い受信タイムアウト、何も送らない接続 重い処理、PHP の max_execution_time、fastcgi_read_timeout
直す場所 閲覧者側、Nginx / Apache の受信タイムアウト、CDN・ロードバランサー PHP、データベース、proxy_read_timeout などの応答待ち

ページを表示しようとして時間がかかった末に出るのは、ほとんどが 504 か 502 です。Nginx の 502 Bad Gateway の原因と直し方はそちらを扱っています。

どこで起きているかの切り分け

次の順に確かめると、直す場所が決まります。

  1. 誰に起きているか。自分だけ、特定の閲覧者だけなら閲覧者側。全員に、特定の操作(アップロード、長いフォーム送信)で起きるならサーバー側か前段の機器。
  2. 別の回線・別のブラウザーで再現するか。スマートフォンのテザリングやシークレットウィンドウで試します。再現しなければ閲覧者側です。
  3. サーバーのアクセスログに同じ時刻の 408 があるか。あれば Web サーバーが返しています。無ければ、前段の CDN やロードバランサーが返しています(応答ヘッダーの server や via、エラーページの見た目で分かることがあります)。
  4. リクエストの大きさ。大きなファイルや長いフォームで起きるなら、受信のタイムアウトと上限を見直します。

閲覧者側の原因と対処

  • 回線が遅い・不安定。モバイル回線や公衆 Wi-Fi で大きなファイルを送るときに起きます。別の回線で試します。
  • ブラウザーの拡張機能。通信を書き換える拡張機能(広告ブロック、セキュリティ系)が送信を止めることがあります。拡張機能を無効にしたシークレットウィンドウで試します。
  • VPN、ウイルス対策ソフトの Web 保護、会社のプロキシ。途中で通信を検査する仕組みが、サーバーへの送信を遅らせます。いったん切って試します。
  • ブラウザーが先回りして開いた接続。Chrome などは表示を速くするため、まだ何も送らない接続を事前に開きます。サーバーはその接続を待ち時間で閉じ、ログに 408 を残しますが、閲覧者には何も見えません。ログの 408 だけで、エラーページが表示されていないなら対処は不要です。

サーバー側の原因と対処

Nginx

Nginx が 408 を返すのは、リクエストヘッダーまたは本文の受信が、次の時間内に進まなかったときです(ngx_http_core_module)。

設定 意味 既定値
client_header_timeout リクエストヘッダー全体を受け取るまでの待ち時間 60s
client_body_timeout 本文の受信で、連続する 2 回の読み取りの間の待ち時間(全体ではない) 60s
keepalive_timeout 次のリクエストを待つ時間。切れても 408 は返さず接続を閉じる 75s
client_max_body_size 本文の上限。超えると 408 ではなく 413 1m

大きなアップロードで 408 になるなら、server ブロックで本文の待ち時間と上限を上げます。

server {
    client_body_timeout   120s;
    client_max_body_size  64m;
    # 遅い回線からの大きな送信を受け付けるとき。無制限に大きくしない
}
sudo nginx -t && sudo systemctl reload nginx

client_max_body_size と WordPress 側の upload_max_filesize の関係は、Nginx の client_max_body_size で 413 エラーを直すで説明しています。

Apache

Apache 2.4 では、Timeout(core)と、mod_reqtimeout の RequestReadTimeout(mod_reqtimeout)が受信の待ち時間を決めます。RequestReadTimeout はヘッダーと本文のそれぞれに「最初の待ち時間」と「最低限の受信速度」を決められ、遅い回線からの大きな送信はこれに引っかかります。

# /etc/apache2/mods-enabled/reqtimeout.conf など
# ヘッダーは 20 秒以内に受信開始、本文は 60 秒以内に受信開始し、以後 500 バイト/秒ごとに 1 秒延長
RequestReadTimeout header=20-40,MinRate=500 body=60,MinRate=500
sudo apachectl configtest && sudo systemctl reload apache2

body= の値を大きくするのは、大きなアップロードを受け付ける必要があるサイトに限ります。遅い送信を長く待つ設定は、接続を占有する攻撃(Slowloris)への耐性を下げるため、必要な場所(たとえば /wp-admin だけ)に絞って設定するのが無難です。

ロードバランサー・CDN

AWS の ALB、Cloudflare、各社のロードバランサーには、それぞれ「アイドル状態の接続を切るまでの時間」や「リクエスト本文の上限」があり、Web サーバーの設定とは別に 408 や 413 を返します。Web サーバーのログに記録が無いのにエラーが出るときはここを疑い、各サービスのドキュメントで既定値と変更方法を確認してください。Web サーバー側の待ち時間を前段より長くしても、前段で切られれば意味がありません。

WordPress で起きやすい場面

  • メディアのアップロード。大きな画像や動画、プラグインの zip を遅い回線から送るとき。上の受信タイムアウトと上限、PHP の upload_max_filesize と post_max_size を合わせて見直します。
  • 長いフォームの送信・REST API への大きな POST。本文が大きいので同じ対処です。
  • WP-Cron や重い管理画面の処理。これは閲覧者の送信ではなくサーバーの処理の問題なので、起きるのは 504 や「白い画面」です。408 が出ている場合は別の原因を探します。
  • ステージングや海外のサーバー。閲覧者とサーバーの距離が遠いと受信が遅くなります。CDN を前段に置くと、閲覧者は近い拠点に送信すれば済みます。

よくある質問

408 エラーは閲覧者とサーバーのどちらが悪いのですか

どちらか一方とは限りません。意味としては「閲覧者からの送信が時間内に終わらなかった」ですが、原因は閲覧者の回線、途中のプロキシ、サーバーの待ち時間の短さのいずれにもあります。別の回線・別のブラウザーで再現するかで切り分けます。

アクセスログに 408 が大量にあります。攻撃ですか

多くはブラウザーが先回りして開いた接続が、何も送らずに待ち時間で閉じられた記録です。閲覧者にエラーは見えていません。同じ IP から短時間に大量にあり、ヘッダーを少しずつ送るような記録なら、接続を占有する攻撃の可能性があるので、RequestReadTimeout や limit_conn で接続数を絞ります。

408 と 504 の違いは何ですか

408 はサーバーが閲覧者からのリクエストの受信を待ちきれなかったとき、504 は Web サーバーが後ろの PHP や別サーバーからの応答を待ちきれなかったときです。処理が重くて起きるのは 504 です。

WordPress のプラグインで 408 を直せますか

408 は Web サーバーや前段の機器が返すもので、WordPress のプラグインでは変えられません。共用レンタルサーバーでは、サーバー会社の管理画面にアップロード上限やタイムアウトの設定があるか確認してください。

まとめ

  • 408 は「リクエストの受信待ちが切れた」エラーで、処理が重いときの 504 とは別物です。
  • 1 人だけなら閲覧者側、大きな送信で全員に起きるなら Nginx / Apache の受信タイムアウトと前段の CDN・ロードバランサーを見直します。
  • ログに残る 408 の多くはブラウザーの先回り接続の記録で、エラーページが出ていなければ対処は不要です。

関連記事

参考: RFC 9110 – 408 Request Timeout、Nginx ngx_http_core_module、Apache mod_reqtimeout

更新履歴: 2026-11-09 全面改訂(408 の意味、504 との違い、閲覧者側・サーバー側・CDN の切り分けを追加)。この記事はワードプレス博士(ライトセンド株式会社)が運営しています。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲