Maison >Opération et maintenance >Nginx >Quelles sont les méthodes utilisées par Nginx pour implémenter la publication en niveaux de gris ?
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.
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['server_port']==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!