1. ワニスの概要 1. ワニスの紹介 Varnish は、新しいソフトウェア アーキテクチャを使用し、現在のハードウェア システムと密接に連携する、高性能なオープン ソース リバース プロキシ サーバーおよび HTTP アクセラレータです。従来の Squid と比較して、Varnish は高性能、高速、管理が簡単などの利点があります。現在、多くの大規模 Web サイトが Squid の代わりに Varnish の使用を試み始めています。これが Varnish が急速に発展した最も根本的な理由です。 Varnish の主な機能: (1)キャッシュプロキシの場所:メモリまたはディスクのいずれかを使用できます。 2. VarnishとSquidの比較と類似点
ワニスの利点 (1)安定性:VarnishとSquidが同じワークロードを完了する場合、Squidは頻繁に再起動する必要があるため、Squidサーバーの障害が発生する可能性がVarnishよりも高くなります。 ワニスの欠点 (1)Varnishプロセスが再起動されると、キャッシュされたデータはメモリから完全に解放されます。このとき、すべてのリクエストはバックエンドサーバーに送信されます。同時実行性が高い場合、バックエンドサーバーに大きな負荷がかかります。 ワニスの欠点に対する解決策 デメリット 1 について: トラフィックが大きい場合は、Varnish のメモリ キャッシュ モードの使用を開始することをお勧めします。それには、複数の Squid/nginx サーバーが必要です。これは主に、以前の Varnish サービスまたはサーバーが再起動されたときに、大量のリクエストが Varnish に侵入するのを防ぐためです。これにより、Squid/nginx は第 2 層の CACHE として機能し、再起動時にメモリ内の Varnish キャッシュが解放される問題を補うことができます。 3. Varnishの仕組み Varnish サーバーは、クライアントからのリクエストを受信すると、まずキャッシュにデータがあるかどうかを確認します。ある場合は、クライアントに直接応答します。ない場合は、バックエンド サーバーから対応するリソースを要求し、Varnish サーバーにローカルにキャッシュしてから、クライアントに応答します。 ルールと要求されたページの種類に基づいて、データをキャッシュする必要があるかどうかを選択します。リクエスト ヘッダーの Cache-Contorl と Cookie がマークされているかどうかに基づいてキャッシュするかどうかを決定できます。これらの機能は、構成ファイルを記述することで実装できます。 4. シンプルな建築にニスを塗る Varnishは管理プロセスと子プロセスに分かれています
子プロセスによって生成される共通スレッドは
5. ニス本体構成部分
6. VCLには組み込みのプリセット変数があります: 変数(オブジェクトとも呼ばれます): 図のように (1)req:クライアントがVarnishサーバーに要求する際に利用可能な変数。 クライアント Clienet.ip: クライアントのIPアドレスを返します サーバ Server.hostname: サーバーのホスト名 クライアント要求 req (クライアント要求によって送信されたオブジェクト)
Varnish はバックエンド サーバー (bereq) を要求します。
バックエンドサーバーはデータをVarnish beresqに返します
ストレージ
7. 特定の関数ステートメント
8. Varnishリクエストの処理手順 図のように Varnishリクエストの処理手順 受信状態 (vcl_recv)。つまり、リクエスト処理のエントリ状態です。VCL ルールに従って、リクエストをパスするか (vcl_pass)、パイプするか (vcl_pipe)、またはルックアップに入るか (ローカル クエリ) が決定されます。 vcl_recv サブルーチン: return (アクション) を介して要求の処理を開始します。 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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: Navicat 8でMySQL用のデータベースを作成する方法
MySQL Workbench - モデリングおよび設計ツール1. モデルは、最も効果的で高性能なデ...
1. フローティング方式を使用する効果画像: コードは次のとおりです: (.content の高さは...
公式サイトからMySQL-5.7.11-winx64の圧縮版をダウンロード。インストール後、パスワー...
join() メソッド: 指定された区切り文字を使用して配列内のすべての要素を文字列に接続します。例...
拡張版です。質問とSQL文は以下の通りです。ユーザー テーブルを作成し、id、name、gender...
一般的な提案は、WHERE 条件のインデックスを作成することですが、これは実際には一方的です。インデ...
アップグレードプロセス:元のシステム: CentOS7.3 [root@my-e450 ~]# un...
最近、練習プロジェクトをしていたときにスライダーを使う必要があったので、調べてみました。まず、水平ス...
<br />XHTML と CSS がオブジェクト指向だったらよかったのに。 。太陽は北...
質問Nginx は $remote_addr を実際の IP アドレスとして受け取りますが、実際には...
この記事では、小数点付きの星評価を実装するためのVueの具体的なコードを参考までに共有します。具体的...
サンバの概要Samba は、Linux および UNIX システム上で SMB プロトコルを実装する...
vuex 永続状態基本原則: すべての vuex データをローカルストレージに保存し、ページが更新さ...
Linux のufw (Uncomplicated Firewall) を見て、ファイアウォールに変...
IE9 は Microsoft の第二の革命だと言う人もいます。これは誇張ではないと思います。IE6...