UbuntuにVarnishを導入してWebサイトを高速化する方法

サーバー構築

この記事のポイント

  • Ubuntu 24.04 LTS に apt install varnish 一発でインストールできます(Varnish 7.1.1)
  • 動的コンテンツをVarnishでキャッシュすると、実測でスループットが最大約169倍向上しました(15 RPS → 2,592 RPS)
  • VCLという設定ファイルを編集することで、どのURLをキャッシュするかを細かくコントロールできます
  • curl -IX-Cache: HIT が返ればキャッシュが正しく動いている証拠です

「サイトが遅くなってきた」「nginxをリバースプロキシにしているけど、もっと速くしたい」という方に向けて、Varnish Cacheの導入方法を解説します。

VarnishはHTTPキャッシュリバースプロキシ(Webアクセラレータとも呼ばれます)で、バックエンドのWebサーバーの前に置くだけで、同じページへの2回目以降のリクエストをキャッシュから高速返却してくれます。

本記事では実際にDockerコンテナ上のUbuntu 24.04でVarnishをインストールし、ApacheBenchで計測した実測データをもとに解説します。

注意

本記事のコマンドはUbuntu 24.04 LTS(Docker公式イメージ ubuntu:24.04)で実測しています。バージョンが異なるとパッケージ版数が変わる場合があります。

目次

  1. Varnishとは:HTTPキャッシュリバースプロキシの仕組み
  2. 前提環境・構成
  3. Varnishをapt installでインストールする
  4. VCL設定ファイルを編集する(nginx連携)
  5. systemdで起動・自動起動を設定する
  6. 動作確認:curl -Iでキャッシュをチェック
  7. パフォーマンス実測:Varnishなし vs あり
  8. ポート番号の変更方法(80番ポートで使う)
  9. よくあるエラーと解決策
  10. まとめ

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が含まれています。まずパッケージリストを更新してからインストールします。




ubuntu@linuxlab: ~
$ sudo apt update
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) …
Varnish apt インストールログ(Ubuntu 24.04 LTS 実測)
Varnish apt インストールログ(Ubuntu 24.04 LTS 実測)

インストールが完了したら、バージョンを確認しましょう。




ubuntu@linuxlab: ~
$ varnishd -V
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バージョン比較(実測)
Ubuntu 22.04 vs 24.04 Varnishバージョン比較(実測)

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 です。

まず現在のファイルを確認してみましょう。




ubuntu@linuxlab: ~
$ cat /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ヘッダーでキャッシュ状態を確認できる設定です。




ubuntu@linuxlab: ~
$ sudo nano /etc/varnish/default.vcl

以下の内容に書き換えます(nginxが80番ポートで動作している場合):




/etc/varnish/default.vcl
vcl 4.1;

# バックエンドサーバー(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”;
}
}
Varnish VCL設定ファイル(nginx バックエンド用)
Varnish VCL設定ファイル(nginx バックエンド用)
著者アイコン
著者アイコン

unset req.http.Cookie; の行、最初は「Cookieを消したら大丈夫か?」と心配になりますよね。これはあくまでVarnishがキャッシュ判定するときにCookieを見ないようにするだけで、バックエンドへのリクエストには影響しません。ログインが必要なページはそもそも return(pass); で除外するのが正解です。

手順2:VCLの構文チェックをする

VCLファイルを編集したら、構文エラーがないかチェックしてからサービスを再起動するのが安全です。




ubuntu@linuxlab: ~
$ sudo varnishd -C -f /etc/varnish/default.vcl
VCL compiled.

VCL compiled. と表示されれば構文は問題ありません。エラーが出た場合は行番号が表示されるので、その行を確認してください。

systemdで起動・自動起動を設定する

Varnishはsystemdのサービスとして管理します。インストール直後は自動起動が設定されていないため、手動で有効化します。




ubuntu@linuxlab: ~
$ sudo systemctl start varnish
$ 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行を確認すると、デフォルトの起動オプションがわかります。




ubuntu@linuxlab: ~
$ cat /lib/systemd/system/varnish.service | grep -A6 ‘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 ヘッダーを確認します。




ubuntu@linuxlab: ~
# 1回目のリクエスト(バックエンドから取得 = MISS)
$ 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 ← キャッシュから即返却!
Varnish キャッシュHIT確認(curl -I による実測)
Varnish キャッシュHIT確認(curl -I による実測)

見るべきポイントは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倍
Varnishキャッシュあり・なし スループット比較(実測)
Varnishキャッシュあり・なし スループット比較(実測)

結果は衝撃的で、スループットが約169倍(15 RPS → 2,592 RPS)に向上しました。レスポンスタイムも652msから3.9msへと約167分の1になっています。

これが「Varnishを入れたら劇的に速くなった」と言われる理由です。バックエンドへのリクエストが1回で済むため、PHPやRailsのサーバーをほぼ休ませることができます。

著者アイコン
著者アイコン

ちなみにnginxが静的ファイルを直接返している場合は、nginxとVarnishで大差はありません(両方とも10,000 RPS超)。Varnishが特に効くのは「動的コンテンツ(PHP、Ruby、Python等)をキャッシュする」ときです。WordPressのようなCMSと組み合わせると効果が絶大です。

ポート番号の変更方法(80番ポートで使う)

本番環境ではVarnishを80番ポートで待ち受けて、nginxを別のポート(例:8080)に移動させる構成がよく使われます。この場合はsystemdのOverrideファイルを使います。

注意:systemdのサービスファイルは直接編集しない

/lib/systemd/system/varnish.service を直接編集するとパッケージ更新時に上書きされます。代わりに override.conf を使いましょう。




ubuntu@linuxlab: ~
# systemdの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」エラー




ubuntu@linuxlab: ~
Error: bind() on :6081 failed with error 98 (Address already in use)

ポート6081が別のプロセスに使われています。




ubuntu@linuxlab: ~
# どのプロセスが使っているか確認
$ 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」エラー




ubuntu@linuxlab: ~
Error: VCL compilation error at /etc/varnish/default.vcl line 12

VCLファイルの構文エラーです。サービスを再起動する前に必ず構文チェックを行いましょう。




ubuntu@linuxlab: ~
$ sudo varnishd -C -f /etc/varnish/default.vcl
VCL compiled. ← これが出れば問題なし

③キャッシュが効いていない(常にMISS)

常に X-Cache: MISS が返る場合、よくある原因は:

  • Cookieが含まれている:ブラウザのCookieがあるとVarnishはデフォルトでキャッシュをスキップします。vcl_recvunset req.http.Cookie; を追加しましょう
  • Authorization ヘッダーがある:認証情報があるリクエストもデフォルトでスキップされます
  • Set-CookieをバックエンドがレスポンスしてているLvcl_backend_responseunset beresp.http.Set-Cookie; を追加します



ubuntu@linuxlab: ~
# キャッシュのHIT/MISS統計を確認
$ 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 -IX-Cache: HIT でキャッシュが効いているか確認できます
  • 動的コンテンツをキャッシュした場合、実測でスループットが約169倍(15 RPS → 2,592 RPS)向上しました

Varnishを使うと劇的にパフォーマンスが上がります。ただし、ログインが必要なページや管理画面はキャッシュさせないようVCLで制御することが重要です。WordPressと組み合わせる場合は、管理画面URL(/wp-admin/)をキャッシュ除外するルールを追加しましょう。

VPSでサーバーを運用している方は、Varnishの導入を検討してみてください。特にアクセスが多い時間帯のCPU使用率が大きく下がります。

コメント

タイトルとURLをコピーしました