前書き
このチュートリアルでは、既存のWebサーバーのパフォーマンスを向上させるためにVarnish Cache 4.0を使用する方法について説明します。 また、NginxがSSL終了を実行することで、ワニスにHTTPSサポートを追加する方法も示します。 既にWebアプリケーションサーバーがセットアップされていることを前提とし、開始点として汎用LAMP(Linux、Apache、MySQL、PHP)サーバーを使用します。
Varnish Cacheは、キャッシュHTTPリバースプロキシまたはHTTPアクセラレータであり、ユーザーにコンテンツを提供するのにかかる時間を短縮します。 使用する主な手法は、Webサーバーまたはアプリケーションサーバーからの応答をメモリにキャッシュすることです。そのため、同じコンテンツに対する今後の要求は、Webサーバーから取得することなく処理できます。 さまざまな環境でパフォーマンスを大幅に向上させることができ、コンテンツが大量の動的なWebアプリケーションがある場合に特に役立ちます。 Varnishは、主な機能としてキャッシュを使用して構築されましたが、リバースプロキシロードバランシングなどの他の用途もあります。
多くの場合、Varnishはデフォルトで適切に機能しますが、特定のアプリケーション、特にCookieを使用するアプリケーションのパフォーマンスを改善するために調整する必要があることに留意してください。 ワニスの詳細なチューニングは、このチュートリアルの範囲外です。
前提条件
このチュートリアルでは、プライベートIPアドレスでHTTP(ポート80)でリッスンしているWebアプリケーションサーバーが既にあると仮定します。 Webサーバーをまだセットアップしていない場合は、次のリンクを使用して独自のLAMPスタックをセットアップします:How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 14.04。 このサーバーをLAMP_VPSと呼びます。
Varnishのインストールに使用される新しいUbuntu 14.04 VPSを作成する必要があります。 initial server setup for Ubuntu 14.04 guideで手順1〜4を実行して、sudo権限を持つ非rootユーザーを作成します。 このサーバーをVarnish_VPSと呼びます。
Varnishサーバーはユーザーリクエストを受信するため、受信するトラフィックの量に合わせて適切なサイズにする必要があることに注意してください。
私たちの目標
私たちの目標は、Webアプリケーションサーバーの前にVarnish Cacheをセットアップして、リクエストを迅速かつ効率的に処理できるようにすることです。 キャッシュを設定した後、Nginxを使用して着信SSL要求を処理することにより、VarnishにHTTPSサポートを追加する方法を示します。 セットアップが完了すると、HTTPトラフィックとHTTPSトラフィックの両方で、キャッシュのパフォーマンス上の利点がわかります。
前提条件が設定され、構築しようとしているものがわかったので、始めましょう!
ニスをインストール
Varnish 4.0の最新リリースを入手するための推奨される方法は、公式リポジトリから利用可能なパッケージをインストールすることです。
Ubuntu 14.04にはapt-transport-https
が付属していますが、必ずVarnish_VPSで次のコマンドを実行してください。
sudo apt-get install apt-transport-https
次に、aptにVarnish GPGキーを追加します。
curl https://repo.varnish-cache.org/ubuntu/GPG-key.txt | sudo apt-key add -
次に、aptソースのリストにVarnish 4.0リポジトリを追加します。
sudo sh -c 'echo "deb https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.0" >> /etc/apt/sources.list.d/varnish-cache.list'
最後に、apt-getを更新し、次のコマンドを使用してVarnishをインストールします。
sudo apt-get update
sudo apt-get install varnish
デフォルトでは、Varnishはポート6081
でリッスンするように構成されており、Webサーバーが同じサーバー上にあり、ポート8080
でリッスンしていることを想定しています。 ブラウザを開き、サーバーのポート6081に移動します(強調表示された部分をパブリックIPアドレスまたはドメインに置き換えます)。
http://varnish_VPS_public_IP:6081
新しいVPSにVarnishをインストールしたため、サーバーのパブリックIPアドレスまたはドメイン名のポート6081
にアクセスすると、次のエラーページが返されます。
これは、Varnishがインストールされ実行されているが、キャッシュすることになっているWebサーバーが見つからないことを示しています。 ここで、Webサーバーをバックエンドとして使用するように設定しましょう。
ワニスを構成する
まず、LAMP_VPSをバックエンドとして使用するようにVarnishを構成します。
Varnish構成ファイルは/etc/varnish/default.vcl
にあります。 今すぐ編集しましょう:
sudo vi /etc/varnish/default.vcl
次の行を見つけます。
backend default {
.host = "127.0.0.1";
.port = "8080";
}
そして、host
とport
の値を、それぞれLAMPサーバーのプライベートIPアドレスとリスニングポートに一致するように変更します。 WebアプリケーションがプライベートIPアドレスとポート80でリッスンしていると仮定していることに注意してください。 そうでない場合は、ニーズに合わせて構成を変更します。
backend default {
.host = "LAMP_VPS_private_IP";
.port = "80";
}
Varnishには「猶予モード」と呼ばれる機能があり、有効にすると、Webサーバーのバックエンドがダウンして利用できなくなった場合に、要求されたページのキャッシュコピーを提供するようVarnishに指示します。 今それを有効にしましょう。 次のsub vcl_backend_response
ブロックを見つけて、次の強調表示された行を追加します。
sub vcl_backend_response {
set beresp.ttl = 10s;
set beresp.grace = 1h;
}
これにより、キャッシュページの猶予期間が1時間に設定されます。つまり、新しいコピーを探すためにウェブサーバーに到達できない場合、Varnishはキャッシュページを最大1時間提供し続けます。 これは、アプリケーションサーバーがダウンし、Webサーバーを再起動しているときに、エラーページ(以前に確認した503エラーなど)ではなく、古いコンテンツをユーザーに提供する場合に便利です。
default.vcl
ファイルを保存して終了します。
VarnishをデフォルトのHTTPポート(80)でリッスンするように設定すると、ユーザーがURLに異常なポート番号を追加せずにサイトにアクセスできるようになります。 これは、/etc/default/varnish
ファイルで設定できます。 今すぐ編集しましょう:
sudo vi /etc/default/varnish
多くの行が表示されますが、それらのほとんどはコメント化されています。 次のDAEMON_OPTS
行を見つけます(すでにコメント解除されているはずです):
DAEMON_OPTS="-a :6081 \
-a
オプションは、Varnishが要求をリッスンするアドレスとポートを割り当てるために使用されます。 デフォルトのHTTPポートであるポート80をリッスンするように変更しましょう。 変更後、次のようになります。
DAEMON_OPTS="-a :80 \
保存して終了。
次に、Varnishを再起動して、変更を有効にします。
sudo service varnish restart
ここで、パブリックIPアドレスでVarnishサーバーにアクセスし、今度はポート80(HTTP)でWebブラウザーでテストします。
http://varnish_VPS_public_IP
LAMP_VPSから提供されるものと同じものが表示されるはずです。 私たちの場合、それは単なるApache2 Ubuntuページです。
この時点で、ワニスはアプリケーションサーバーをキャッシュしています。できれば、応答時間の短縮によるパフォーマンスの向上が期待できます。 既存のアプリケーションサーバーを指すドメイン名がある場合は、そのDNSエントリをVarnishVPSpublic_IPを指すように変更できます。
基本的なキャッシュを設定したので、NginxでSSLサポートを追加しましょう!
NginxによるSSLサポート(オプション)
VarnishはSSL終了をネイティブにサポートしていないため、HTTPSトラフィックを処理することのみを目的としてNginxをインストールします。 自己署名SSL証明書を使用してNginxをインストールおよび構成する手順と、HTTPS接続からVarnish over HTTPへのリバースプロキシトラフィックについて説明します。
Nginxを使用した自己署名SSL証明書の設定の詳細については、次のリンクを参照してください:SSL with Nginx for Ubuntu。 StartSSLからの証明書を試す場合は、here is a tutorial that covers that。
Nginxをインストールしましょう。
Nginxをインストールする
Varnish_VPSで、次のaptコマンドを使用してNginxをインストールしましょう。
sudo apt-get install nginx
インストールが完了すると、Nginxが実行されていないことがわかります。 これは、デフォルトでポート80でリッスンするように構成されているが、Varnishはすでにそのポートを使用しているためです。 デフォルトのHTTPSポートであるポート443でリッスンするため、これは問題ありません。
使用するSSL証明書を生成しましょう。
自己署名SSL証明書を生成する
Varnish_VPSに、SSL証明書を配置できるディレクトリを作成します。
sudo mkdir /etc/nginx/ssl
自己署名の2048ビットSSLキーと証明書のペアを生成します。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
ドメイン名と一致するようにcommon name
を設定してください。 この特定の証明書の有効期限は1年です。
証明書が準備できたので、それを使用するようにNginxを構成しましょう。
Nginxを構成する
デフォルトのNginxサーバーブロック構成を編集用に開きます。
sudo vi /etc/nginx/sites-enabled/default
ファイル内のすべてを削除し、次のように置き換えます(そして、ドメイン名と一致するようにserver_name
を変更します)。
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
proxy_pass http://127.0.0.1:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Host $host;
}
}
保存して終了。 上記の構成には、いくつかの重要な行があり、それらについて詳しく説明します。
-
ssl_certificate:SSL証明書の場所を指定します
-
sslcertificatekey:SSLキーの場所を指定します
-
listen 443 ssl:ポート443でリッスンするようにNginxを構成します
-
server_name:サーバー名を指定し、SSL証明書の共通名と一致する必要があります
-
proxy_pass http://127.0.0.1:80;:トラフィックをVarnish(127.0.0.1のポート80で実行されている)にリダイレクトします(つまり、
localhost
)
他のproxy_set_header
行は、元のユーザーのIPアドレスなどの情報をユーザーの要求とともに転送するようにNginxに指示します。
Nginxを起動して、サーバーがHTTPSリクエストを処理できるようにします。
sudo service nginx start
今度は、Webブラウザーを使用して、パブリックIPアドレスを使用してVarnishサーバーにアクセスし、ポート443(HTTPS)でテストします。
https://varnish_VPS_public_IP
Note:自己署名証明書を使用した場合、「サイトのセキュリティ証明書は信頼されていません」などの警告が表示されます。 証明書を作成したことがわかっているので、続行しても安全です。
繰り返しますが、以前と同じアプリケーションページが表示されます。 違いは、実際にNginxサーバーにアクセスすることです。NginxサーバーはSSL暗号化を処理し、暗号化されていない要求をVarnishに転送します。Varnishは要求を通常のように処理します。
バックエンドWebサーバーを構成する
バックエンドWebサーバーがそのすべてのネットワークインターフェイスにバインドしている場合(つまり、 パブリックおよびプライベートネットワークインターフェイス)、Webサーバーの構成を変更して、プライベートインターフェイスのみでリッスンするようにします。 これは、ユーザーがパブリックIPアドレスを介してバックエンドWebサーバーに直接アクセスすることを防ぐためです。これにより、ニスキャッシュがバイパスされます。
ApacheまたはNginxでは、これには、バックエンドサーバーのプライベートIPアドレスにバインドするlisten
ディレクティブの値を割り当てることが含まれます。
ワニスのトラブルシューティング
ワニスがページを適切に提供するのに問題がある場合は、ワニスが舞台裏で何をしているかを確認するのに役立つコマンドをいくつか紹介します。
統計
キャッシュのパフォーマンスを把握したい場合は、varnishstat
コマンドを確認してください。 このように実行してください。
varnishstat
次のような画面が表示されます。
さまざまな統計が表示されます。上下の矢印を使用してスクロールすると、各アイテムの簡単な説明が表示されます。 cache_hit
統計は、キャッシュされた結果で処理されたリクエストの数を示します。この数をクライアントリクエストの総数(client_req
)にできるだけ近づける必要があります。
q
を押して終了します。
Logs
Varnishが個々のリクエストをどのように処理しているかの詳細をストリーミングログの形式で取得したい場合は、varnishlog
コマンドを使用することをお勧めします。 このように実行してください。
varnishlog
実行したら、Webブラウザーを介してVarnishサーバーにアクセスしてみてください。 Varnishに送信するリクエストごとに、Varnish構成のトラブルシューティングと調整に役立つ詳細な出力が表示されます。
CTRL + C
を押して終了します。
結論
Webサーバーの前にVarnish Cacheサーバーがあるため、ほとんどの場合、パフォーマンスが向上します。 Varnishは非常に強力で調整可能であり、それを最大限に活用するには追加の調整が必要になる場合があることに注意してください。