最も厄介な障害の一種:サーバーは常に 200 を返しているが、ページは常にエラーを報告しています。
当社のバックエンドスクリプトは nginx のため、 expires 7d ブラウザが 7 日間キャッシュしており、スクリプトの改版後もブラウザは旧バージョンを実行し続け、新しいデータ形式をレンダリング時にクラッシュしました。コードはすべての例外を「サーバーから読み込めない」と報告していたため、長時間サーバーを調査しましたが、実際にはサーバーは常に正常でした。このツールはファイルタイプ別に相互干渉しないキャッシュ戦略を生成し、レスポンスヘッダー自己診断スクリプトも提供します。
—
—
| 現象 | 真犯人 | どう確認するか |
|---|---|---|
| CSS / JS を変更したにもかかわらず、本番環境で「変更が反映されていないように見える」 | 長期間キャッシュ + 参照先にバージョン番号が付与されていない | curl -I max-age を確認してください。新しいバージョン番号で再デプロイします。 |
| サーバーのログはすべて200ですが、ページには「データを読み込めません」と表示されます。 | ブラウザが古いスクリプトを実行し、新しいデータ形式をレンダリングしようとしてクラッシュし、catch によりネットワーク障害と誤って報告されます。 | コンソールでエラー行を確認し、スクリプトの no-cache を設定した後に Ctrl+F5 を押します。 |
| 一部のページは新しいが、他のページは古いままです | 同じCSSが複数のページから参照されているが、そのうちいくつかのページのみバージョン番号を変更しました。 | サイト全体で該当リソース名を検索し、一括でバージョンを上げます |
| バックエンドで変更した後、数日待たないと反映されません | バックエンドページは長期間キャッシュされるように設定されています | バックエンドは一律 no-store |
| データが常に最も古い状態のまま | データインターフェースが CDN やブラウザによってキャッシュされます。 | APIインターフェースはno-store;fetchにはタイムスタンプパラメーターを付与 |
| ローカルの curl では正常に動作するが、ユーザーのブラウザでは動作しない | CDN のレイヤーで依然として古いバージョンがキャッシュされています | 使用 -H 'Cache-Control: no-cache' 比較し、CDN コントロールパネルで更新します |
1・サーバーは 200 を返すが、ページでエラーが発生します。バックグラウンドスクリプトが expires 7d キャッシュにより、改版後にブラウザが依然として古いスクリプトを実行し、その古いスクリプトが新しいデータ形式をパースする際にクラッシュします。また、catch がレンダリング例外を「サーバーから読み込めない」と誤って報告するため、トラブルシューティングの方向性が完全にずれます。
2・対策:バックエンドスクリプトを個別にno-cacheに設定します。location = /assets/js/admin.js { add_header Cache-Control "no-cache"; }— 精確一致(location =)は、静的リソース向けの正規表現による長期間キャッシュルールを上書きします。
3・エラーメッセージは分岐処理が必要です。「データは到達したがレンダリングがクラッシュ」および「ネットワーク要求が失敗」は、必ず別々のメッセージとして報告してください。そうでないと、トラブルシューティングの方向性が2日間もずれます。
4・シンプルなルール:1つだけ覚えれば十分です。長期間キャッシュを設定する場合は必ずバージョン番号を含める必要があります。バージョン番号なしのリソースは一切長期間キャッシュしてはいけません。