ホームページ  >  記事  >  運用・保守  >  Nginx がグレースケール パブリッシングを実装するにはどのような方法がありますか?

Nginx がグレースケール パブリッシングを実装するにはどのような方法がありますか?

PHPz
PHPz転載
2023-05-19 23:10:052721ブラウズ

方法 1: 負荷分散の重みを調整する

負荷分散は既存のネットワーク構造上に構築され、ネットワーク機器とサーバーを拡張するための安価で効果的かつ透過的な方法を提供します。帯域幅を増やし、スループットを向上させ、ネットワーク データ処理機能を強化し、ネットワークの柔軟性と可用性を向上させます。

ロード バランシング (英語名は Load Balance) は、Web サーバー、FTP サーバー、エンタープライズ キー アプリケーション サーバー、その他のミッションクリティカルなサーバーなどの複数のオペレーティング ユニットに実行を割り当てることを意味します。仕事のタスクを一緒に完了するために。

Nginx がグレースケール パブリッシングを実装するにはどのような方法がありますか?

簡単な構成は次のとおりです:

http { 
  upstream cluster { 
    ip_hash; #如果你的系统中没有使用第三方缓存管理工具 ,建议使用此方式
    server 192.168.1.210:80 weight=5; 
    server 192.168.1.211:80 weight=3; 
    server 192.168.1.212:80 weight=1; 
  } 
  
  server { 
    listen 80; 
 
  location / { 
  
  proxy_next_upstream   error timeout;
  proxy_redirect     off;
  proxy_set_header    host $host;
  #proxy_set_header    x-real-ip $remote_addr;
  proxy_set_header    x-real-ip $http_x_forwarded_for;
  proxy_set_header    x-forwarded-for $proxy_add_x_forwarded_for;
  client_max_body_size  100m;
  client_body_buffer_size 256k;
  proxy_connect_timeout  180;
  proxy_send_timeout   180;
  proxy_read_timeout   180;
  proxy_buffer_size    8k;
  proxy_buffers      8 64k;
  proxy_busy_buffers_size 128k;
  proxy_temp_file_write_size 128k;
  proxy_pass http://cluster; 
    } 
  } 
}

このグレースケール パブリッシュ方法は重み付けによって実装されますが、この方法は動作を変更する場合にのみ適しています。アプリケーションはすべてまったく同じであり、その基本的な機能はノードの追加または削除後に負荷容量を調整することであり、最終的な目標はトラフィックのバランスを保つことです。

方法 2. nginx lua を使用して Web プロジェクトのグレースケール公開を実装する

location / {
 content_by_lua '
      myip = ngx.req.get_headers()["x-real-ip"]
      if myip == nil then
        myip = ngx.req.get_headers()["x_forwarded_for"]
      end
      if myip == nil then
        myip = ngx.var.remote_addr
      end
      if myip == "公司出口ip" then
        ngx.exec("@client")
      else
        ngx.exec("@client_test")
      end
    ';
} 

location @client{
  proxy_next_upstream   error timeout;
  proxy_redirect     off;
  proxy_set_header    host $host;
  #proxy_set_header    x-real-ip $remote_addr;
  proxy_set_header    x-real-ip $http_x_forwarded_for;
  proxy_set_header    x-forwarded-for $proxy_add_x_forwarded_for;
  client_max_body_size  100m;
  client_body_buffer_size 256k;
  proxy_connect_timeout  180;
  proxy_send_timeout   180;
  proxy_read_timeout   180;
  proxy_buffer_size    8k;
  proxy_buffers      8 64k;
  proxy_busy_buffers_size 128k;
  proxy_temp_file_write_size 128k;
  proxy_pass http://client;

}
location @client_test{
  proxy_next_upstream   error timeout;
  proxy_redirect     off;
  proxy_set_header    host $host;
  #proxy_set_header    x-real-ip $remote_addr;
  proxy_set_header    x-real-ip $http_x_forwarded_for;
  proxy_set_header    x-forwarded-for $proxy_add_x_forwarded_for;
  client_max_body_size  100m;
  client_body_buffer_size 256k;
  proxy_connect_timeout  180;
  proxy_send_timeout   180;
  proxy_read_timeout   180;
  proxy_buffer_size    8k;
  proxy_buffers      8 64k;
  proxy_busy_buffers_size 128k;
  proxy_temp_file_write_size 128k;
  proxy_pass http://client_test;
}

nginx lua モジュールを使用するため、この方法は多くのシナリオに適しており、非常に強力ですが、問題は、Lua の構文を多く学習する必要があるかもしれないということです。

方法 3. http ヘッダー情報を使用して重み (グレースケール値) を決定します。

http リクエストの送信プロセス中に、ユーザー エージェント、ホスト、リファラーは自動的に含まれる Cookie およびその他の情報。 IP アドレス セグメント、ユーザー エージェント、Cookie 内の情報などを判断するだけで済みます。ここでは Cookie を例として取り上げます。

もちろん、ここでは 2 つの問題を解決する必要があります:

①静的ページへの最初の訪問では Cookie が生成されない可能性がある

②コードを通じてルートを動的に設定する必要がある

③重みによるグレー値の制御

##例を使用して、上記の②と③の問題を解決できます。

upstream tts_v6 {
    server 192.168.3.81:5280 max_fails=1 fail_timeout=60;
}
upstream tts_v7 {
    server 192.168.3.81:5380 max_fails=1 fail_timeout=60;
}
upstream default {  #通过upstream default + weight节点控制权重
    server 192.168.3.81:5280 max_fails=1 fail_timeout=60 weight=5;
    server 192.168.3.81:5380 max_fails=1 fail_timeout=60 weight=1;
}
server {
    listen 80;
    server_name test.taotaosou.com;
    access_log logs/test.taotaosou.com.log main buffer=32k;
    #match cookie
    set $group "default";
    if ($http_cookie ~* "tts_version_id=tts1"){ #动态控制路由
        set $group tts_v6;
    }
    if ($http_cookie ~* "tts_version_id=tts2"){
        set $group tts_v7;
    }
    location / {            
        proxy_pass http://$group;
        proxy_set_header  host       $host;
        proxy_set_header  x-real-ip    $remote_addr;
        proxy_set_header  x-forwarded-for $proxy_add_x_forwarded_for;
        index index.html index.htm;
    }
 }

問題①については、スクリプトを通じてダイナミクスにアクセスできますインデックス ページ上 ページ:

<script src="https://test.taotaosou.com/cookieinfo.php" /><script>
など)さらに、cookieinfo.php で cookie

<?php

if(!session_id())
{
 session_start();
}
if(!isset($_cookie["tts_version_id"]))
{
 $cookievalue = $_server[&#39;server_port&#39;]==5280?"tts1":"tts2";
 setcookie("tts_version_id", $cookievalue, time()+3600, "/");
}
?>
を決定して生成する必要もあります。

以上がNginx がグレースケール パブリッシングを実装するにはどのような方法がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。