Maison  >  Article  >  Opération et maintenance  >  Comment nginx+iis implémente un équilibrage de charge simple

Comment nginx+iis implémente un équilibrage de charge simple

WBOY
WBOYavant
2023-05-20 09:43:05940parcourir

1. Installation de nginx

nginx est un serveur Web/proxy inverse léger et un serveur proxy de messagerie (imap/pop3), et est publié sous un protocole de type bsd. Il a été développé par le programmeur russe Igor Sysoev et est utilisé par Rambler (russe : рамблер), un grand portail russe et moteur de recherche. Ses caractéristiques sont qu'il occupe moins de mémoire et possède de fortes capacités de concurrence. En fait, les capacités de concurrence de nginx fonctionnent mieux parmi les serveurs Web du même type. Les utilisateurs de sites Web nginx en Chine continentale incluent : Baidu, Sina, NetEase, Tencent, etc.

La dernière version de nginx est la 1.9.3. Celle que j'ai téléchargée est la version Windows. Généralement, le scénario actuel consiste à l'installer sous le système Linux. Le système Linux étant actuellement en cours d'exploration, je ne le présenterai pas ici. . Adresse de téléchargement officielle :. Une fois le téléchargement terminé, décompressez et exécutez nginx.exe pour démarrer nginx. Après le démarrage, vous verrez nginx dans le processus.

Comment nginx+iis implémente un équilibrage de charge simple

Pour réaliser l'équilibrage de charge, vous devez modifier les informations de configuration de conf/nginx.conf. Après avoir modifié les informations de configuration, redémarrez le service nginx. Cela peut être réalisé via la commande nginx -s reload. Ici, nous utilisons un processus par lots fourni par les fourmis pour fonctionner.

Comment nginx+iis implémente un équilibrage de charge simple

Placez le fichier nginx.bat dans le même dossier que nginx.exe et exécutez-le directement. Tous les fichiers utilisés dans cet article seront fournis à la fin de l'article.

Comment nginx+iis implémente un équilibrage de charge simple

2. Construction et configuration du site

1. Construire deux sites iis

Il n'y a qu'une simple page d'index sous le site pour afficher les informations actuelles du serveur. Comme je n'ai pas deux machines, j'ai déployé les deux sites sur cette machine et lié les ports 8082 et 9000 respectivement.

 protected void page_load(object sender, eventargs e)
 {
  label0.text = "请求开始时间:"+datetime.now.tostring("yyyy-mm-dd hh:mm:ss");
  label1.text = "服务器名称:" + server.machinename;//服务器名称 
  label2.text = "服务器ip地址:" + request.servervariables["local_addr"];//服务器ip地址 
  label3.text = "http访问端口:" + request.servervariables["server_port"];//http访问端口"
  label4.text = ".net解释引擎版本:" + ".net clr" + environment.version.major + "." + environment.version.minor + "." + environment.version.build + "." + environment.version.revision;//.net解释引擎版本 
  label5.text = "服务器操作系统版本:" + environment.osversion.tostring();//服务器操作系统版本 
  label6.text = "服务器iis版本:" + request.servervariables["server_software"];//服务器iis版本 
  label7.text = "服务器域名:" + request.servervariables["server_name"];//服务器域名 
  label8.text = "虚拟目录的绝对路径:" + request.servervariables["appl_rhysical_path"];//虚拟目录的绝对路径 
  label9.text = "执行文件的绝对路径:" + request.servervariables["path_translated"];//执行文件的绝对路径 
  label10.text = "虚拟目录session总数:" + session.contents.count.tostring();//虚拟目录session总数 
  label11.text = "虚拟目录application总数:" + application.contents.count.tostring();//虚拟目录application总数 
  label12.text = "域名主机:" + request.servervariables["http_host"];//域名主机 
  label13.text = "服务器区域语言:" + request.servervariables["http_accept_language"];//服务器区域语言 
  label14.text = "用户信息:" + request.servervariables["http_user_agent"];
  label14.text = "cpu个数:" + environment.getenvironmentvariable("number_of_processors");//cpu个数 
  label15.text = "cpu类型:" + environment.getenvironmentvariable("processor_identifier");//cpu类型 
  label16.text = "请求来源地址:" + request.headers["x-real-ip"];
 }

2. Modifiez les informations de configuration nginx

Modifiez le port d'écoute nginx et modifiez la valeur du nœud d'écoute sous le serveur http puisque le port 80 de cette machine est déjà occupé, je l'ai changé en écoute sur le port 8083.

Écoutez 8083;

Ajoutez en amont (cluster de serveurs) sous le nœud http. Les paramètres du serveur sont des informations sur le serveur de cluster. J'ai construit deux sites ici et configuré deux informations.

 #服务器集群名称为jq_one
 upstream jq_one {
   server 127.0.0.1:9000; 
   server 127.0.0.1:8082; 
 }

Recherchez le nœud d'emplacement sous le nœud http et modifiez-le

location / {
  root html;
  index index.aspx index.html index.htm; #修改主页为index.aspx
 #其中jq_one 对应着upstream设置的集群名称
 proxy_pass  http://jq_one; 
 #设置主机头和客户端真实地址,以便服务器获取客户端真实ip
 proxy_set_header host  $host; 
 proxy_set_header x-real-ip $remote_addr; 
 proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
 }

N'oubliez pas de redémarrer le service nginx après avoir modifié le fichier de configuration. Les informations finales complètes sur le fichier de configuration sont les suivantes

3 Résultats d'exécution

Visitez http:/. /127.0.0.1:8083/index .aspx, visitez-le plusieurs fois et concentrez-vous sur les parties marquées en rouge.

Comment nginx+iis implémente un équilibrage de charge simple

Comment nginx+iis implémente un équilibrage de charge simple

Vous pouvez voir que notre demande est distribuée au site 8082 et au site 9000, et la première fois est le site 8082 et la deuxième fois est 9000. Un tel résultat prouve que notre configuration d’équilibrage de charge a réussi. Essayez de fermer 9 000 sites, puis actualisez la page et constatez que le port http de sortie est toujours 8082, ce qui signifie que l'un des sites est en panne. Tant qu'il y a encore un bon site, le nôtre peut toujours servir.

4. Analyse des problèmes

Bien que nous ayons construit un site d'équilibrage de charge, il reste encore les problèmes suivants.

1. Si le site utilise la session et que les requêtes sont réparties uniformément sur les deux sites, alors il doit y avoir un problème de partage de session. Comment le résoudre ?

Utilisez la base de données pour enregistrer les informations de session
Utilisez nginx pour attribuer les requêtes de la même IP au serveur fixe Modifiez comme suit. ip_hash calculera la valeur de hachage correspondant à l'adresse IP, puis l'attribuera à un serveur fixe

  upstream jq_one{
   server 127.0.0.1:8082 ;
    server 127.0.0.1:9000 ;
   ip_hash;
  }

Construira un serveur Redis et lira la session à partir du serveur Redis. L'article suivant présentera l'utilisation du cache distribué Redis
2. Comment l'administrateur met-il à jour les fichiers du site maintenant. Vous pouvez mettre à jour manuellement les fichiers sur deux serveurs, alors faites-le manuellement. . Ce n'est certainement pas réalisable

Les mises à jour de sites multi-serveurs peuvent utiliser le programme de synchronisation de fichiers goodsync, qui détectera automatiquement les modifications de fichiers et les nouveaux ajouts, puis se synchronisera avec d'autres serveurs. Vous pouvez utiliser rsync sous Linux
3. La fonction de téléchargement de fichiers du site distribuera les fichiers sur différents serveurs. Comment résoudre le problème de partage de fichiers.

Utilisez un serveur de fichiers pour stocker tous les fichiers sur ce serveur, et les opérations sur les fichiers, la lecture et l'écriture se font toutes sur ce serveur. Il y a aussi un problème ici, le serveur de fichiers a une limite supérieure de lecture et d'écriture.
4. Les serveurs avec des configurations de charge différentes ont des configurations différentes. Certains sont élevés et d'autres sont faibles. Le serveur avec une configuration plus élevée peut-il gérer plus de requêtes ?

Il existe plusieurs algorithmes pour l'équilibrage de charge : méthode de rotation, méthode de hachage, méthode de connexion minimale, méthode manquante la plus faible, méthode de réponse la plus rapide, méthode pondérée. Nous pouvons ici utiliser la méthode de pondération pour répartir les demandes.

 upstream jq_one{
   server 127.0.0.1:8082 weight=4;
    server 127.0.0.1:9000 weight=1;
  }

     通过weight设置每台服务器分配请求站的权重,值越高分配的越多。

 5.由于请求是经过nginx转发过来的,可以在代码里面获取到用户请求的实际ip地址吗?

答案是肯定的,在localtion节点设置如下请求头信息   

 #设置主机头和客户端真实地址,以便服务器获取客户端真实ip
 proxy_set_header host  $host; 
 proxy_set_header x-real-ip $remote_addr; 
 proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;

    代码里面通过request.headers["x-real-ip"],就能获取到真实ip

 6.nginx实现静态文件(image,js,css)缓存

在server节点下添加新的localtion

 #静态资源缓存设置
 location ~ \.(jpg|png|jpeg|bmp|gif|swf|css)$
 { 
  expires 30d;
  root /nginx-1.9.3/html;#root: #静态文件存在地址,这里设置在/nginx-1.9.3/html下
  break;
 }

    这是index页面的代码

  • Comment nginx+iis implémente un équilibrage de charge simple
  • 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