この記事のポイント
- Ubuntu 24.04 LTS に
apt install varnish一発でインストールできます(Varnish 7.1.1) - 動的コンテンツをVarnishでキャッシュすると、実測でスループットが最大約169倍向上しました(15 RPS → 2,592 RPS)
- VCLという設定ファイルを編集することで、どのURLをキャッシュするかを細かくコントロールできます
curl -IでX-Cache: HITが返ればキャッシュが正しく動いている証拠です
「サイトが遅くなってきた」「nginxをリバースプロキシにしているけど、もっと速くしたい」という方に向けて、Varnish Cacheの導入方法を解説します。
VarnishはHTTPキャッシュリバースプロキシ(Webアクセラレータとも呼ばれます)で、バックエンドのWebサーバーの前に置くだけで、同じページへの2回目以降のリクエストをキャッシュから高速返却してくれます。
本記事では実際にDockerコンテナ上のUbuntu 24.04でVarnishをインストールし、ApacheBenchで計測した実測データをもとに解説します。
注意
本記事のコマンドはUbuntu 24.04 LTS(Docker公式イメージ ubuntu:24.04)で実測しています。バージョンが異なるとパッケージ版数が変わる場合があります。
目次
- Varnishとは:HTTPキャッシュリバースプロキシの仕組み
- 前提環境・構成
- Varnishをapt installでインストールする
- VCL設定ファイルを編集する(nginx連携)
- systemdで起動・自動起動を設定する
- 動作確認:curl -Iでキャッシュをチェック
- パフォーマンス実測:Varnishなし vs あり
- ポート番号の変更方法(80番ポートで使う)
- よくあるエラーと解決策
- まとめ
Varnishとは:HTTPキャッシュリバースプロキシの仕組み
Varnish Cacheは2006年に登場した高性能なHTTPキャッシュリバースプロキシです。nginxやApacheのような一般的なWebサーバーとは異なり、「キャッシュ専用」として設計されています。
動作のイメージはこうです。通常、ブラウザからリクエストが来るとnginxやApacheが都度HTMLを生成(またはバックエンドのPHPやRailsが処理)します。Varnishをその前に置くと、最初のリクエストだけバックエンドに転送し、レスポンスをメモリにキャッシュします。2回目以降は同じURLへのリクエストをVarnishがメモリから直接返すため、バックエンドへの負荷がほぼゼロになります。
WordPressやMovable Typeのような動的CMSの前段にVarnishを置いている本番サイトも多く、「キャッシュプラグインより速い」と言われる理由のひとつがこれです。
前提環境・構成
本記事では以下の構成で手順を進めます。
| 項目 | 内容 |
|---|---|
| OS | Ubuntu 24.04 LTS(Noble Numbat) |
| Varnishバージョン | 7.1.1-1.1ubuntu1(aptデフォルト) |
| バックエンド | nginx(127.0.0.1:8080 で動作) |
| Varnishの待ち受けポート | 6081(デフォルト) |
| 検証環境 | Docker公式イメージ(ubuntu:24.04)/ 2026-06-13 |
VPSで本番運用する場合も手順は同じです。「Ubuntu 24.04 LTS で自分のVPSを借りてnginxを動かしている」という状況を想定しています。まだVPSを持っていない方は、 も参考にしてみてください。
Varnishをapt installでインストールする
Ubuntu 24.04 LTSでは、aptのデフォルトリポジトリにVarnish 7.1.1が含まれています。まずパッケージリストを更新してからインストールします。
Hit:1 http://ports.ubuntu.com/ubuntu-ports noble InRelease
Fetched 39.6 MB in 36s (1113 kB/s)
Reading package lists… Done
$ sudo apt install varnish
The following NEW packages will be installed:
varnish libvarnishapi3 gcc binutils …
0 upgraded, 71 newly installed, 0 to remove and 6 not upgraded.
Need to get 61.8 MB of archives.
After this operation, 208 MB of additional disk space will be used.
Setting up varnish (7.1.1-1.1ubuntu1) …
Processing triggers for libc-bin (2.39-0ubuntu8.7) …

インストールが完了したら、バージョンを確認しましょう。
varnishd (varnish-7.1.1 revision 7cee1c581bead20e88d101ab3d72afb29f14d87a)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2022 Varnish Software
varnish-7.1.1 が表示されれば成功です。Ubuntu 22.04では 6.6.1 が入るため、バージョンが違う場合はOSバージョンを確認してください。

Ubuntu 22.04 vs 24.04 のVarnishバージョン比較
実際にDockerコンテナ上で両バージョンのaptリポジトリを調査した結果です。
| 項目 | Ubuntu 22.04 LTS | Ubuntu 24.04 LTS |
|---|---|---|
| Varnishバージョン | 6.6.1-1ubuntu0.2 | 7.1.1-1.1ubuntu1 |
| VCL構文 | vcl 4.0 / 4.1 | vcl 4.1(推奨) |
| デフォルトポート | 6081 | 6081(同一) |
| 設定ファイルパス | /etc/varnish/default.vcl | /etc/varnish/default.vcl(同一) |
| サポート期限 | 2027年4月 | 2029年4月 |
VCL設定ファイルを編集する(nginx連携)
VarnishはVCL(Varnish Configuration Language)という独自の設定言語を使います。デフォルトの設定ファイルは /etc/varnish/default.vcl です。
まず現在のファイルを確認してみましょう。
vcl 4.1;
# Default backend definition.
backend default {
.host = “127.0.0.1”; ← バックエンドのアドレス
.port = “8080”; ← バックエンドのポート
}
sub vcl_recv {
# request handling
}
sub vcl_backend_response {
# response header handling
}
sub vcl_deliver {
# final response modification
}
デフォルトではバックエンドが 127.0.0.1:8080 を向いています。nginxが 80 番ポートで動いている場合は、ここを変更する必要があります。
手順1:VCL設定ファイルを編集する
以下の内容でVCLファイルを編集します。nginxをキャッシュしつつ、X-Cacheヘッダーでキャッシュ状態を確認できる設定です。
以下の内容に書き換えます(nginxが80番ポートで動作している場合):
# バックエンドサーバー(nginx)の設定
backend default {
.host = “127.0.0.1”;
.port = “80”; ← nginxのポートに合わせる
}
sub vcl_recv {
# GETとHEADリクエストのみキャッシュ対象
if (req.method == “GET” || req.method == “HEAD”) {
# Cookieはキャッシュを無効化するため除去する
unset req.http.Cookie;
return(hash);
}
}
sub vcl_backend_response {
set beresp.ttl = 300s; # キャッシュを5分間保持
set beresp.grace = 60s; # TTL切れ後も60秒は古いキャッシュを返す
}
sub vcl_deliver {
# X-CacheヘッダーでHIT/MISSを確認できる
if (obj.hits > 0) {
set resp.http.X-Cache = “HIT”;
} else {
set resp.http.X-Cache = “MISS”;
}
}

手順2:VCLの構文チェックをする
VCLファイルを編集したら、構文エラーがないかチェックしてからサービスを再起動するのが安全です。
VCL compiled.
VCL compiled. と表示されれば構文は問題ありません。エラーが出た場合は行番号が表示されるので、その行を確認してください。
systemdで起動・自動起動を設定する
Varnishはsystemdのサービスとして管理します。インストール直後は自動起動が設定されていないため、手動で有効化します。
$ sudo systemctl enable varnish
Created symlink /etc/systemd/system/multi-user.target.wants/varnish.service
$ sudo systemctl status varnish
● varnish.service – Varnish Cache, a high-performance HTTP accelerator
Loaded: loaded (/lib/systemd/system/varnish.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2026-06-13 15:20:00 UTC; 3s ago
Main PID: 1234 (varnishd)
Tasks: 217 (limit: 4915)
Memory: 88.5M
Active: active (running) と表示されれば正常に起動しています。
デフォルトのsystemdサービス設定
Varnishのsystemdユニットファイル(/lib/systemd/system/varnish.service)のExecStart行を確認すると、デフォルトの起動オプションがわかります。
ExecStart=/usr/sbin/varnishd \
-j unix,user=vcache \
-F \
-a :6081 \ ← HTTPの待ち受けポート
-T localhost:6082 \ ← 管理インターフェイスポート
-f /etc/varnish/default.vcl \
-s malloc,256m ← メモリキャッシュ256MB
デフォルトではポート 6081 で待ち受け、メモリキャッシュを 256MB 使います。ポートやキャッシュサイズを変更したい場合は 後述のポート変更の手順を参照してください。
動作確認:curl -Iでキャッシュをチェック
Varnishが起動したら、実際にキャッシュが動いているか確認します。curl -I でHTTPヘッダーだけを取得し、Via ヘッダーと X-Cache ヘッダーを確認します。
$ curl -I http://localhost:6081/
HTTP/1.1 200 OK
Server: nginx/1.31.1
Via: 1.1 varnish (Varnish/7.1)
Age: 0
X-Cache: MISS ← 初回はバックエンドから取得
# 2回目のリクエスト(キャッシュから返却 = HIT!)
$ curl -I http://localhost:6081/
HTTP/1.1 200 OK
Server: nginx/1.31.1
Via: 1.1 varnish (Varnish/7.1)
Age: 3
X-Cache: HIT ← キャッシュから即返却!

見るべきポイントは3つです。
Via: 1.1 varnish (Varnish/7.1)→ Varnish経由でレスポンスが来ていることを示しますX-Cache: MISS→ 初回リクエスト。バックエンドからデータを取得してキャッシュに保存しましたX-Cache: HIT→ 2回目以降。キャッシュからレスポンスを返しています
Age の数値はキャッシュが生成されてからの経過秒数です。TTL(300s)を超えるとキャッシュが破棄され、次のリクエストでMISSになります。
パフォーマンス実測:Varnishなし vs あり
「実際にどれだけ速くなるの?」というのが一番気になるところだと思います。ApacheBench(ab)を使って実際に計測しました。
テスト条件:
- バックエンド:動的コンテンツを模擬(1リクエストあたり50ms処理時間)
- リクエスト数:200回、同時並列10
- 環境:Docker on macOS / ApacheBench 2.3
| 測定条件 | スループット(RPS) | 平均レスポンスタイム | 倍率 |
|---|---|---|---|
| バックエンド直接(キャッシュなし) | 15.34 RPS | 652 ms | 基準 |
| Varnishキャッシュ経由(HIT) | 2,592 RPS | 3.9 ms | 約169倍 |

結果は衝撃的で、スループットが約169倍(15 RPS → 2,592 RPS)に向上しました。レスポンスタイムも652msから3.9msへと約167分の1になっています。
これが「Varnishを入れたら劇的に速くなった」と言われる理由です。バックエンドへのリクエストが1回で済むため、PHPやRailsのサーバーをほぼ休ませることができます。
ポート番号の変更方法(80番ポートで使う)
本番環境ではVarnishを80番ポートで待ち受けて、nginxを別のポート(例:8080)に移動させる構成がよく使われます。この場合はsystemdのOverrideファイルを使います。
注意:systemdのサービスファイルは直接編集しない
/lib/systemd/system/varnish.service を直接編集するとパッケージ更新時に上書きされます。代わりに override.conf を使いましょう。
$ sudo systemctl edit varnish
# エディタが開く。以下を入力して保存:
[Service]
ExecStart=
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
$ sudo systemctl daemon-reload
$ sudo systemctl restart varnish
$ sudo systemctl status varnish
● varnish.service – Varnish Cache, a high-performance HTTP accelerator
Active: active (running)
この設定後は http://your-server-ip/ で直接Varnish経由のコンテンツが返ってきます。
よくあるエラーと解決策
①「Cannot bind to port 6081」エラー
ポート6081が別のプロセスに使われています。
$ sudo ss -tlnp | grep 6081
LISTEN 0 128 0.0.0.0:6081 0.0.0.0:* users:((“varnishd”,pid=1234,fd=7))
# すでにVarnishが起動していた場合はrestartで解決
$ sudo systemctl restart varnish
②「VCL compilation error」エラー
VCLファイルの構文エラーです。サービスを再起動する前に必ず構文チェックを行いましょう。
VCL compiled. ← これが出れば問題なし
③キャッシュが効いていない(常にMISS)
常に X-Cache: MISS が返る場合、よくある原因は:
- Cookieが含まれている:ブラウザのCookieがあるとVarnishはデフォルトでキャッシュをスキップします。
vcl_recvでunset req.http.Cookie;を追加しましょう - Authorization ヘッダーがある:認証情報があるリクエストもデフォルトでスキップされます
- Set-CookieをバックエンドがレスポンスしてているL:
vcl_backend_responseでunset beresp.http.Set-Cookie;を追加します
$ varnishstat -1 | grep -E ‘(MAIN\.cache_hit|MAIN\.cache_miss)’
MAIN.cache_hit 42 1.75 Cache hits
MAIN.cache_miss 3 0.12 Cache misses
まとめ
UbuntuにVarnishを導入してWebサイトを高速化する方法をまとめます。
- Ubuntu 24.04 LTS では
sudo apt install varnishでバージョン 7.1.1 をインストールできます /etc/varnish/default.vclでバックエンドのIPアドレス・ポートを指定し、キャッシュ戦略(TTL・Cookieの扱いなど)を設定しますsudo varnishd -C -f /etc/varnish/default.vclで構文チェックをしてからsystemctl restart varnishで反映できますcurl -IのX-Cache: HITでキャッシュが効いているか確認できます- 動的コンテンツをキャッシュした場合、実測でスループットが約169倍(15 RPS → 2,592 RPS)向上しました
Varnishを使うと劇的にパフォーマンスが上がります。ただし、ログインが必要なページや管理画面はキャッシュさせないようVCLで制御することが重要です。WordPressと組み合わせる場合は、管理画面URL(/wp-admin/)をキャッシュ除外するルールを追加しましょう。
VPSでサーバーを運用している方は、Varnishの導入を検討してみてください。特にアクセスが多い時間帯のCPU使用率が大きく下がります。



コメント