Centos7 ベースの Varnish キャッシュ プロキシ サーバーを展開する

Centos7 ベースの Varnish キャッシュ プロキシ サーバーを展開する

1. ワニスの概要

1. ワニスの紹介

Varnish は、新しいソフトウェア アーキテクチャを使用し、現在のハードウェア システムと密接に連携する、高性能なオープン ソース リバース プロキシ サーバーおよび HTTP アクセラレータです。従来の Squid と比較して、Varnish は高性能、高速、管理が簡単などの利点があります。現在、多くの大規模 Web サイトが Squid の代わりに Varnish の使用を試み始めています。これが Varnish が急速に発展した最も根本的な理由です。

Varnish の主な機能:

(1)キャッシュプロキシの場所:メモリまたはディスクのいずれかを使用できます。
(2)ログ保存:ログはメモリに保存されます。
(3)仮想メモリの使用をサポートする。
(4)キャッシュの時間属性制御という精密な時間管理機構がある。
(5)状態エンジンアーキテクチャ:異なるキャッシュデータとプロキシデータは異なるエンジンで処理される。
(6)キャッシュ管理:バイナリヒープを使用してキャッシュデータを管理し、タイムリーなデータクリーンアップを確実に行う。

2. VarnishとSquidの比較と類似点

  • これらはすべてオープンソースソフトウェアです。
  • これはリバース プロキシ サーバーです。

ワニスの利点

(1)安定性:VarnishとSquidが同じワークロードを完了する場合、Squidは頻繁に再起動する必要があるため、Squidサーバーの障害が発生する可能性がVarnishよりも高くなります。
(2)アクセス速度が速い:Varnishのキャッシュされたデータはすべてメモリから直接読み取られますが、Squidはハードディスクから読み取ります。
(3)より多くの同時接続をサポート:VarnishのTCP接続とリリース速度はSquidよりもはるかに速いため

ワニスの欠点

(1)Varnishプロセスが再起動されると、キャッシュされたデータはメモリから完全に解放されます。このとき、すべてのリクエストはバックエンドサーバーに送信されます。同時実行性が高い場合、バックエンドサーバーに大きな負荷がかかります。
(2)Varnishを使用する場合、単一のURLリクエストを負荷分散すると、各リクエストが異なるVarnishサーバーに送られ、すべてのリクエストがバックエンドサーバーに送られます。また、同じQin Guiが複数のサーバーにキャッシュされるため、Varnishのキャッシュリソースが浪費され、パフォーマンスが低下します。

ワニスの欠点に対する解決策

デメリット 1 について: トラフィックが大きい場合は、Varnish のメモリ キャッシュ モードの使用を開始することをお勧めします。それには、複数の Squid/nginx サーバーが必要です。これは主に、以前の Varnish サービスまたはサーバーが再起動されたときに、大量のリクエストが Varnish に侵入するのを防ぐためです。これにより、Squid/nginx は第 2 層の CACHE として機能し、再起動時にメモリ内の Varnish キャッシュが解放される問題を補うことができます。
2 番目の欠点: ロード バランサーで URL ハッシュを実行して、単一の URL 要求を Varnish サーバーに固定することができます。

3. Varnishの仕組み

Varnish サーバーは、クライアントからのリクエストを受信すると、まずキャッシュにデータがあるかどうかを確認します。ある場合は、クライアントに直接応答します。ない場合は、バックエンド サーバーから対応するリソースを要求し、Varnish サーバーにローカルにキャッシュしてから、クライアントに応答します。

ルールと要求されたページの種類に基づいて、データをキャッシュする必要があるかどうかを選択します。リクエスト ヘッダーの Cache-Contorl と Cookie がマークされているかどうかに基づいてキャッシュするかどうかを決定できます。これらの機能は、構成ファイルを記述することで実装できます。

4. シンプルな建築にニスを塗る

Varnishは管理プロセスと子プロセスに分かれています

  • 管理プロセス: 子プロセスを管理し、VCL 構成をコンパイルして、さまざまな状態エンジンに適用します。
  • 子プロセス: ユーザー要求を処理し、ハッシュ検索を通じてユーザー結果を返すスレッド プールを生成します。

子プロセスによって生成される共通スレッドは

  • スレッドを受け入れます: 新しい接続要求を受信して​​応答します。
  • ワーカー スレッド: セッション、要求リソースの処理。
  • 有効期限スレッド: キャッシュ内の期限切れのコンテンツをクリアします。

5. ニス本体構成部分

  • バックエンド構成: Varnish にリバース プロキシ サーバー ノードを少なくとも 1 つ追加します。
  • ACL 設定: Varnish にアクセス制御リストを追加し、これらのリストによってアクセスの許可または禁止を指定します。
  • プローブ構成: バックエンド サーバーが正常かどうかを検出するためのルールを Varnish に追加し、対応するバックエンド サーバーの切り替えまたは無効化を容易にします。
  • ディレクターの構成: 複数のバックエンド サーバーを管理するために Varnish に負荷分散モードを追加します。
  • コアサブルーチン構成: バックエンドサーバーの切り替え、リクエストのキャッシュ、アクセス制御、エラー処理、その他のルールを Varnish に追加します。

6. VCLには組み込みのプリセット変数があります: 変数(オブジェクトとも呼ばれます):

図のように

(1)req:クライアントがVarnishサーバーに要求する際に利用可能な変数。
(2)bereq:Varnishサーバーはバックエンドサーバーで利用可能な変数を要求します。
(3)beresp:バックエンドサーバーがVarnishサーバーの要求に応答し、結果を返すときに使用される変数。
(4)resp:Varnishサーバーがクライアントの要求に応答するために使用する変数。
(5)obj:キャッシュオブジェクト、キャッシュバックエンド応答要求内容。
(6)now:現在のタイムスタンプを返します。

クライアント

Clienet.ip: クライアントのIPアドレスを返します
Client.port: クライアントが要求したポート番号を取得します (Vatnish 4.0 以降では、これを使用するには std モジュールを呼び出す必要があります)。構文は import std; std.port(client.ip) です。
Client.identiy クライアント識別コードを取得します。ソフトウェアはインストール プロセス中に ID を識別するためのシリアル番号を生成します。

サーバ

Server.hostname: サーバーのホスト名
Server.identiy: サーバー識別コードを取得する
Server.ip: サーバーのIPアドレスを取得する
Server.prot: サーバーのIPポート番号を取得します。stdモジュールを呼び出す必要があります。

クライアント要求 req (クライアント要求によって送信されたオブジェクト)

  • Req: リクエスト全体のデータ構造
  • req.bachend_hint: 画像サーバーへのgifなどのリクエストバックエンドノードを指定します
  • Req.can_gzip: クライアントが gzip 転送エンコーディングを受け入れるかどうか (通常、ブラウザはすべての圧縮形式をサポートしています)
  • req.hash_always_miss: キャッシュからデータを読み取るかどうか
  • req.hash_ignore_busy: キャッシュ内のビジーデータデッドロックを無視します (処理中に 2 つの Varnish サーバーがリソースを競合し、ブロックが発生するなど)。手動で停止しないと、デッドロックが継続します)
  • req.http: httpリクエストのヘッダーに対応します
  • req.method: リクエストタイプまたはリクエストメソッド(gt、postなど)
  • req.proto: クライアント要求で使用される http プロトコルのバージョン
  • req.restarts: 再起動の回数。デフォルトの最大値は 4 です (通常、サーバーがアクセスされたかどうかを判断するために使用されます)
  • req.url: 要求されたURL
  • req.xid: 一意の ID。Varnish サーバーからアクセスされると、X-varnish がヘッダーに追加されます。その後の数字は Varnish の ID です。最初のデータはリクエストの識別 ID で、2 番目のデータはキャッシュの識別 ID です。

Varnish はバックエンド サーバー (bereq) を要求します。

  • bereq: バックエンドリクエスト全体のデータ構造
  • bereq.backend: 要求されたバックエンドノードの構成
  • bereq.between_bytes_timeout: バックエンドから受信した各バイト間の待機時間またはタイムアウト
  • bereq.http: バックエンドに送信されるhttpヘッダー情報に対応します
  • bereq.method: バックエンドに送信されるリクエストの種類またはメソッド
  • bereq.proto: バックエンドに送信されたリクエストのHTTPプロトコルバージョン
  • bereq.retires: 同じリクエスト再試行回数
  • bereq.uncacheable: リクエストデータがキャッシュされていないか、リクエストがキャッシュされていません
  • bereq.url: バックエンドリクエストに送信されるURL
  • bereq.xid: リクエストの一意のID

バックエンドサーバーはデータをVarnish beresqに返します

  • Beresp: バックエンドサーバーの応答データ
  • Beresp.backend.ip: バックエンド応答(リクエストデータ処理)サーバーのIPアドレス
  • Beresp.backend.name: バックエンド応答サーバーのノード名
  • Beresp.do_gunzip: デフォルトは false で、キャッシュする前にオブジェクトを解凍します。
  • Beresp.grace: キャッシュの有効期限に追加の猶予時間を設定する
  • Beresp.http: 応答の http ヘッダー
  • Beresp.keep: 保持時間付きオブジェクトキャッシュ
  • Beresp.proto: レスポンスの http バージョン
  • Beresp.reason: バックエンドサーバーから返された http ステータス情報
  • Beresp.status: バックエンドサーバーから返されるステータスコード
  • Beresp.storage_hint: 保存する特定のストレージ(メモリ)を指定します
  • Beresp.ttl: オブジェクトキャッシュの残り時間を変更し、統合キャッシュの残り時間を指定します
  • Beresp,uncacheable: データをキャッシュしない

ストレージ

  • Storage.<name>.free_space: ストレージの使用可能領域 (バイト)
  • Storage.<name>.used_space: ストレージの残り時間 (バイト)
  • Storage.<name>.happy: ストレージノードのステータス
  • deliverはクライアントにデータを送信し、返されたデータは
  • fetchはバックエンドからデータを取得し、ローカルにデータをキャッシュします。

7. 特定の関数ステートメント

  • Ban(式): 指定されたオブジェクト キャッシュをクリアします。
  • Call(サブルーチン): サブルーチンを呼び出します。
  • Hash_data(入力): 入力サブルーチンの値に基づいてハッシュ キーを生成します。
  • New(): vcl_init サブプロセスでのみ使用できる新しい vcl オブジェクトを作成します。
  • Return(): 現在のサブルーチンを終了し、次のステップを指定します。
  • Rollback(): HTTP ヘッダーを元の状態に戻します。これは非推奨です。代わりに std.rollback() を使用してください。
  • 合成 (文字列): シンセサイザー。クライアントに返されるページとステータス コードを定義します。
  • Regsub(str, regex, sub) は正規表現を使用して文字列の最初の出現を置き換えます。
  • Regsuball(str, regex, sub) は文字列のすべての出現を置き換えます。

8. Varnishリクエストの処理手順

図のように

Varnishリクエストの処理手順

受信状態 (vcl_recv)。つまり、リクエスト処理のエントリ状態です。VCL ルールに従って、リクエストをパスするか (vcl_pass)、パイプするか (vcl_pipe)、またはルックアップに入るか (ローカル クエリ) が決定されます。
ルックアップ状態。この状態に入ると、ハッシュ テーブルでデータが検索されます。データが見つかった場合はヒット (vcl_hit) 状態になり、見つからない場合はミス (vcl_miss) 状態になります。
合格(vcl_pass)ステータス。この状態では、バックエンドリクエストが直接入力され、つまりフェッチ(vcl_fetch)状態になります。
フェッチ (vcl_fetch) 状態。フェッチ状態では、バックエンドからリクエストが取得され、リクエストが送信され、データが取得され、設定に従ってデータがローカルに保存されます。
配信 (vcl_deliver) ステータス。取得したデータをクライアントに送信し、リクエストを完了します。
パイプの状態。クライアントとサーバー間の直接接続を確立して、バックエンドサーバーからデータを取得します。

vcl_recv サブルーチン: return (アクション) を介して要求の処理を開始します。
vcl_pipe サブルーチン: パイプ モード処理。主にバックエンドの応答コンテンツを直接取得してクライアントに返すために使用されます。応答コンテンツを定義してクライアントに返すことができます。
vcl_pass サブルーチン: パス モード処理。ハッシュ キャッシュ モードに似ていますが、キャッシュ処理はありません。
vcl_hit サブルーチン: ハッシュ キャッシュ モードでは、ハッシュ キャッシュが存在する場合に呼び出され、キャッシュ処理に使用され、キャッシュを破棄または変更できます。
vcl_miss サブルーチン: ハッシュキャッシュモードの場合、ハッシュキャッシュがないときに呼び出されます。レスポンス内容を取得するためにバックエンドに入るかどうかを判断するために使用されます。パスモードに変更することもできます。
vcl_hash サブルーチン: ハッシュ キャッシュ モード。キャッシュ コンテンツを抽出するためのキャッシュ検索キー名としてハッシュ値を生成し、主にキャッシュ ハッシュ キー値の処理に使用されます。hash_data(文字列) を使用してキー値の構成構造を指定でき、IP または Cookie を介して同じページで異なるキャッシュ キー値を生成できます。
vcl_purgeサブルーチン: クリーンアップモード、対応するキャッシュが見つかったときにクリアして呼び出し、キャッシュをクリアして報告するメソッドを要求するために使用されます。
vcl_deliver サブルーチン: vcl_backend_response サブルーチン (非パイプ モード) または vcl_hit サブルーチンの後に呼び出されるクライアント配信サブルーチンは、応答ヘッダー情報、Cookie などを追加するために使用できます。
vcl_backend_fetch サブルーチン: バックエンド要求を送信する前に呼び出され、要求アドレスやその他の情報を変更したり、要求を破棄したりするために使用できます。
vcl_backend_response サブルーチン: バックエンドが応答した後に呼び出され、キャッシュ時間とキャッシュ関連情報を変更するために使用できます。
vcl_backend_error サブルーチン: バックエンド処理の失敗の呼び出し、異常なページ表示効果の処理、エラー応答の内容をカスタマイズしたり、beresp.status や beresp.http.Location のリダイレクトなどを変更したりできます。
vcl_synth サブルーチン: 応答コンテンツをカスタマイズします。これは、synthetic() と戻り値 synth を通じて呼び出すことができます。ここでは、例外の表示内容をカスタマイズしたり、resp.status や resp.http.Location のリダイレクトを変更したりすることができます。
vcl_init サブルーチン: vcl がロードされたときに最初に呼び出されます。これは、VMOD を初期化するために使用されます。このサブルーチンはリクエスト処理には関与せず、vcl がロードされたときに 1 回だけ呼び出されます。
vcl_fini サブルーチン: 現在の vcl 構成がアンインストールされて VMOD がクリーンアップされるときに呼び出されます。このサブルーチンは要求処理には関与せず、vcl が正常に破棄された後にのみ呼び出されます。

2. Varnishをインストールする

ワニスパッケージのダウンロードリンク: https://pan.baidu.com/s/1OfnyR-5xFuxMUYJTnhQesA 抽出コード: m9q4

Varnish サーバーに加えて、さらに 2 つの Web サーバーを開いて Web ページを提供することもできます。

[root@localhost ~]# yum -y インストール autoconf automake libedit-devel libtool ncurses-devel pcre-devel pkgconfig python-docutils python-sphinx
[root@localhost ~]# tar zxf varnish-4.0.3.tar.gz 
[root@localhost ~]# cd varnish-4.0.3/
[root@localhost varnish-4.0.3]# ./configure && make && make install
[root@localhost varnish-4.0.3]# cp etc/example.vcl /usr/local/var/varnish/
// Varnish のメイン設定ファイルをコピーします [root@localhost /]# vim /usr/local/var/varnish/example.vcl 
// Varnish マスター構成を編集して、元の変更を確認します vcl 4.0;
輸入ディレクター;
std をインポートします。
バックエンドのデフォルト{
  .host = "127.0.0.1";
  .port = "80";
}
プローブ backend_healthcheck {
    .url="/";
    .interval = 5秒;
    .タイムアウト = 1秒;
    .window = 5;
    .しきい値 = 3;
}
バックエンド web1 {
    .host = "192.168.148.132";
    .port = "80";
    .probe = backend_healthcheck;
}
バックエンドWeb2 {
    .host = "192.168.148.133";
    .port = "80";
    .probe = backend_healthcheck;
}
ACL パージャー {
    「127.0.0.1」;
    "ローカルホスト";
    「192.168.148.0/24」;
    !"192.168.148.133";
}
サブvcl_init {
    新しい web_cluster = directors.round_robin();
    web_cluster.add_backend(web1);
    web_cluster.add_backend(web2);
}
// 元のものをすべて削除し、次のサブ vcl_recv { を追加します。
    req.backend_hint = web_cluster.backend() を設定します。
    (req.method == "PURGE"の場合){
        if (!client.ip ~ purgers) {
            return (synth(405, "許可され​​ていません。"));
    }
    戻す(パージ)
}
if (req.method != "GET" &&
    要求メソッド != "HEAD" &&
    要求メソッド != "PUT" &&
    要求メソッド != "POST" &&
    要求メソッド != "TRACE" &&
    req.method != "オプション" &&
    req.method != "PATCH" &&
    req.method != "DELETE") {
        戻り値(パイプ)
    }
要求メソッドが "GET" で、要求メソッドが "HEAD" の場合 {
    返す(渡す)
}
必要であれば、req.url を "\.(php|asp|aspx|jsp|do|ashx|shtml)($|\?)" に設定します。
    返す(渡す)
}
if (req.http.Accept-Encoding) {
    if (req.url ~ "\.(bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)$") {
    req.http.Accept-Encoding を設定解除します。
} elseif (req.http.Accept-Encoding ~ "gzip") {
        req.http.Accept-Encoding = "gzip" を設定します。
    } elseif (req.http.Accept-Encoding ~ "deflate") {
        req.http.Accept-Encoding = "deflate" を設定します。
    } それ以外 {
    req.http.Accept-Encoding を設定解除します。
    }
   }
if (req.url ~ "\.(css|js|html|htm|bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)($|\?)") {
    req.http.cookie を設定解除します。
    戻り値(ハッシュ);
}
(req.restarts == 0)の場合{
    (http.X-Forwarded-For が必要)の場合 {
        req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip を設定します。
    } それ以外 {
    req.http.X-Forwarded-For = client.ip を設定します。
    }
}
戻り値(ハッシュ);
}
サブvcl_hash{
    ハッシュデータ(req.url);
    (http.hostが必要な場合){
    ハッシュデータ(req.http.host);
    } それ以外 {
        hash_data(サーバのIP);
    }
    返す(検索);
}
サブvcl_hit {
    (req.method == "PURGE"の場合){
        return (synth(200, "パージされました。"));
    }
    返す(配達する);
}
サブvcl_miss {
  (req.method == "PURGE"の場合){
        return (synth(404, "パージされました。"));
    }
    返す(フェッチ);
}
サブvcl_deliver {
    (obj.hits > 0)の場合{
        resp.http.CXK = "HIT-from-varnish" を設定します。
        resp.http.X-Cache-Hits = obj.hits を設定します。
    } それ以外 {
    resp.http.X-Cache = "MISS" を設定します。
    }
    resp.http.X-Powered-By の設定を解除します。
    resp.http.Server の設定を解除します。
    resp.http.X-Drupal-Cache の設定を解除します。
    resp.http.Via の設定を解除します。
    resp.http.Link を設定解除します。
    resp.http.X-Varnish の設定を解除します。
    resp.http.xx_restarts_count = req.restarts を設定します。
    resp.http.xx_Age を resp.http.Age に設定します。
    resp.http.hit_count = obj.hits; を設定します。
        resp.http.Age を設定解除します。
            返す(配達する);
            }

サブvcl_purge{
    戻り値 (synth(200,"成功"));
}
サブvcl_backend_error {
    beresp.status == 500 の場合 ||
        beresp.ステータス == 501 ||
        beresp.ステータス == 502 ||
        beresp.ステータス == 503 ||
        beresp.ステータス == 504) {
        戻る(再試行);
    }
}
サブvcl_fini {
    戻り値 (OK);
}
[root@localhost /]# varnishd -f /usr/local/var/varnish/example.vcl -s malloc,200M -a 0.0.0.0:80
//サービスを開始する

最初のウェブページ

[root@localhost ~]# yum -y httpdをインストールします
[root@localhost ~]# echo aaa > /var/www/html/index.html
[root@localhost ~]# systemctl stop ファイアウォールd
[root@localhost ~]# systemctl httpdを起動します

チャンネル2

[root@localhost ~]# yum -y httpdをインストールします
[root@localhost ~]# echo bbb > /var/www/html/index.html
[root@localhost ~]# systemctl stop ファイアウォールd
[root@localhost ~]# systemctl httpdを起動します

Varnishd を次のように再起動します。

[root@localhost /]# netstat -anpt | grep 80
[root@localhost /]# killall -9 varnishd
[root@localhost /]# varnishd -f /usr/local/var/varnish/example.vcl -s malloc,200M -a 0.0.0.0:80

クライアントアクセスは次のとおりです。

リフレッシュ

[root@localhost /]# curl -X "PURGE" 192.168.148.130
// キャッシュをクリアする

Varnish 設定ファイルの説明

4.0;
輸入ディレクター;
std をインポートします。
# デフォルトのバックエンド定義。コンテンツ サーバーを指すように設定します。
プローブ backend_healthcheck {
    .url="/"; #バックエンドサーバーのルートパスにアクセスします。interval = 5s; #リクエスト時間間隔。timeout = 1s; #リクエストタイムアウト。window = 5; #ポーリング回数を5回に指定します。threshold = 3; #失敗が3回ある場合は、バックエンドサーバーが異常であることを意味します}
backend web1 { #バックエンド サーバーを定義します。host = "192.168.1.7"; #リダイレクトするホスト (つまり、バックエンド ホスト) の IP またはドメイン名。port = "80"; #バックエンド サーバーのポート番号を指定します。probe = backend_healthcheck; #ヘルス チェックは backend_healthcheck で定義されたコンテンツを呼び出します}
バックエンドWeb2 {
    .host = "192.168.1.8";
    .port = "80";
    .probe = backend_healthcheck;
}
acl purgers { #define アクセス制御リスト "127.0.0.1";
    "ローカルホスト";
    「192.168.1.0/24」;
    !"192.168.1.8";
}
sub vcl_init { #vcl_initを呼び出してサブルーチンを初期化し、バックエンドホストグループ(ディレクター)を作成します
    new web_cluster = directors.round_robin(); #新しいキーワードを使用してディレクター オブジェクトを作成し、round_robin アルゴリズムを使用します web_cluster.add_backend(web1); #バックエンド サーバー ノードを追加します web_cluster.add_backend(web2);
}
サブvcl_recv {
    set req.backend_hint = web_cluster.backend(); #リクエストのバックエンドノードを指定します web_cluster で定義されたバックエンドノード if (req.method == "PURGE") { #クライアントのリクエストヘッダーが PURGE かどうかを判断します
        if (!client.ip ~ purgers) { # yes の場合は、クライアントの IP アドレスが ACL アクセス制御リストに含まれているかどうかを確認します。
            return (synth(405, "Not Allowed.")); #そうでない場合は、クライアントに 405 ステータス コードを返し、定義されたページを返します。
    }
    return (purge); #ACLで定義されている場合はpurgeで処理されます。
}
if (req.method != "GET" &&
    要求メソッド != "HEAD" &&
    要求メソッド != "PUT" &&
    要求メソッド != "POST" &&
    要求メソッド != "TRACE" &&
    req.method != "オプション" &&
    req.method != "PATCH" &&
    req.method != "DELETE") { #クライアントのリクエストタイプを判断する return (pipe);
    }
要求メソッドが "GET" で、要求メソッドが "HEAD" の場合 {
    return (pass); #GETでもHEADでもない場合は渡します。
}
必要であれば、req.url を "\.(php|asp|aspx|jsp|do|ashx|shtml)($|\?)" に設定します。
    return (pass); #クライアントが.phpで終わるファイルにアクセスすると、処理のためにpassに渡します。
}
if (req.http.Accept-Encoding) {
    if (req.url ~ "\.(bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)$") {
    unset req.http.Accept-Encoding; #クライアントが受信した圧縮タイプをキャンセルします} elseif (req.http.Accept-Encoding ~ "gzip") {
        set req.http.Accept-Encoding = "gzip"; #gzip タイプがある場合は、gzip タイプをマークします。
    } elseif (req.http.Accept-Encoding ~ "deflate") {
        req.http.Accept-Encoding = "deflate" を設定します。
    } それ以外 {
    unset req.http.Accept-Encoding; #その他の未定義のページも、クライアントが受信した圧縮タイプをキャンセルします。
    }
   }
if (req.url ~ "\.(css|js|html|htm|bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)($|\?)") {
    unset req.http.cookie; #クライアントのクッキー値をキャンセルします。
    return (hash); #リクエストをハッシュサブルーチンに転送し、ローカルキャッシュをチェックします。
}
if (req.restarts == 0) { #クライアントからの最初のリクエストかどうかを判断します。 if (req.http.X-Forwarded-For) { #最初のリクエストの場合は、クライアントの IP アドレスを設定します。
        req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip を設定します。
    } それ以外 {
    req.http.X-Forwarded-For = client.ip を設定します。
    }
}
戻り値(ハッシュ);
}
サブvcl_hash{
    hash_data(req.url); #クライアントが要求したページを表示し、ハッシュ化を実行します
    (http.hostが必要な場合){
        hash_data(req.http.host); #クライアントのホストを設定する} else {
        hash_data(server.ip); #サーバーのIPを設定する
    }
    返す(検索);
}
サブvcl_hit {
    if (req.method == "PURGE") { #HIT であり、クライアント要求タイプが PURGE の場合、ステータス コード 200 を返し、対応するページを返します。
        return (synth(200, "パージされました。"));
    }
    返す(配達する);
}
サブvcl_miss {
  (req.method == "PURGE"の場合){
        return (synth(404, "Purged.")); # ミスの場合は 404 を返します
    }
    返す(フェッチ);
}
サブvcl_deliver {
    (obj.hits > 0)の場合{
        set resp.http.CXK = "HIT-from-varnish"; #http ヘッダー X-Cache = hit を設定します
        set resp.http.X-Cache-Hits = obj.hits; #コマンドの数を返す} else {
    resp.http.X-Cache = "MISS" を設定します。
    }
    unset resp.http.X-Powered-By; #Web バージョンの表示をキャンセルunset resp.http.Server; #Varnish サービスの表示をキャンセルunset resp.http.X-Drupal-Cache; #キャッシュされたフレームワークの表示をキャンセルunset resp.http.Via; #ファイル コンテンツ ソースの表示をキャンセルunset resp.http.Link; #HTML ハイパーリンク アドレスの表示をキャンセルunset resp.http.X-Varnish; #Varnish ID の表示をキャンセル
    set resp.http.xx_restarts_count = req.restarts; #クライアント要求の数を設定します set resp.http.xx_Age = resp.http.Age; #キャッシュされたファイルの長さを表示します #set resp.http.hit_count = obj.hits; #キャッシュヒットの数を表示します #unset resp.http.Age;
    返す(配達する);
}
サブvcl_pass {
    return (fetch); #バックエンドサーバーから返されたデータをローカルにキャッシュします}
サブvcl_backend_response {
    beresp.grace = 5m と設定します。# 追加の猶予時間をキャッシュしますif (beresp.status == 499 || beresp.status == 404 || beresp.status == 502) {
        beresp.uncacheable = true と設定します。#バックエンドサーバーがステータスコード 449 などで応答した場合はキャッシュしません}
    if (bereq.url ~ "\.(php|jsp)(\?|$)") {
        beresp.uncacheable = true と設定します。#PHP ページの場合はキャッシュされません} else {
        if (bereq.url ~ "\.(css|js|html|htm|bmp|png|gif|jpg|jpeg|ico)($|\?)") {
        set beresp.ttl = 15m; #上記で終了したら15分間キャッシュします unset beresp.http.Set-Cookie;
        } elseif (bereq.url ~ "\.(gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)($|\?)") {
            set beresp.ttl = 30m; #30分間キャッシュ unset beresp.http.Set-Cookie;
        } それ以外 {
            beresp.ttl を 10m に設定する; #有効期間 10 分 beresp.http.Set-Cookie を未設定にする;
        }
    }
    返す(配達する);
}
サブvcl_purge{
    戻り値 (synth(200,"成功"));
}
サブvcl_backend_error {
    beresp.status == 500 の場合 ||
        beresp.ステータス == 501 ||
        beresp.ステータス == 502 ||
        beresp.ステータス == 503 ||
        beresp.ステータス == 504) {
        return (retry); #ステータスコードが上記のいずれかの場合、再リクエスト}
}
サブvcl_fini {
    戻り値 (OK);
}

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • CentOS 7.2 は uniapp プロジェクトを展開するための nginx Web サーバーを構築します
  • CentOS 7.x のマスターおよびスレーブ DNS サーバーの展開

<<:  Vueはカードフリップ効果を実現します

>>:  Navicat 8でMySQL用のデータベースを作成する方法

推薦する

MYSQLの文字セット設定方法(端末の文字セット)の詳しい説明

序文ターミナルを使用してデータベースまたはテーブルを作成するたびに、文字セットが latin1 であ...

JavaScriptを使用して独自のAjax関数を定義する

ネイティブJSによって開始されたネットワークリクエストは、クエリ文字列の形でサーバーに送信されるため...

Node.js コード実行をバイパスするためのヒントのまとめ

目次1. 子プロセス2. nodejsでのコマンド実行2.1 16進数エンコード2.2 ユニコードエ...

HTML検証 HTML検証

HTML 検証はHTML 検証を指します。これは、HTML ドキュメントを分析し、標準の HTML ...

MySQLの結合の基本原理についての簡単な説明

目次結合アルゴリズム駆動テーブルと非駆動テーブルの違い1. 単純なネストループ結合、単純なネスト、イ...

MySQL Limitパフォーマンス最適化とページングデータパフォーマンス最適化の詳細な説明

MySQL Limit はセグメント内のデータベース データをクエリでき、主にページングで使用されま...

div の特定の実装は自動的に折り返されず、HTML で折り返されないよう強制されます。

1. 改行なしを実現するには<nobr>タグを使用するコードをコピーコードは次のとおりで...

ウェブサイトのビジュアルデザイン(画像とテキスト)における情報伝達の役割と方法

現代の Web ビジュアル デザインは、初期の情報の積み重ねから、その後のグラフィックスと抽象化、そ...

超シンプルな QPS 統計手法 (推奨)

過去 N 秒間の QPS 値の統計 (1 秒あたりの選択、挿入などを含む) mysql> se...

MySQL NULLデータ変換方法(必読)

MySQL を使用してデータベースをクエリし、左結合を実行すると、関連付けられたフィールドの一部に...

JS でオブジェクトを作成する 4 つの方法

目次1. リテラル値でオブジェクトを作成する2. 新しいキャラクターを使ってオブジェクトを作成する3...

ウェブサイトのコンテンツの100~1%はナビゲーションである

ウェブサイトでは、コンテンツの(100-1)%がナビゲーションです1. ジェシー・ジェームズ・ギャレ...

formData 形式タイプを使用してファイルをアップロードする Vue の例

Vue では、一般的にフロントエンドとバックエンドを分離したプロジェクトがあり、データ操作を実装する...

MySQL 5.7 の sql_mode のデフォルト値によって生じる落とし穴と解決策

通常のプロジェクト開発中に、MySQL バージョンが 5.6 から 5.7 にアップグレードされた場...