Ubuntu20.04でVarnishCacheServerを使用して静的Webページを高速化する方法
著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Varnish は、バックエンドサーバーからの応答をメモリにキャッシュする汎用性の高いリバースHTTPプロキシであるため、再度要求されたときに迅速に処理されます。 HTTPヘッダーを使用して、特定のリクエストへの応答をキャッシュするかどうかを決定します。 デフォルトでは、Cookieを使用した応答はキャッシュされません。これは、Cookieがクライアント固有の要求と見なされるためです。 ただし、この設定は構成ファイルで変更できます。
キャッシングサーバーとして機能することに加えて、Varnishは次のように使用できます。
- Webアプリケーションファイアウォール
- DDoS攻撃ディフェンダー
- ロードバランサー
- 不安定なバックエンドのクイックフィックス
- HTTPルーター
HTTPキャッシュを保存できる場所は3つあります。
- ブラウザ:このキャッシュはユーザーのブラウザに保存されます。 これはユーザー固有であり、Webサイトにリクエストを送信する代わりにコンテンツを提供するために使用できます。
- プロキシ:プロキシは、ユーザーとサーバーの間に位置する中間サーバーです。 これは通常ISPによって展開され、複数のユーザーによって要求される応答をキャッシュするために使用できます。
- リバースプロキシ:この種のプロキシは、Webサイトの管理者によって作成され、バックエンドサーバーに要求を送信する代わりに、ネットワークのエッジからコンテンツを提供するために使用できます。 これは、このチュートリアルで作成する種類のキャッシュです。
注: HTTPキャッシングの詳細については、このHTTPヘッダーとキャッシング戦略に関するチュートリアルを参照してください。
このチュートリアルでは、Varnishをキャッシングリバースプロキシサーバーとして設定します。 次に、 wrk を使用して、非キャッシュ構成に対してVarnishを使用してセットアップをテストします。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- 2GB以上のRAMを搭載した1台のUbuntu20.04サーバー
- このUbuntu20.04初期サーバーセットアップガイドで説明されているsudo権限を持つ非rootユーザー
ステップ1—VarnishとApacheのインストール
まず、ApacheとVarnishをインストールします。 最初にapt-get
を更新してから、次のコマンドを使用してApacheをインストールします。
- sudo apt-get update
- sudo apt-get install apache2 -y
Apacheがインストールされていることを示す出力が表示されます。
Apacheのインストールプロセスが完了したら、次のコマンドを使用してVarnishをインストールします。
- sudo apt-get install varnish -y
ワニスがインストールされていることを示す出力が表示されます。
次に、両方のパッケージが正しくインストールされていることを確認します。 まず、次のコマンドを使用して、Apacheのステータスを確認します。
- sudo systemctl status apache2
出力は次のようになります。
Outputroot@ubuntu-s-1vcpu-2gb-fra1-01:~# sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-08-04 18:58:39 UTC; 4min 10s ago
Docs: https://httpd.apache.org/docs/2.4/
Main PID: 2279 (apache2)
Tasks: 55 (limit: 2344)
Memory: 5.0M
CGroup: /system.slice/apache2.service
├─2279 /usr/sbin/apache2 -k start
├─2281 /usr/sbin/apache2 -k start
└─2282 /usr/sbin/apache2 -k start
Aug 04 18:58:39 ubuntu-s-1vcpu-2gb-fra1-01 systemd[1]: Starting The Apache HTTP Server...
Aug 04 18:58:39 ubuntu-s-1vcpu-2gb-fra1-01 apachectl[2278]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' di>
Aug 04 18:58:39 ubuntu-s-1vcpu-2gb-fra1-01 systemd[1]: Started The Apache HTTP Server.
Q
キーを押して、status
コマンドを終了します。
次に、次のコマンドでワニスのステータスを確認します。
- sudo systemctl status varnish
出力は次のようになります。
Outputroot@ubuntu-s-1vcpu-2gb-fra1-01:~# sudo systemctl status varnish
● varnish.service - Varnish HTTP accelerator
Loaded: loaded (/lib/systemd/system/varnish.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-08-04 18:59:09 UTC; 4min 41s ago
Docs: https://www.varnish-cache.org/docs/6.1/
man:varnishd
Main PID: 3423 (varnishd)
Tasks: 217 (limit: 2344)
Memory: 10.7M
CGroup: /system.slice/varnish.service
├─3423 /usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
└─3447 /usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
Aug 04 18:59:09 ubuntu-s-1vcpu-2gb-fra1-01 systemd[1]: Started Varnish HTTP accelerator.
Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Debug: Version: varnish-6.2.1 revision 9f8588e4ab785244e06c3446fe09bf9db5dd8753
Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Version: varnish-6.2.1 revision 9f8588e4ab785244e06c3446fe09bf9db5dd8753
Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Debug: Platform: Linux,5.4.0-73-generic,x86_64,-junix,-smalloc,-sdefault,-hcritbit
Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Platform: Linux,5.4.0-73-generic,x86_64,-junix,-smalloc,-sdefault,-hcritbit
Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Debug: Child (3447) Started
Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Child (3447) Started
Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Info: Child (3447) said Child starts
Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Child (3447) said Child starts
両方のサービスが稼働しているのが表示されない場合は、サービスが完全に読み込まれるまで数分待ってから、両方のサービスを実行し続けてください。
Apache2 Varnishがインストールされたので、Varnishに提供するもの、この場合はApacheの静的Webページを提供します。
ステップ2—Apacheの静的Webページを提供するためのVarnishの構成
前のステップでVarnishをインストールし、次にそれを構成する必要があります。 デフォルトでは、Varnishはポート6081でリッスンし、ポート8080でローカルWebサーバーに接続します。 これを変更して、ApacheサーバーからApache静的サイトにサービスを提供します。
まず、Varnishのリスニングポートを8080に変更します。 通常、リスニングポートは80にする必要がありますが、同じサーバーでApacheとVarnishを実行しているため、Varnishにはポート8080を使用し、Apacheにはポート80を使用します。
Varnishのリスニングポートを変更するための構成オプションはないため、コマンドラインを使用して変更します。 /etc/systemd/system/
のvarnish.service.d
という新しいディレクトリにcustomexec.conf
というファイルを作成し、デフォルトのポートを変更します。
mkdir
コマンドを使用して、新しいディレクトリを作成します。
- sudo mkdir /etc/systemd/system/varnish.service.d
お気に入りのテキストエディタを使用して、customexec.conf
という名前の新しいファイルを作成します。
- sudo nano /etc/systemd/system/varnish.service.d/customexec.conf
customexec.conf
に、次のコンテンツを追加します。
/etc/systemd/system/varnish.service.d/customexec.conf file[Service]
ExecStart=
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :8080 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
このファイルでは、Varnish構成のService
セクションを変更しています。 まず、ExecStart
オプションの古い値を削除してから、新しい値を割り当てます。
新しい値は、次のオプションを使用してVarnishを実行するために使用されるバイナリファイルを指定します。
-
-j
:使用するジェイルメカニズムを指定します。 ワニスジェイルは、さまざまなプラットフォーム固有の方法でワニスプロセスの権限を減らすために使用されます。 ここでは、unix
メカニズムとユーザーvcache
を使用して権限を制限しています。 これは、Ubuntuシステムのニスのデフォルトです。 -
-F
:systemd
はメインプロセスが実行を継続し、新しいプロセスをフォークして停止しないことを期待しているため、サーバーをフォアグラウンドで実行する必要があることを示します。 -
-a
:このフラグは、クライアント接続を受け入れるためのIPアドレスとポートを指定するために使用されます。 この場合のIPは空です。これは、サーバーがすべてのIPを受け入れることを意味します。 ポートは8080
に設定されています。 -
-T
:このフラグは、管理インターフェイスのIPアドレスとポートを指定します。この場合はlocalhost
とポート6082
です。 -
-f
:このフラグは、Varnish構成のデフォルトのVCLファイルを指定します。 このチュートリアルの後半でこのファイルを編集して、Apacheサーバーに接続するようにVarnishを構成します。 -
-S
:このフラグは、管理インターフェースへのアクセスを許可するための共有秘密ファイルを指定します。/etc/varnish/secret
の値は、UbuntuのVarnishのデフォルトです。 このチュートリアルでは、シークレットファイルは使用しません。 -
-s
:このフラグは、オブジェクトを保存する場所と方法を示します。 値malloc,256m
は、Vanishのデフォルト値です。 これは、malloc
システムコールと最大サイズ256メガバイトを使用して、さまざまなVarnishオブジェクトをメモリに格納することを意味します。 その他の可能な値は、malloc
が使用できない場合にumem
を使用するdefault
、またはディスク上のファイルにオブジェクトを格納するfile
です。
customexec.conf
ファイルを保存して閉じます。 次に、次のコマンドを実行して、ディスクからsystemd
サービスファイルをリロードします。
- sudo systemctl daemon-reload
次に、変更を有効にするためにVarnishを再起動します。
- sudo systemctl restart varnish
これらの最後の2つのコマンドからの出力は表示されません。 Varnishがポート8080でリッスンしていることを確認するには、netstat
コマンドを使用して、サーバー上のすべてのリッスンしているTCPソケットを表示します。
- sudo netstat -ltnp | grep 8080
次のような出力が表示されます。
Outputtcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 18689/varnishd
tcp6 0 0 :::8080 :::* LISTEN 18689/varnishd
Varnishが実行され、ポート8080をリッスンしているので、/etc/varnish/default.vcl
にあるデフォルトの構成ファイルを編集する必要があります。
- sudo nano /etc/varnish/default.vcl
次に示すように、backend default
ブロックに移動し、.port
を80
に変更します。
default.vcl file
# Default backend definition. Set this to point to your content server.
backend default {
.host = "127.0.0.1";
.port = "80";
}
default.vcl
ファイルを保存して閉じ、次のコマンドでVarnishを再起動します。
- sudo systemctl restart varnish
すべてが正常であれば、出力はありません。 ブラウザでhttp://your_server_ip:8080
を開くと、Varnishを使用して開いたApache静的サイトが表示されます。
これで、ApacheとVarnishが同じドロップレットで一緒に実行され、Apacheがポート80をリッスンし、Varnishがポート8080をリッスンします。 次に、wrkツールを使用して両方のサーバーの応答時間を比較します。
ステップ3—wrkを使用したワニスのテスト
wrk は、最新のHTTPベンチマークツールです。 これはCで記述されており、1秒あたりのリクエスト数が多いテストWebサーバーをロードするために使用できます。 このステップでは、wrkを使用してApacheとVarnishに対してテストを実行し、結果を比較します。
まず、ソースからビルドしてwrkをインストールする必要があります。 ソースからwrkをビルドするために必要な、Cおよびgit用のビルドツールをインストールすることから始めます。
- sudo apt-get install build-essential libssl-dev git unzip -y
次に、wrkのgitリポジトリをwrk
ディレクトリに複製します。
- git clone https://github.com/wg/wrk.git wrk
その新しいディレクトリに移動します。
- cd wrk
make
コマンドを使用してwrk実行可能ファイルをビルドします。
- make
wrkを/usr/local/bin
ディレクトリにコピーして、ディレクトリ構造のどこからでもアクセスできるようにします。
- sudo cp wrk /usr/local/bin
wrkがインストールされたので、これを使用して次のコマンドでApacheの応答性をテストします。
- wrk -t2 -c1000 -d30s --latency http://server_ip/
このコマンドは、次の引数を使用します。
-t2
:これは2つのスレッドを実行することを意味します。-c1000
:1000のHTTP接続を開いたままにします。-d30s
:テストを30秒間実行します。--latency
:レイテンシー統計を出力します。
テストが完了するまで30秒待つと、次のような出力が表示されます。
outputRunning 30s test @ http://68.183.115.151/
2 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 44.45ms 104.50ms 1.74s 91.20%
Req/Sec 8.29k 1.07k 12.40k 71.00%
Latency Distribution
50% 11.59ms
75% 22.73ms
90% 116.16ms
99% 494.90ms
494677 requests in 30.04s, 5.15GB read
Socket errors: connect 0, read 8369, write 0, timeout 69
Requests/sec: 16465.85
Transfer/sec: 175.45MB
このテストでは、平均遅延は44.45ミリ秒で、合計494,677のリクエスト、8,369の読み取りエラー、69のタイムアウトエラーがありました。 正確な数は、インストールによって異なります。
次に、次のコマンドを使用して、Varnishサーバーに対して同じテストを再度実行します。
- wrk -t2 -c1000 -d30s --latency http://server_ip:8080/
テストが完了するまで30秒待つと、次のような出力が表示されます。
outputRunning 30s test @ http://68.183.115.151:8080/
2 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 14.41ms 13.70ms 602.49ms 90.05%
Req/Sec 6.67k 401.10 8.74k 83.33%
Latency Distribution
50% 13.03ms
75% 17.69ms
90% 24.72ms
99% 58.22ms
398346 requests in 30.06s, 4.18GB read
Socket errors: connect 0, read 19, write 0, timeout 0
Requests/sec: 13253.60
Transfer/sec: 142.48MB
表示される出力は多少異なる可能性がありますが、Varnishの方がApacheよりもレイテンシーが低くなります。 この場合、平均遅延は14.41ミリ秒で、合計398,346のリクエストがあり、エラーはありませんでした。
これらのテストでは、Apacheを使用した場合の平均応答時間は44.45msで8,438エラーでしたが、Varnishは速度を14.41msに向上させ、エラーも発生しませんでした。 これは、リソースが要求されるたびにディスクから読み取る必要があるApacheとは異なり、Varnishが応答をメモリにキャッシュし、後の要求に提供したためです。
結論
このチュートリアルでは、Varnishを静的Webサイトのリバースプロキシキャッシングサーバーとして構成しました。 基本的なHTTPキャッシングを使用してパフォーマンスを向上させる方法を確認し、wrkを使用してApacheサーバーとVarnishサーバーの負荷テストを実行して結果を比較しました。
Varnishキャッシュサーバーは、メインメモリからコンテンツを提供し、新しいリクエストが到着するたびにバックエンドのApacheサーバーからコンテンツをリクエストしないことで、静的サイトを高速化することを確認しました。 ワニスの他の使用法の詳細については、公式ドキュメントを参照してください。