2回目のアクセスだけ、本文が0バイトで返っていました
あるサイトのトップページが真っ白になる、という連絡を受けました。
症状には条件がありました。1回目のアクセスは正常です。同じブラウザで同じURLをもう一度開くと、真っ白になります。エラー画面ではありません。HTTPのステータスは200、つまり「正常に返しました」という応答です。
外部からコマンドで叩いて、返ってきた本文の大きさを測りました。
1回目は673,920バイト。2回目は0バイト。3回目も0バイトでした。
URLの末尾に意味のない文字をひとつ足すと、正常に返ります。ブラウザのCookieを消しても正常に返ります。開発環境では、何度開いても再現しませんでした。
翌々日には再現しなくなりました
配信の経路をたどりました。ブラウザからサーバーへ届くまでに、いくつかの層を通っています。そのどこかが空の応答を保存して配り直しているのではないか、というところまで来ました。
翌々日、確認のためにもう一度測りました。
正常でした。
何度測っても再現しません。設定は何も変えていません。直したわけではないのに、症状が消えていました。
この状態がいちばん厄介です。原因を特定できないまま、確かめる材料もなくなります。次にいつ出るかも分かりません。
調査を止めて、先に監視を作りました
やったことは単純です。一定の間隔で実際にサイトへアクセスし、1回目と2回目の応答を比べる。2回目の本文が空だったら、アラートを上げてメールで飛ばす。
再現しない不具合は、再現するまで待つしかありません。待つのなら、出た瞬間を捕まえられる状態で待ちます。
原因を追う時間ではないので、遠回りに見えます。ただ、捕まえられないまま何度も調べ直すほうが、結果として長くかかります。
8日後に一度、その11日後にもう一度鳴りました
最初のアラートは8日後でした。
通知を受けて見に行くと、すでに正常に戻っていました。どのくらい続いていたのかは分かりません。捕まえられませんでした。
次に鳴ったのは、そこから11日後です。今度は、発生したまま続いていました。
ここで初めて、症状が出ている状態のサーバーを直接調べられるようになりました。
キャッシュも外部の防御サービスも、症状を作れない構成です
このサイトは、以前に別の会社が構築したものを引き継いでいます。構成の全体像をこちらで把握しきれていなかったことが、経路を先に疑った理由でした。
最初に疑ったのは、経路の途中にあるキャッシュです。空の応答が保存されて配り直されている、と考えました。設定を確認できる範囲で調べたところ、その層はキャッシュを持たない構成でした。消えました。
次に疑ったのは、外部の防御サービスです。運用元へ問い合わせたところ、そのサービスは対象外の構成にあり、そもそも関与できないという回答でした。消えました。
次に疑ったのは、経路上に見えていた見慣れないサーバーです。調べると、自社で立てた負荷分散の仕組みが持つ内部アドレスでした。消えました。
残ったのは、クラウド側の負荷分散そのものです。設定の変更履歴を全て確認し、6月に入ってから誰も設定を変更していないことを確かめました。誰も触っていないのに症状が出るなら、こちら側の問題ではありません。
クラウドの提供元へ問い合わせる準備をしました。
0バイトの応答はどこから出ているのか
準備をしながら、ひとつ引っかかっていました。
「こちら側ではない」という結論は、消去法で出したものです。可能性を順番に消して残った、というだけで、積極的に確かめたわけではありません。
サーバーに入り、実際に流れているパケットを記録しました。空の応答がどこで生まれているのかを、経路の推定ではなく通信そのもので見ました。
発生源は、自分たちのサーバーでした。
クラウド側は無関係でした。問い合わせは送らずに済みました。
原因は、半年前から所有者が変わっていたログファイルでした
PHPを動かす仕組みには、エラーを書き出すログファイルがあります。そのファイルの所有者が、2025年11月21日から変わっていました。書き込む権限を持たない状態です。
書けなくなったエラーは、消えるわけではありません。行き場を失って、Webサーバーとのあいだの通信路へ流れ込みます。
その通信路は、本来ページの中身を運ぶためのものです。エラーが大量に流れ込んだとき、長さ0のデータが混ざります。受け取ったWebサーバーは、それを「本文が空」として扱いました。
これが、真っ白の正体でした。
設定を1行足して、エラーをこの通信路へ流さないようにしました。反映後、5回続けて正常な応答を確認しています。
直りましたが、なぜ半年出なかったのかは分かっていません
所有者が変わったのは2025年11月21日です。症状が出はじめたのは2026年6月でした。あいだの半年、同じ状態で動いています。
条件がいつ揃うのかは、まだ分かっていません。エラーの量が一定を超えたときなのか、別の要因が重なったときなのか。ここは測っていないので、推測を書かないでおきます。
ここまでの調査と修正は、保守の範囲内で対応しています。
同じように真っ白になる症状が出ているなら、確かめる順番があります。
まず、PHPまで到達しているかを見ます。ブラウザの検証ツールを開き、応答のヘッダを確認してください。PHPで動くサイトなら、正常なときには実行環境を示すヘッダが付きます。真っ白のときにそれが消えているなら、プログラムは実行されていません。中身を直しても解決しない、ということです。
次に、サーバーのログが正常に書けているかを確認します。書き込めていないログがあれば、そこが起点になっている可能性があります。
そこから先で行き詰まったときは、お問い合わせからご相談ください。現状を測るところからお受けしています。