ERR_EMPTY_RESPONSE とは?原因と解決方法

Advertisement
ERR_EMPTY_RESPONSE とは?
ERR_EMPTY_RESPONSE は、「このページは動作していません。example.com からデータが送信されませんでした。」 と表示される Chrome と Edge のエラーページです。Chromium 内部ではネットエラー -324 にあたり、「サーバーがデータを何も送信せずに接続を閉じた」と定義されています。
ブラウザは、ほとんどの接続エラーよりも先の段階まで進んでいます。アドレスの名前解決ができ、接続が開かれ、ブラウザはリクエストを送信しました。その後、サーバー、またはその手前にある何かが 空の応答のまま接続を閉じた のです。ステータスコードもヘッダーもページもありません。Chromium のコードがこのエラーを使うのは、新しい接続が0バイトのまま閉じられた場合だけです。再利用していた古い接続が閉じられた場合、Chrome は何も表示せずに再試行します。
リクエストは実際に届いているため、ERR_EMPTY_RESPONSE はたいてい サーバー側 の問題を示しています。リクエストの処理中にクラッシュしたアプリ、意図的に接続を切断するルール、接続を受け付けたものの背後に何もないサービスなどです。ただし、あなた自身のコンピューター上の原因でも発生することがあります。
ERR_EMPTY_RESPONSE の原因
| 原因 | 発生場所 | 手がかり |
|---|---|---|
| リクエストの処理中にアプリがクラッシュした、または強制終了された | サーバー | 全員に対して失敗し、特定の重いページで起こることが多い |
| 接続を切断するルール(nginx の return 444、WAF、ボット対策) | サーバー | 一部の訪問者、IP、ユーザーエージェントだけで失敗する |
| 背後で何も待ち受けていないポート転送(Docker、ロードバランサー) | サーバー / 開発者 | ポートは開いているが、すべてのリクエストが空で返る |
| HTTPS しか話さないポートに http:// で送った | 開発者 | https:// では動作し、http:// では失敗する |
| VPN、プロキシ、ウイルス対策ソフトの HTTPS スキャン | あなたのデバイス | あなたのデバイスやネットワークでだけ失敗する |
| リクエストやヘッダーがサーバーにとって大きすぎる | サーバー | ログイン後や Cookie が多いときに失敗する |
Advertisement
解決策1:再読み込みしてシークレットモードを試す
サーバーが悪いタイミングで再起動しただけなら、数秒後に再読み込みすれば十分です。エラーが繰り返す場合は、シークレット ウィンドウでページを開いてください(Ctrl + Shift + N、Mac は Cmd + Shift + N)。シークレットモードは Cookie も拡張機能もない状態で始まるため、ブラウザに保存されている何かが関係しているかどうかをすぐに判断できます。
次に、サイトが全員に対してダウンしているかどうかを確認します。DNS Robot の HTTP ヘッダーチェック ツールは、当社のサーバーからページをリクエストします。こちらで正常な応答が返るなら、問題はあなたとサイトの間にあります。こちらでも何も返ってこなければ、サイト自体に障害が起きています。
解決策2:VPN、プロキシ、HTTPS スキャンをオフにする
接続の中間に位置するものはすべて、リクエストを受け付けた後、応答を渡さずに接続を閉じてしまう可能性があります。
VPN: 完全に切断して再読み込みします。
プロキシ: Windows 11 では、設定 → ネットワークとインターネット → プロキシ → プロキシ サーバーを使う をオフにします。Mac では、システム設定 → ネットワーク → 使用中の接続 → 詳細… → プロキシ。
ウイルス対策ソフトの HTTPS スキャン: Web 保護や HTTPS スキャンの機能だけをオフにして(HTTPS スキャン、Web シールド、SSL/TLS プロトコルフィルタリング などの名前が一般的です)、再読み込みします。これで直るなら、そのサイトを除外リストに追加し、スキャンをオンに戻してください。
Advertisement
解決策3:サイトのデータを削除し、拡張機能を無効にする
非常に大きい、または破損した Cookie があると、サーバーが応答せずにリクエストを切断することがあり、ログインした後にだけエラーが出るという形で現れることがよくあります。そのサイトの Cookie を削除しましょう。アドレスバーの左端のアイコンをクリック → Cookie とサイトデータ(または サイトの設定)→ データを削除して、もう一度ログインします。
次に、chrome://extensions ですべての拡張機能を無効にして再読み込みします。1つずつ有効に戻して、干渉しているものを見つけてください。広告ブロッカー、プライバシーツール、リクエストを編集するものが原因であることが多いです。
解決策4:DNS をフラッシュしてネットワークスタックをリセットする
1台のコンピューターでどのサイトも空の応答になる場合は、そのネットワーク設定をリセットします。Windows では管理者権限のコマンド プロンプトで以下のコマンドを実行し、再起動してください。Mac では DNS キャッシュをフラッシュ し、Wi-Fi ネットワークを削除してから追加し直します。
ipconfig /flushdns
netsh winsock reset
netsh int ip reset
ipconfig /release
ipconfig /renewスマートフォンのモバイルデータ通信など、別のネットワークも試してください。そこでサイトが表示されるなら、普段使っているネットワーク(学校、職場、ISP)のフィルタリングが接続を切断している可能性があります。
Advertisement
localhost と Docker での ERR_EMPTY_RESPONSE
開発者がこのエラーを最もよく目にするのは、自分のマシン上です。よくある原因は次のとおりです。
Docker コンテナ内のアプリが 127.0.0.1 で待ち受けている。 コンテナ内では
127.0.0.1は「このコンテナだけ」を意味するため、Docker のポート転送の接続先がなく、ブラウザには空の応答が返ります(構成によっては接続リセットになります)。コンテナ内のアプリが0.0.0.0で待ち受けるようにしてください。たとえばnext dev -H 0.0.0.0、vite --host 0.0.0.0、flask run --host=0.0.0.0、uvicorn main:app --host 0.0.0.0です。コンテナのポートマッピングが一致していない。
-p 8080:3000は、ホストのポート 8080 をコンテナ 内部の 3000 に転送します。アプリが実際には 5000 で待ち受けていると、すべてのリクエストが空で返ってきます。HTTPS 専用のポートに http:// でアクセスしている。 ポートで TLS を想定しているサーバーの中には、平文の HTTP が届くとそのまま接続を切るものがあります。
http://ではなくhttps://localhost:8443を試してください。リクエストの処理中に開発サーバーがクラッシュした。 開発サーバーを実行しているターミナルを確認してください。その時点で例外やメモリ不足のエラーが出ていれば、それが答えです。
# ブラウザを使わずに再現する
curl -v http://localhost:8080/
# "Empty reply from server" = 接続は受け付けられたが、何も返されなかった
# コンテナはどのポートを公開し、内部では何が待ち受けているか?
docker ps --format "table {{.Names}}\t{{.Ports}}"
docker exec -it <container> sh -c "netstat -tlnp 2>/dev/null || ss -tlnp"サイト管理者向け:サーバーが空の応答を返す理由
クラッシュとメモリ不足による強制終了。 リクエストを処理しているプロセスが停止すると、何も送られないまま接続が閉じられます。特に重いページやアップロードについて、アプリのログを確認し、
dmesg -T | grep -i "killed process"で Linux の OOM キラー(メモリ不足時の強制終了)が動いていないか調べてください。意図的な切断。 nginx の特殊な
return 444;は、応答を一切返さずに接続を閉じます。悪質なボットや不明なホスト名をブロックするためによく使われます。このようなルールが実際の訪問者にも一致してしまうと(範囲が広すぎるユーザーエージェントや GeoIP のルールなど)、訪問者には ERR_EMPTY_RESPONSE が表示されます。HTTP/2 接続では nginx が代わりにストリームをリセットするため、ERR_HTTP2_PROTOCOL_ERROR になります。WAF、レート制限、ボット対策サービスも同じことをする場合があります。バックエンドのないポート転送やロードバランサー。 接続を受け付けても、背後に正常なサーバーがないリスナーは、空のまま接続を閉じることがあります。ターゲットのヘルスチェックと、バックエンドのポートが一致しているかを確認してください。
応答せずに接続を閉じるタイムアウト。 時間のかかるリクエストでは、ソケットを黙って閉じるのではなく、適切なエラー(504 など)を返すようにしましょう。そうすれば、訪問者も監視ツールも何が起きたのかを把握できます。
大きすぎるリクエスト。 非常に大きなヘッダーや Cookie があると、サーバーによってはリクエストを切断します。Cookie は小さく保ちましょう。
# 接続を切断するルールはないか?
sudo grep -rn "return 444" /etc/nginx/
# 訪問者と同じように外部からテストする
curl -sv https://yourdomain.com/ -o /dev/nullAdvertisement
ERR_EMPTY_RESPONSE と似たエラーの違い
| エラー | コード | 何が起きたか |
|---|---|---|
| ERR_EMPTY_RESPONSE | -324 | リクエストは送信されたが、0バイトのまま接続が閉じられた |
| ERR_CONNECTION_CLOSED | -100 | リクエストを送る前に閉じられた(通常は HTTPS のハンドシェイク中) |
| ERR_CONNECTION_RESET | -101 | TCP リセットで接続が突然切断された |
| 502 Bad Gateway | HTTP | プロキシは応答したが、その上流のアプリが失敗した |
関連ガイド:ERR_CONNECTION_CLOSED、ERR_CONNECTION_RESET、502 Bad Gateway、500 Internal Server Error。サーバーのポートが外部からの接続を受け付けるかどうかを確認するには、ポートチェッカー を使ってください。
サーバーはネットワークの外から応答する?
DNS Robot の無料ポートチェッカーは、ドメインのポート 443 または 80 が当社のサーバーからの接続を受け付けるかどうかをテストします。HTTP ヘッダーチェックと組み合わせれば、サーバーが実際に応答を返しているかどうかも確認できます。
試す ポートチェッカーAdvertisement
よくある質問
ブラウザがサーバーに接続してリクエストを送ったのに、サーバーがステータスコードもヘッダーもページも返さず、データを何も送らないまま接続を閉じたという意味です。Chromium ではネットエラー -324 にあたり、「このページは動作していません。example.com からデータが送信されませんでした。」と表示されます。