Maison  >  Article  >  Opération et maintenance  >  Quelles sont les méthodes utilisées par Nginx pour implémenter la publication en niveaux de gris ?

Quelles sont les méthodes utilisées par Nginx pour implémenter la publication en niveaux de gris ?

PHPz
PHPzavant
2023-05-19 23:10:052722parcourir

Méthode 1 : En ajustant le poids de l'équilibrage de charge

L'équilibrage de charge est construit sur la structure du réseau existante. Il fournit une méthode peu coûteuse, efficace et transparente pour étendre la bande passante des équipements réseau et des serveurs, augmenter le débit et améliorer les données du réseau. capacités de traitement, améliorant la flexibilité et la disponibilité du réseau.

                    Load Balancing, le nom anglais est Load Balance, ce qui signifie allouer l'exécution à plusieurs unités d'exploitation, telles que les serveurs Web, les serveurs FTP, les serveurs d'applications clés d'entreprise et autres serveurs critiques, etc., afin de terminer le travail tâches ensemble.

Quelles sont les méthodes utilisées par Nginx pour implémenter la publication en niveaux de gris ?

La configuration simple est la suivante :

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; 
    } 
  } 
}

Cette méthode de publication en niveaux de gris est implémentée via le poids, mais cette méthode ne convient que pour modifier le comportement des nœuds, et nécessite que les applications soient exactement les mêmes. L'effet est que le nœud augmente ou Après la suppression, le but ultime de l'ajustement de la capacité de charge est de maintenir l'équilibre du trafic.

Méthode 2. Utilisez nginx+lua pour implémenter la publication en niveaux de gris de projets 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;
}

En raison de l'utilisation du module nginx+lua, cette méthode convient à de nombreux scénarios et est très puissante, mais le problème est que vous pouvez besoin d'apprendre beaucoup de syntaxe Lua.

Méthode 3. Utilisez les informations d'en-tête http pour juger + poids (valeur en niveaux de gris)

Pendant le processus de transmission de la requête HTTP, l'agent utilisateur, l'hôte, le référent, le cookie et d'autres informations seront automatiquement apportés. Il nous suffit de déterminer le segment d'adresse IP, l'agent utilisateur, les informations contenues dans les cookies, etc. Nous prenons ici les cookies comme exemple.

Bien sûr, deux problèmes doivent être résolus ici :

① La première visite sur une page statique peut ne pas générer de cookie

② Nous devons définir dynamiquement l'itinéraire via le code

③ Contrôler la valeur des niveaux de gris via le poids

Nous pouvons utiliser un exemple pour ce faire. Pour résoudre les problèmes ci-dessus ② et ③

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;
    }
 }

Pour le problème ①, nous pouvons accéder à la page dynamique via un script sur la page d'index :

tel que

<script src="https://test.taotaosou.com/cookieinfo.php" /><script>

De plus, nous avons également besoin pour déterminer et générer des cookies dans cookieinfo.php

<?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, "/");
}
?>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer