Ubuntu14.04でSSLターミネーションを使用してVarnishCache4.0を構成する方法
序章
このチュートリアルでは、VarnishCache4.0を使用して既存のWebサーバーのパフォーマンスを向上させる方法について説明します。 また、NginxがSSLターミネーションを実行して、VarnishにHTTPSサポートを追加する方法も示します。 すでにWebアプリケーションサーバーがセットアップされていることを前提とし、開始点として汎用LAMP(Linux、Apache、MySQL、PHP)サーバーを使用します。
Varnish Cacheは、キャッシュHTTPリバースプロキシまたはHTTPアクセラレータであり、ユーザーにコンテンツを提供するのにかかる時間を短縮します。 使用する主な手法は、Webサーバーまたはアプリケーションサーバーからの応答をメモリにキャッシュすることです。そのため、同じコンテンツに対する将来の要求は、Webサーバーから取得しなくても処理できます。 パフォーマンスはさまざまな環境で大幅に向上する可能性があり、コンテンツの多い動的Webアプリケーションがある場合に特に役立ちます。 Varnishは、キャッシングを主な機能として構築されていますが、リバースプロキシの負荷分散などの他の用途もあります。
多くの場合、Varnishはデフォルトで適切に機能しますが、特定のアプリケーション、特にCookieを使用するアプリケーションのパフォーマンスを向上させるために調整する必要があることに注意してください。 ワニスの詳細な調整は、このチュートリアルの範囲外です。
前提条件
このチュートリアルでは、プライベートIPアドレスでHTTP(ポート80)をリッスンしているWebアプリケーションサーバーがすでに存在することを前提としています。 Webサーバーをまだセットアップしていない場合は、次のリンクを使用して独自のLAMPスタックをセットアップします。 Ubuntu 14.04にLinux、Apache、MySQL、PHP(LAMP)スタックをインストールする方法。 このサーバーをLAMP_VPSと呼びます。
Varnishのインストールに使用される新しいUbuntu14.04VPSを作成する必要があります。 Ubuntu 14.04ガイドの初期サーバー設定の手順1〜4を実行して、sudo権限を持つ非rootユーザーを作成します。 このサーバーをVarnish_VPSと呼びます。
Varnishサーバーはユーザー要求を受信するため、受信するトラフィックの量に合わせて適切なサイズにする必要があることに注意してください。
私たちの目標
私たちの目標は、Webアプリケーションサーバーの前にVarnish Cacheを設定して、リクエストを迅速かつ効率的に処理できるようにすることです。 キャッシングが設定されたら、Nginxを利用して着信SSLリクエストを処理することにより、VarnishにHTTPSサポートを追加する方法を示します。 セットアップが完了すると、HTTPトラフィックとHTTPSトラフィックの両方で、キャッシュのパフォーマンス上の利点がわかります。
前提条件が設定され、何を構築しようとしているのかがわかったので、始めましょう。
ワニスをインストールします
Varnish 4.0の最新リリースを入手するための推奨される方法は、公式リポジトリから入手可能なパッケージをインストールすることです。
Ubuntu14.04にはapt-transport-https
が付属していますが、Varnish_VPSで次のコマンドを実行してください。
sudo apt-get install apt-transport-https
次に、VarnishGPGキーをaptに追加します。
curl https://repo.varnish-cache.org/ubuntu/GPG-key.txt | sudo apt-key add -
次に、Varnish4.0リポジトリをaptソースのリストに追加します。
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は、新しいコピーを探すためにWebサーバーに到達できない場合、キャッシュされたページを最大1時間提供し続けます。 これは、アプリケーションサーバーがダウンし、Webサーバーを復旧するときに、エラーページ(以前に見た503エラーなど)ではなく、古いコンテンツをユーザーに提供したい場合に便利です。
default.vcl
ファイルを保存して終了します。
デフォルトのHTTPポート(80)でリッスンするようにVarnishを設定して、ユーザーが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
次に、今回はポート80(HTTP)でパブリックIPアドレスを使用してVarnishサーバーにアクセスし、Webブラウザーでテストします。
http://varnish_VPS_public_IP
LAMP_VPSから提供されるものと同じものが表示されるはずです。 私たちの場合、それは単なるApache2Ubuntuページです。
この時点で、Varnishはアプリケーションサーバーをキャッシュしています。応答時間の短縮によってパフォーマンスが向上することを願っています。 既存のアプリケーションサーバーを指すドメイン名がある場合は、そのDNSエントリをVarnish_VPS_public_IPを指すように変更できます。
基本的なキャッシュが設定されたので、NginxでSSLサポートを追加しましょう!
NginxによるSSLサポート(オプション)
VarnishはSSLターミネーションをネイティブでサポートしていないため、HTTPSトラフィックを処理することのみを目的としてNginxをインストールします。 自己署名SSL証明書を使用してNginxをインストールおよび構成し、HTTPS接続からVarnishoverHTTPへのプロキシトラフィックをリバースプロキシする手順について説明します。
Nginxを使用した自己署名SSL証明書の設定の詳細については、次のリンクを参照してください: SSL with Nginx forUbuntu。 StartSSLからの証明書を試してみたい場合は、ここにそのをカバーするチュートリアルがあります。
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証明書の場所を指定します
- ssl_certificate_key :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
今回は、ポート443(HTTPS)でパブリックIPアドレスを使用してVarnishサーバーにアクセスし、Webブラウザーでテストします。
https://varnish_VPS_public_IP
注:自己署名証明書を使用した場合は、「サイトのセキュリティ証明書は信頼されていません」などの警告が表示されます。 証明書を作成したばかりであることがわかっているので、続行しても安全です。
繰り返しになりますが、以前と同じアプリケーションページが表示されます。 違いは、SSL暗号化を処理し、暗号化されていないリクエストを通常どおりに処理するVarnishに転送するNginxサーバーに実際にアクセスしていることです。
バックエンドWebサーバーを構成する
バックエンドWebサーバーがそのすべてのネットワークインターフェイスにバインドしている場合(つまり、 パブリックおよびプライベートネットワークインターフェイス)、Webサーバーの構成を変更して、プライベートインターフェイスでのみリッスンするようにします。 これは、ユーザーがパブリックIPアドレスを介してバックエンドWebサーバーに直接アクセスするのを防ぐためです。これにより、Varnishキャッシュがバイパスされます。
ApacheまたはNginxでは、これには、バックエンドサーバーのプライベートIPアドレスにバインドするためのlisten
ディレクティブの値の割り当てが含まれます。
ワニスのトラブルシューティング
Varnishでページを適切に提供するのに問題がある場合は、Varnishが舞台裏で何をしているかを確認するのに役立ついくつかのコマンドを次に示します。
統計
キャッシュのパフォーマンスを把握したい場合は、varnishstat
コマンドを確認してください。 次のように実行します。
varnishstat
次のような画面が表示されます。
さまざまな統計情報が表示されます。上下の矢印を使用してスクロールすると、各アイテムの簡単な説明が表示されます。 cache_hit
統計は、キャッシュされた結果で処理されたリクエストの数を示します。この数をクライアントリクエストの総数(client_req
)にできるだけ近づける必要があります。
q
を押して終了します。
ログ
Varnishが個々のリクエストをどのように処理しているかの詳細をストリーミングログの形式で取得したい場合は、varnishlog
コマンドを使用することをお勧めします。 次のように実行します。
varnishlog
実行されたら、Webブラウザを介してVarnishサーバーにアクセスしてみてください。 Varnishに送信するリクエストごとに、Varnish構成のトラブルシューティングと調整に役立つ詳細な出力が表示されます。
CTRL + C
を押して終了します。
結論
Webサーバーの前にVarnishCacheサーバーがあるので、ほとんどの場合、パフォーマンスが向上します。 ワニスは非常に強力で調整可能であり、それを最大限に活用するには追加の調整が必要になる場合があることを忘れないでください。