ウェブサイトキャッシュ&サーバー内部キャッシュ:WordPressでキャッシュが動く仕組み

公正取引委員会の広告文 Ver 3.1
公正取引委員会の広告文 Ver 3.2(モバイル専用)

このサイトを運営するサーバーでウェブサイトキャッシュとサーバー内部キャッシュを確認したところ、WordPressのページリクエストはブラウザからCDN・ページキャッシュ・OPcache・Redisの順に下りていき、コピーがある層で止まりました。オリジンサーバーへ直接来たページリクエストは、nginxがWP Rocketの作ったHTMLファイルをそのまま返し、PHPとデータベースまで下りませんでした。

Ⅰ. WordPressのキャッシュ構造

コンピューターにおけるキャッシュは、一時的なデータに素早くアクセスできるよう一時保存する技術で、ウェブでも同じ原理で動き、パフォーマンス向上に大きく貢献します。

キャッシングはデータを保存しておくことで、訪問者がウェブサイトにアクセスするたびにサーバーへ新しく要求せず、保存したデータを素早く読み込んでページの読み込み時間を短縮します。これによりサーバー負荷を減らし、ユーザー体験を改善できます。

WordPressのリクエストに使われるキャッシュは、ウェブサイトキャッシュとサーバー内部キャッシュの2系統です。 HTTPキャッシュ標準は、訪問者一人のブラウザにだけ保存されるキャッシュをprivate cache、複数の訪問者が共有するCDN・プロキシキャッシュをshared cacheに分けており、この記事ではこの2つをウェブサイトキャッシュとしてまとめました。

ページキャッシュとOPcache、オブジェクトキャッシュは、サーバーの中でWordPressが実行される過程に付くキャッシュです。HTTP標準には別の分類がなく、 WordPress公式ドキュメントが、キャッシュプラグイン(ページキャッシュ)・オブジェクトキャッシュ・サーバーキャッシュ(OPcacheのようなopcodeキャッシュ)に分けて説明しています。

🗂️ WordPressのリクエストが通るキャッシュ
├─ 🌐 ウェブサイトキャッシュHTTPキャッシュ・MDNの分類
│ ├─ private cacheブラウザキャッシュ
│ └─ shared cache
│ ├─ proxy cache会社・通信事業者ネットワークのプロキシ
│ └─ managed cacheCDN・リバースプロキシ(Varnish)
└─ 🖥️ サーバー内部キャッシュWordPress公式ドキュメントの分類
├─ ページキャッシュキャッシュプラグインが作った静的HTML(WP Rocket)
├─ OPcacheopcodeキャッシュ・PHP実行
└─ オブジェクトキャッシュリクエストが終わっても残るデータ(Redis)

キャッシュが使われる分野の全体は キャッシュ:定義とキャッシングが使われるすべての分野 の記事に、キャッシュを含むパフォーマンス最適化の4つの系統は ウェブパフォーマンス最適化:構造と定義 の記事にまとめました。

下のシミュレーターで左のツリーからキャッシュを選んでチップを押すと、リクエストがどの層で止まるかを確認できます。WordPressの運営者がキャッシュプラグインで最初に有効にする層はページキャッシュです。

🧭 キャッシュ層シミュレーター説明用
🗂️ WordPressのリクエストが通るキャッシュ
🧰 リクエストの種類
ブラウザキャッシュ
訪問者のブラウザに保存されるHTTPキャッシュです。[画像・CSS]で[初回訪問] → [再訪問]を押すと、2回目からはサーバーへリクエストが送られません。
HTTPキャッシュヘッダー
サーバーがブラウザとCDNに保存期間を伝えるルールです。応答記録のヘッダー行は、Nginx + Apache構成のサーバーから受け取った実際の値です。
CDN・プロキシキャッシュ
複数の訪問者が共有するコピーです。[CDNを使う]をオンにして[初回訪問] → [再訪問]を押すと、エッジで応答が終わります。
ページキャッシュ
PHPが作ったHTMLをファイルとして保存しておきます。[再訪問]を押すと、PHPとデータベースまで下りません。
OPcache
コンパイル済みのPHPバイトコードをメモリに置きます。[記事を修正した後に訪問]ではPHPは再び実行されますが、コンパイルは省かれます。
オブジェクトキャッシュ
クエリ結果をRedisに保存します。[記事を修正した後に訪問]では、変わった記事のデータだけをMariaDBから読み直します。
全体の流れ
リクエストは上から下へ下りていき、コピーがある最初の層で止まります。
層保存場所保存するものNginx + Apache構成の例
ブラウザキャッシュ訪問者の端末HTML・CSS・JS・画像・フォントCSS・画像 7日
CDN・プロキシキャッシュサーバーの前段(エッジ・リバースプロキシ)ページ・静的ファイルのコピーBunny CDN
ページキャッシュサーバーのディスク・メモリPHPが作ったHTMLWP Rocket + nginx
OPcacheサーバーメモリPHPバイトコードPHP 8.3、JITオフ
オブジェクトキャッシュサーバーメモリクエリ結果・オブジェクトRedis
ブラウザの中だけで動く説明用シミュレーターです。応答記録のヘッダー行は2026年10月10日にNginx + Apache構成のサーバーから受け取った値で、修正後のETagのように括弧で書いた値は例です。

Ⅱ. ウェブサイトキャッシュ

ウェブサイトキャッシュは、サーバーが応答ヘッダーで保存方法を伝えると、訪問者のブラウザとCDN・プロキシがその指示どおりにコピーを保存するキャッシュです。代表的なヘッダーは[Cache-Control]・[ETag]・[Expires]で、保存期間が過ぎると条件付きリクエスト([304 Not Modified])で変更されたかを確認します。

1️⃣ ブラウザキャッシュ

ブラウザキャッシュは訪問者のウェブブラウザに保存されるHTTPキャッシュで、HTML・CSS・JavaScript・画像・フォントを保存しておき、同じリソースを再びリクエストするときはサーバーまで行かないか、変更されたかだけを確認します。

保存期間は訪問者ではなくサーバーが決めます。下のNginx + Apache構成のサーバーはCSSと画像に7日を指示し、HTMLページは期間なしで、再訪問のたびに確認するように応答します。

📨 応答ヘッダーの実測Nginx + Apache構成・2026-10-10
💻 訪問者のコンピューターブラウザキャッシュ
──────▶① 最初のリクエストGET /style.css
🖥️ ウェブサイトのサーバーNginx + Apache
💻 訪問者のコンピューターブラウザキャッシュ
◀──────② ファイル+保存の指示cache-control: max-age=604800
🖥️ ウェブサイトのサーバーNginx + Apache
③ ブラウザは指示どおり7日間保存し、その間に再訪問してもサーバーへリクエストを送りません。
💻 訪問者のコンピューターブラウザキャッシュ
──────▶④ 期限が過ぎた後に確認If-None-Match: "6ab12775-2ee8"
🖥️ ウェブサイトのサーバーNginx + Apache
💻 訪問者のコンピューターブラウザキャッシュ
◀──────⑤ 変更なしHTTP/2 304(本文なし)
🖥️ ウェブサイトのサーバーNginx + Apache
🖼️ CSS・画像
cache-control: max-age=604800
expires: Sat, 17 Oct 2026 03:21:00 GMT
etag: "6ab12775-2ee8"
ブラウザが 7日 間、サーバーに再び問い合わせず保存したコピーを使います。
📄 HTMLページ
etag: "6ac9298c-95575"
last-modified: Fri, 09 Oct 2026 17:51:08 GMT
保存期間の指示がないため、再訪問するとまずETagで変更されたかを問い合わせます。
同じETagで再リクエストすると、サーバーは本文なしで [HTTP/2 304]だけを返し、ブラウザは保存済みのコピーをそのまま使います。

2️⃣ CDN・プロキシキャッシュ

CDN・プロキシキャッシュは、訪問者とオリジンサーバーの間で複数の訪問者が共有するキャッシュです。フォワードプロキシは企業ネットワークのように訪問者側の前段で、リバースプロキシとCDNはサーバーの前段で、オリジンサーバーの代わりに保存したコピーで応答します。

代表的なリバースプロキシは Varnish Cacheで、Bunny CDN・AkamaiのようなCDNも同じ構造です。地域別DNSを使えば、オリジンサーバーがある地域の訪問者はオリジンサーバーへ直接つなぎ、ほかの地域の訪問者には近くのCDNエッジ(例:Bunny CDN)がHTMLまで保存して応答するように分けられます。

👤 オリジンサーバーの地域の訪問者DNSがオリジンのアドレスを返す
→
🖥️ オリジンサーバーCDNを通さず直接応答します。
👤 ほかの地域の訪問者DNSが近くのエッジのアドレスを返す
→
☁️ Bunny CDNエッジHTML・ファイルのコピーがあればここで応答します。
→
🖥️ オリジンサーバーエッジにコピーがないときだけ行きます。

CDNの構造と利点は CDNとは?CDNを使う理由と5つの利点 の記事にまとめました。

Ⅲ. サーバー内部キャッシュ

サーバー内部キャッシュは、リクエストがオリジンサーバーに届いた後、WordPressがページを作る過程に付くキャッシュです。Nginx + Apacheで構成したサーバーは下の順序でリクエストを処理し、前の段階でコピーが見つかれば後の段階は通りません。

🅐 ページキャッシュにファイルがあるときログインしていない訪問者のページリクエストの大半
① nginxがリクエストを受けるオリジンサーバーに届いたリクエストをウェブサーバーが受けます。
↓
1️⃣ ページキャッシュ ↓② ページキャッシュのファイルで応答WP Rocketが作ったHTMLファイルをnginxがそのまま送ります。x-rocket-nginx-serving-file: HIT
PHP・OPcache・Redis・MariaDBを通らずに終わります。
🅑 ページキャッシュにファイルがないときキャッシュ削除直後の初回訪問・ログイン画面・AJAXリクエスト
① nginxがリクエストを受けるファイルがないのでApacheに渡します。
↓
2️⃣ OPcache ↓② PHP実行・OPcacheWordPressのPHPファイルをコンパイル済みのバイトコードで実行します。
↓
3️⃣ オブジェクトキャッシュ ↓③ オブジェクトキャッシュ(Redis)保存されたクエリ結果・オブジェクトはRedisから取り出します。
↓
④ MariaDBRedisにないデータだけを照会し、よく使うデータはInnoDBバッファプール(メモリ)から読みます。
↓
⑤ 応答・ページキャッシュ保存完成したHTMLを送り、WP Rocketがファイルとして保存するため、次のリクエストは🅐で処理されます。
Nginx + Apache構成が基準(ページキャッシュのファイルがないときだけApache・PHPへ渡す)、2026-10-10確認。

Nginx + Apache構成は、CloudwaysとScalaHostingでオプションとして選べます。Cloudwaysはアプリケーションごとにハイブリッドスタック(Nginx + Apache)とライトニングスタック(Nginxのみ)のどちらかを選び、ScalaHostingはSPanelでApacheの前にNginxを置く設定をオンにできます。

🖥️ Nginx + Apache構成を選べるホスティング
Cloudwaysアプリケーションごとにスタックを選択
ハイブリッドスタックNginx + Apache
ライトニングスタックNginxのみ
Cloudways →
ScalaHostingSPanelのウェブサーバー設定
デフォルトApache
NginxをオンNginx + Apache
ScalaHosting →
キャッシュ保存するもの保存されるとき
1️⃣ ページキャッシュ完成したHTMLページ🅑 ⑤ 応答するときにWP Rocketがファイルとして
2️⃣ OPcacheコンパイル済みのPHPコード(バイトコード)🅑 ② PHPファイルを最初に実行するとき
3️⃣ オブジェクトキャッシュクエリ結果・オプションのようなデータの断片🅑 ③ WordPressがデータを最初に取り出すとき

1️⃣ ページキャッシュ

  • ↪️ フルページキャッシュ or HTMLキャッシュ

ページキャッシュはフルページキャッシュ(full-page cache)とも呼ばれ、保存するものがHTMLなのでHTMLキャッシュと呼ぶこともあります。PHPが作ったウェブページ全体を静的なHTMLファイルとして保存しておき、同じページのリクエストにはPHPを実行せずにそのファイルを送ります。上の処理順序では🅐の場合です。

保存場所はサーバーのメモリ(RAM)またはディスク(HDD/SSD)で、メモリは速いもののコストが高く容量が限られ、ディスクは容量に余裕がある代わりに比較的遅くなります。

種類例保存・応答の方式
キャッシュプラグインWP Rocket · WP Super Cache · W3 Total Cache · Cache EnablerWordPressがページをHTMLファイルとして保存し、ウェブサーバーがそのファイルを送ります。
ウェブサーバーキャッシュNginx FastCGIキャッシュ・LiteSpeed CacheウェブサーバーがPHPの応答を直接保存し、次のリクエストに送ります。
リバースプロキシキャッシュVarnishウェブサーバーの前に置いたキャッシュサーバーがページを保存して応答します。

Nginx + Apache構成では、WP Rocketが作ったHTMLファイルをnginxが直接読んで送り、応答ヘッダーに[x-rocket-nginx-serving-file: HIT]が付きます。WP Rocketでページキャッシュを有効にして設定する手順は WP Rocket設定ガイド の記事にまとめました。

2️⃣ OPcache

OPcacheはPHPコードをあらかじめコンパイルしたバイトコードをメモリに保存し、同じファイルを再び実行するときにPHPパーサーを通らないようにします。PHP 5.5から標準で含まれており、以前使われていたAPCとXCacheはPHP 7に対応していないため、今は使われていません。上の処理順序では🅑の②段階にあたります。

種類状態説明
Zend OPcachePHP 5.5から標準で含まれる今使われている標準のopcodeキャッシュで、[opcache.enable=1]で有効にします。
OPcache JITPHP 8からOPcacheに含まれるバイトコードをもう一度機械語に変えて実行し、[opcache.jit]でオン・オフします。
APC開発終了OPcache以前に使われていたopcodeキャッシュで、データキャッシュ機能はAPCuに引き継がれました。
XCache開発終了PHP 7に対応していません。
WinCacheWindows(IIS)サーバー用WordPress公式ドキュメントがOPcacheと並べて挙げるopcodeキャッシュです。

OPcacheはPHP設定[opcache.enable=1]で有効にし、PHP 8以降に入ったJITは[opcache.jit=disable]で別にオフにできます。インストールと設定は Zend OPcacheの概念とインストールおよび設定 の記事にあります。

3️⃣ オブジェクトキャッシュ

オブジェクトキャッシュは、データベースのクエリ結果や計算したオブジェクトをRedis・Memcachedのようなメモリストアに保存します。WordPressは標準では1回のリクエストの中だけでオブジェクトを覚えており、Redisのようなストアをつなぐと、リクエストが終わった後も結果が残ります。上の処理順序では🅑の③段階にあたります。

種類区分リクエスト終了後も残るか説明
WP_Object_CacheWordPress標準いいえ1回のリクエストの中だけで覚える内蔵キャッシュです。
Redisオブジェクトキャッシュはい別のメモリストアで、Redis Object Cacheプラグインのドロップインでつなぎます。
Memcachedオブジェクトキャッシュはい別のメモリストアです。
APCuオブジェクトキャッシュはい(同じサーバー内)PHPが使う共有メモリに保存します。
ファイルオブジェクトキャッシュはいディスクにファイルとして保存します。
InnoDBバッファプールデータベース自体のキャッシュ・オブジェクトキャッシュではないはいMySQL・MariaDBがテーブルデータとインデックスをメモリに載せておきます。
クエリキャッシュデータベース自体のキャッシュ・オブジェクトキャッシュではない—MySQL 8.0で削除され、MariaDBには残っていますが標準ではオフです。

WordPressは、Redis Object Cacheプラグインが入れるドロップインファイル([object-cache.php])でRedisにつなぎます。インストール手順は WordPressのRedisキャッシュのインストールと設定 の記事にあります。

🔢 FAQ & おすすめコンテンツ

ページキャッシュやCDNに残った古いコピーが応答している場合です。キャッシュプラグインでその記事のキャッシュを削除し、CDNを使っているならCDNのコピーも一緒に削除します。

WP Rocketのようなページキャッシュプラグインは、初期設定ではログインしたユーザーに保存済みのページを送りません。管理画面とログイン状態のページは毎回PHPが新しく作り、このときはOPcacheとオブジェクトキャッシュが速度を支えます。

Chromeで[Ctrl+Shift+R](Macは[Cmd+Shift+R])を押すと、今のページをキャッシュなしで再読み込みします。保存されたキャッシュ全体は、右上の[その他] → [閲覧履歴データを削除]で[キャッシュされた画像とファイル]を選んで削除します。

💾 キャッシュ関連の記事 記事 10
🗂️ キャッシュ
📋 キャッシュ:定義とすべての分野 📄 ウェブサイトキャッシュ&サーバー内部キャッシュ
📋 WP Rocket設定ガイド 📝 Zend OPcache 📝 Redis Cache 설치
📝 CDN이란? 📝 Varnish Cache
📋 WP Rocketの速度テスト 📝 속도 개선 사례 📝 캐시 · 최적화 플러그인

ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

人間であることを証明してください: 4   +   10   =