ウェブサイト検索

Ubuntu 14.04でSSL終端を使用したVarnish Cache 4.0の設定方法


紹介

このチュートリアルでは、Varnish Cache 4.0を使用して既存のWebサーバーのパフォーマンスを向上させる方法を説明します。また、NginxがSSL終端処理を行う形で、VarnishにHTTPSサポートを追加する方法も紹介します。すでにWebアプリケーションサーバーが設定されていることを前提とし、一般的なLAMP(Linux、Apache、MySQL、PHP)サーバーを出発点として使用します。

Varnish Cacheは、ユーザーにコンテンツを提供する時間を短縮するキャッシュHTTPリバースプロキシ、またはHTTPアクセラレーターです。主な技術は、ウェブまたはアプリケーションサーバーからの応答をメモリにキャッシュすることです。これにより、同じコンテンツに対する将来のリクエストをウェブサーバーから取得することなく提供できます。さまざまな環境でパフォーマンスを大幅に改善でき、特にコンテンツが多い動的ウェブアプリケーションに便利です。Varnishはキャッシングを主要な機能として構築されましたが、リバースプロキシの負荷分散など他の使用方法もあります。

多くの場合、Varnishはデフォルト設定でうまく機能しますが、特定のアプリケーション、特にクッキーを使用するアプリケーションのパフォーマンスを向上させるためには調整が必要であることを覚えておいてください。Varnishの詳細な調整は、このチュートリアルの範囲外です。

前提条件

このチュートリアルでは、既にプライベートIPアドレスのHTTP(ポート80)でリッスンしているウェブアプリケーションサーバーがあると仮定します。まだウェブサーバーを設定していない場合は、以下のリンクを使用して独自のLAMPスタックを設定してください:Ubuntu 14.04にLinux、Apache、MySQL、PHP(LAMP)スタックをインストールする方法。このサーバーをLAMP_VPSと呼びます。

あなたは、Varnishのインストールに使用される新しいUbuntu 14.04 VPSを作成する必要があります。Ubuntu 14.04ガイドの初期サーバーセットアップのステップ1-4を完了することで、sudo権限を持つ非rootユーザーを作成してください。このサーバーをVarnish_VPSと呼びます。

Varnishサーバーはユーザーからのリクエストを受け取ることになるため、予想されるトラフィック量に適したサイズであるべきことを忘れないでください。

私たちの目標

私たちの目標は、ウェブアプリケーションサーバーの前にVarnish Cacheを設定し、リクエストを迅速かつ効率的に処理できるようにすることです。キャッシングが設定された後、Nginxを利用してincoming SSLリクエストを処理することで、VarnishにHTTPSサポートを追加する方法をお見せします。設定が完了すれば、HTTPとHTTPSの両方のトラフィックはキャッシングによるパフォーマンス向上の恩恵を受けられます。

必要な前提条件が整い、何を作ろうとしているのかがわかったので、さあ始めましょう!

Varnishをインストールする

Varnish 4.0の最新リリースを取得するための推奨方法は、公式リポジトリを通じて提供されているパッケージをインストールすることです。

Ubuntu 14.04にはapt-transport-httpsが含まれていますが、念のためVarnish_VPSで以下のコマンドを実行してください:

sudo apt-get install apt-transport-https

今、VarnishのGPGキーをaptに追加します:

curl https://repo.varnish-cache.org/ubuntu/GPG-key.txt | sudo apt-key add -

次に、Varnish 4.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でリスニングするように設定されており、ウェブサーバーが同じサーバー上でポート8080でリスニングしていることを期待しています。ブラウザを開いてサーバーのポート6081にアクセスしてください(強調表示された部分をあなたのパブリックIPアドレスまたはドメインに置き換えます):

http://varnish_VPS_public_IP:6081

新しいVPSにVarnishをインストールしたため、サーバーのパブリックIPアドレスまたはドメイン名のポート6081にアクセスすると、次のエラーページが表示されます:

これは、Varnishがインストールされて実行されていることを示していますが、キャッシュするはずのWebサーバーを見つけられないということです。では、今度はバックエンドとして私たちのWebサーバーを使用するように設定しましょう。

Varnishを設定する

まず、Varnishを設定して、私たちのLAMP_VPSをバックエンドとして使用します。

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には「グレースモード」と呼ばれる機能があり、これを有効にすると、ウェブサーバーバックエンドがダウンして利用できなくなった場合に、Varnishにキャッシュされたリクエストページのコピーを提供するよう指示します。では、これを今、有効にしましょう。以下のsub vcl_backend_responseブロックを見つけ、次のハイライトされた行を追加してください:

sub vcl_backend_response {
    set beresp.ttl = 10s;
    set beresp.grace = 1h;
}

これはキャッシュされたページの猶予期間を1時間に設定します。つまり、Varnishは新しいコピーを探すためにウェブサーバーにアクセスできない場合、最大1時間の間、キャッシュされたページを提供し続けます。これは、アプリケーションサーバーがダウンしているときに、エラーページ(以前に見た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)でアクセスします:

http://varnish_VPS_public_IP

あなたは、LAMP_VPSから提供されるのと同じものを見るべきです。私たちの場合、それは単なるプレーンなApache2 Ubuntuページです。

この時点で、Varnishは私たちのアプリケーションサーバーをキャッシュしています。応答時間の短縮によるパフォーマンスの向上が見られることを期待しています。既存のアプリケーションサーバーを指しているドメイン名を持っている場合は、そのDNSエントリをあなたのVarnish_VPS_public_IPに変更することができます。

基本的なキャッシングが設定されたので、Nginxを使ってSSLサポートを追加しましょう!

NginxによるSSLサポート(オプション)

VarnishはSSL終端処理をネイティブにサポートしていないため、HTTPSトラフィックを処理するためだけにNginxをインストールします。自己署名のSSL証明書を使用してNginxをインストールおよび構成する手順と、HTTPS接続からVarnishへのHTTP経由のトラフィックをリバースプロキシする手順を説明します。

自己署名のSSL証明書をNginxで設定する詳細な説明が必要な場合は、こちらのリンクを参照してください:Ubuntu用のNginxでのSSL。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: Nginxをポート443でリッスンするように設定します
  • server_name: サーバー名を指定します。これはSSL証明書の共通名と一致する必要があります。
  • proxy_pass http://127.0.0.1:80;:トラフィックをVarnishにリダイレクトします(これは127.0.0.1のポート80で実行されています(つまり、localhost))

他のproxy_set_header行は、Nginxに元のユーザーのIPアドレスなどの情報を、ユーザーのリクエストと共に転送するよう指示しています。

さあ、Nginxを起動して、私たちのサーバーがHTTPSリクエストを処理できるようにしましょう。

sudo service nginx start

今度はウェブブラウザでテストしてみてください。パブリックIPアドレスのVarnishサーバーに443番ポート(HTTPS)でアクセスします:

https://varnish_VPS_public_IP

注意: 自己署名証明書を使用した場合、「サイトのセキュリティ証明書は信頼されていません」という警告が表示されます。あなたが証明書を作成したばかりであることを知っているので、進むのは安全です。

再度、以前と同じアプリケーションページが表示されるはずです。違いは、実際にはSSL暗号化を処理し、暗号化されていないリクエストをVarnishに転送するNginxサーバーを訪れているということです。Varnishは通常通りリクエストを処理します。

バックエンドWebサーバーを構成する

バックエンドのウェブサーバーがすべてのネットワークインターフェース(パブリックおよびプライベートネットワークインターフェース)にバインドされている場合、ウェブサーバーの設定を変更して、プライベートインターフェースのみにリスニングするようにしておくことをお勧めします。これは、ユーザーがパブリックIPアドレスを介してバックエンドウェブサーバーに直接アクセスするのを防ぐためであり、それによりVarnish Cacheをバイパスすることになります。

ApacheまたはNginxでは、listenディレクティブの値をバックエンドサーバーのプライベートIPアドレスにバインドすることが含まれます。

バーニッシュのトラブルシューティング

Varnishがページを適切に提供できない場合は、Varnishが裏で何をしているかを確認するのに役立ついくつかのコマンドを以下に示します。

統計

キャッシュのパフォーマンスがどれくらい良いかを確認したい場合は、varnishstat コマンドを確認する必要があります。次のように実行します:

varnishstat

次のような画面が表示されます:

さまざまな統計が表示され、上下の矢印を使ってスクロールすると各項目の簡単な説明が表示されます。cache_hit統計は、キャッシュされた結果でどれだけのリクエストが処理されたかを示します。この数値は、クライアントリクエストの合計数(client_req)にできるだけ近くなることを望みます。

qを押して終了します。

ログ

Varnishが各個別のリクエストをどのように処理しているかをストリーミングログの形で詳細に確認したい場合は、varnishlogコマンドを使用する必要があります。以下のように実行してください:

varnishlog

実行されたら、ウェブブラウザを通じてVarnishサーバーにアクセスしてみてください。Varnishに送信する各リクエストに対して、Varnishの設定をトラブルシューティングしたり調整したりするのに役立つ詳細な出力が表示されます。

CTRL + C を押して終了します。

結論

ウェブサーバーの前にVarnish Cacheサーバーがあるため、ほとんどの場合パフォーマンスが向上します。Varnishは非常に強力で調整可能であることを覚えておいてください。最大限の効果を得るには、追加の調整が必要な場合があります。

関連記事: