目次:
ウェブサイトのパフォーマンスに関して言えば、ワニスはホットなテクノロジーです。 簡単なインストールと構成により、あらゆるWebサイトのパフォーマンスを向上させ、小さな仮想プライベートサーバーのみで最大100万ページを提供できます。 、数百、数千、数百万のページを提供するかどうかにかかわらず、サイトの応答時間を改善するのに役立つ4つの可能な構成を示します。
ワニスの紹介
Varnish-Cacheは、Webサイトのコンテンツをキャッシュすることを目的としたWebアクセラレータです。 これは、コードを変更することなく、非侵襲的にWebサイトへのアクセスを最適化および高速化し、Webサイトに手を入れることを目的としたオープンソースプロジェクトです。
Webアクセラレータと呼ばれたのはVarnish Cacheの作成者でした。その主な目的は、Webサイトのフロントエンドを改善および高速化することです。 Varnishは、Webサーバーが提供するページのコピーをキャッシュに保存することでこれを実現しています。 次回同じページが要求されると、Webサーバーにページを要求する代わりにVarnishがコピーを提供するため、パフォーマンスが大幅に向上します。
Varnish Cacheのもう1つの重要な機能は、そのパフォーマンスに加えて、その構成言語であるVCLの柔軟性です。 VCLを使用すると、着信要求の処理方法に関するポリシーを作成できます。 このようなポリシーでは、提供するコンテンツ、コンテンツの取得元、要求または応答の変更方法を決定できます。
次の構成例では、イメージと静的オブジェクトの単純なキャッシュから、分散環境でのVarnishの使用やロードバランサーとしての機能まで、いくつかの目標を達成するために使用するVCLルールを示します。
以下の例はすべて、ワニス3.x用です。 Varnish 2.xは異なる構文とルールを使用するため、これらの例はそのバージョンと互換性がないことに注意してください。
以下は、VCL構成ファイルで使用するVarnishの主な状態です。
復習
これは、リクエストの受信時に呼び出される最初の関数です。 ここで、キャッシュに存在するかどうかを確認する前に、リクエストを操作できます。 要求をキャッシュに入れることができない場合、要求の送信先のバックエンドサーバーもこのフェーズで選択できます。
パス
要求をWebサーバーに渡し、回答をキャッシュする場合に、この関数を使用できます。
パイプ
この関数は、ワニスをバイパスし、リクエストをWebサーバーに送信します。
調べる
ルックアップにより、Varnishは、応答がキャッシュ内に存在し、有効であるかどうかを確認するよう要求します。
フェッチ
この関数は、バックエンドからのコンテンツの回復がパスまたはミスによって呼び出された後に呼び出されます。
基本:キャッシュ画像
それでは、構成の例を見てみましょう。 この最初の例では、画像とCSSファイルなどの静的ファイルをキャッシュします。 この構成は、ブーストするWebサイトがわからない場合に非常に便利です。したがって、すべての画像、CSS、およびJavaScriptがすべてのユーザーに対して同じであると判断できます。 ユーザーを区別するために、HTTPプロトコルはCookieを使用するため、このタイプのリクエストでCookieを削除する必要があります。したがって、Varnishでも同じです。
sub vcl_recv{
if(req.url ~ " * \.(png|gif|jpg|swf|css|js)"{
unset req.http.cookie;
unset req.http.Vary;
return(lookup);
}
# strip the cookie before the image is inserted into cache.
sub vcl_fetch {
if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
unset beresp.http.set-cookie;
}
以上です。 このVCLファイルを使用すると、静的コンテンツを簡単にキャッシュできます。
標準:イメージとページのキャッシュ
通常、Webサイトの静的コンテンツをキャッシュするだけでなく、Webサーバーで生成される動的ページもキャッシュしますが、それはすべてのユーザー、または少なくともすべての匿名ユーザーに対して同じです。ユーザー。 このフェーズでは、キャッシュできるページとできないページを選択する必要があります。
良い例は、最も一般的に使用されるコンテンツ管理システムの1つであるWordpressです。 Wordpressは、PHPを使用してWebサイトページを動的に生成し、MySQLデータベースに照会します。 これは、数回クリックするだけで管理インターフェイスからWebサイトを簡単に更新できるため便利ですが、使用されるリソースの点でも高価です。 ユーザーがホームページにアクセスするたびに同じPHPスクリプトとMySQLクエリを実行するのはなぜですか? Varnishを使用して、最も訪問されたページをキャッシュし、素晴らしい結果を得ることができます。
これらは、Wordpressのインストールに役立つルールです。
sub vcl_recv{
# Let's make sure we aren't compressing already compressed formats.
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|mp3|mp4|m4v)(\?. * |)$") {
remove req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
remove req.http.Accept-Encoding;
}
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
# Unset all cookies if not Wordpress admin - otherwise login will fail
if (!(req.url ~ "wp-(login| admin )")) {
unset req.http.cookie;
return(lookup);
}
# If you request the special pages go directly to them
if (req.url ~ "wp-(login| admin )") {
return (pipe);
}
}
sub vcl_miss {
if (!(req.url ~ "wp-(login| admin )")) {
unset req.http.cookie;
}
if (req.url ~ "^/+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") {
unset req.http.cookie;
set req.url = regsub(req.url, "\?.$", "");
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
}
sub vcl_fetch {
if (req.url ~ "^/$") {
unset beresp.http.set-cookie;
}
# Unset all cookies if not Wordpress admin - otherwise login will fail
if (!(req.url ~ "wp-(login| admin )")) {
unset beresp.http.set-cookie;
}
}
この例では、ウェブサイトのすべてのページをキャッシュしていますが、URLに「wp- admin」または「wp-login」があるページの場合、文字列はログインに使用される「特別な」場所です管理者としてのWordpress。 そのため、Webサーバーと直接対話し、ワニスキャッシュをバイパスしたいと考えています。
当然、Drupal、Joomla、またはカスタムメイドのWebサイトを使用する場合、これらのルールを変更する必要がありますが、目標は常に同じです。すべての動的ページとキャッシュをバックエンドに送信するには。
標準++:サーバーの復元力を高める
Webサーバーは、負荷が高いために遅くなる場合があります。 ワニスもこれに役立ちます。 いくつかの特別なディレクティブを使用して、バックエンドがダウンしているか、応答が遅すぎる場合にバックエンドと通信しないようにワニスに指示できます。 これらの場合、ワニスは「grace」ディレクティブを使用します。
Varnishの範囲内での猶予とは、状況によって要求された場合に、期限切れのオブジェクトを配信することを意味します。 これは次の理由で発生する可能性があります。
- 選択されたバックエンドディレクターがダウンしています
- 別のスレッドが、まだ終了していないバックエンドへの要求をすでに行っています。
sub vcl_recv {
if (req.backend.healthy) {
set req.grace = 30s;
} else {
set req.grace = 1h;
}
}
sub vcl_fetch {
set beresp.grace = 1h;
}
この設定は、バックエンドをテストし、問題がある場合は猶予期間を延長するようにニスに指示します。 上記の例では、ディレクティブ「req.backend.healthy」も導入しています。これは、バックエンドのチェックに使用されます。 これは、複数のバックエンドがある場合に非常に便利なので、より高度な例を見てみましょう。
高度な使用:分散環境での復元力のあるWebサーバーの作成
これは、これまで見てきたすべてのオプションと、プローブ用の特別なディレクティブを使用した2つのバックエンドの定義を含む最終的な構成ファイルです。 これが、Webサーバーが稼働しているかどうかをVarnishが判断する方法です。
.url
Varnishは、このURLを使用してバックエンドにリクエストを送信します。
。タイムアウト
プローブの終了速度を決定します。 「0.1 s」、「1230 ms」、さらには「1 h」などの数字で時間単位を指定する必要があります。
。間隔
ポーリング間で待機する時間。 ここでも時間単位を指定する必要があります。 これは「レート」ではなく「間隔」であることに注意してください。 最低のポーリングレートは(.timeout + .interval)です。
。窓
バックエンドが正常かどうかを判断するときに考慮する最新のポーリングの数。
.threshold
バックエンドが正常であると宣言されるためには、.windowの最後のポーリングの数が適切でなければなりません。
これで、ディレクティブ "req.backend.healthy"を使用して、バックエンドが動作しているかどうかを示すブール結果を取得できます。
#
# Customized VCL file for serving up a Wordpress site with multiple back-ends.
#
# Define the internal network subnet.
# These are used below to allow internal access to certain files while not
# allowing access from the public internet .
acl internal {
"10.100.0.0"/24;
}
# Define the list of our backends (web servers), they Listen on port 8080
backend web1 { .host = "10.100.0.1"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}
backend web2 { .host = "10.100.0.2"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}
# Define the director that determines how to distribute incoming requests.
director default_director round-robin {
{ .backend = web1; }
{ .backend = web2; }
}
# Respond to incoming requests.
sub vcl_recv {
set req.backend = default_director;
# Use anonymous, cached pages if all backends are down.
if (!req.backend.healthy) {
unset req.http.Cookie;
set req.grace = 6h;
} else {
set req.grace = 30s;
}
# Unset all cookies if not Wordpress admin - otherwise login will fail
if (!(req.url ~ "wp-(login| admin )")) {
unset req.http.cookie;
return(lookup);
}
# If you request the special pages go directly to them
if (req.url ~ "wp-(login| admin )") {
return (pipe);
}
# Always cache the following file types for all users.
if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {
unset req.http.Cookie;
}
}
# Code determining what to do when serving items from the web servers.
sub vcl_fetch {
# Don't allow static files to set cookies.
if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {
# beresp == Back-end response from the web server.
unset beresp.http.set-cookie;
}
# Allow items to be stale if needed.
set beresp.grace = 6h;
}
強力なツール
これらは、ワニスの使用を開始するのに役立ついくつかの例にすぎません。 このツールは非常に強力であり、ハードウェアや仮想マシンを追加購入せずにパフォーマンスを大幅に向上させることができます。 多くのWebサイト管理者にとって、これは大きなメリットです。