Préface
Les fonctions de proxy et d'équilibrage de charge de Nginx sont les plus couramment utilisées. La syntaxe et la configuration de base de nginx ont déjà été décrites dansConfiguration détaillée de Nginx. Cet article va droit au but : d'abord décrire les configurations liées au proxy, puis expliquer en détail l'équilibrage de charge.
Notes de configuration du service proxy Nginx
1. Définir l'adresse de redirection de la page 404
error_page 404 https://www.runnob.com; #错误页 proxy_intercept_errors on; #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off.
2. Si notre proxy n'autorise qu'une seule des méthodes de requête GET ou POST
proxy_method get; #支持客户端的请求方法。post/get;
3. Définir la version du protocole HTTP prise en charge
proxy_http_version 1.0 ; #Nginx服务器提供代理服务的http协议版本1.0,1.1,默认设置为1.0版本
4. Si votre serveur nginx agit comme proxy pour deux serveurs web utilisant l'algorithme d'équilibrage de charge round-robin, alors lorsque IIS sur l'une de vos machines est arrêté, ce qui signifie que le service web est inaccessible, le serveur nginx continuera à distribuer des requêtes à ce serveur web inaccessible. Si le temps de connexion de réponse est trop long, la page du client continuera d'attendre une réponse, ce qui dégrade grandement l'expérience utilisateur. Comment pouvons-nous éviter cette situation ? J'ai inclus ici un schéma pour illustrer le problème.

Si web2 dans la configuration d'équilibrage de charge rencontre une telle situation, nginx demandera d'abord web1, mais avec une configuration incorrecte, nginx continuera à distribuer des requêtes à web2 et attendra la réponse de web2 jusqu'à ce que le délai de réponse soit dépassé, puis redistribuera la requête à web1. Si le temps de réponse est trop long, l'utilisateur attendra encore plus longtemps.
La configuration suivante est l'une des solutions.
proxy_connect_timeout 1; #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒 proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。 proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。 proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off.
5. Si vous utilisez la directive upstream pour configurer un groupe de serveurs comme serveurs proxifiés, l'algorithme d'accès entre les serveurs suit les règles d'équilibrage de charge configurées. De plus, cette directive peut être utilisée pour configurer dans quelles conditions anormales les requêtes doivent être transmises au groupe de serveurs suivant, à tour de rôle.
proxy_next_upstream timeout; #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。
Les valeurs de statut peuvent être : error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
- error : Une erreur de serveur se produit lors de l'établissement d'une connexion, de l'envoi d'une requête au serveur proxifié ou de la lecture des informations de réponse.
- timeout : Un délai d'attente se produit lors de l'établissement d'une connexion, de l'envoi d'une requête au serveur proxifié ou de la lecture des informations de réponse.
- invalid_header : L'en-tête de réponse renvoyé par le serveur proxifié est anormal.
- off : Impossible de répartir les requêtes vers le serveur proxifié.
- http_400, ... : Les codes d'état renvoyés par le serveur proxifié sont 400, 500, 502, etc.
6. Si vous souhaitez obtenir l'adresse IP réelle du client via HTTP au lieu de l'adresse IP du serveur proxy, vous devez effectuer les paramètres suivants.
proxy_set_header Host $host; #只要用户在浏览器中访问的域名绑定了 VIP VIP 下面有RS;则就用$host ;host是访问URL中的域名和端口 www.taobao.com:80
proxy_set_header X-Real-IP $remote_addr; #把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中 $X-Real-IP来获取 源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源IP
Pour les articles connexes sur X-Forwarded-For et X-Real-IP, vous pouvez consulter :X-Forwarded-For dans les en-têtes de requête HTTP 。
7. Voici une partie de mon fichier de configuration pour la mise en place du proxy, à titre de référence uniquement.
include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型,默认为text/plain #access_log off; #取消服务日志 log_format myFormat ' $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式 access_log log/access.log myFormat; #combined为日志格式的默认值 sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。 sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。 keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。 proxy_connect_timeout 1; #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒 proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。 proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。 proxy_http_version 1.0 ; #Nginx服务器提供代理服务的http协议版本1.0,1.1,默认设置为1.0版本。 #proxy_method get; #支持客户端的请求方法。post/get; proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off. proxy_ignore_headers "Expires" "Set-Cookie"; #Nginx服务器不处理设置的http相应投中的头域,这里空格隔开可以设置多个。 proxy_intercept_errors on; #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off. proxy_headers_hash_max_size 1024; #存放http报文头的哈希表容量上限,默认为512个字符。 proxy_headers_hash_bucket_size 128; #nginx服务器申请存放http报文头的哈希表容量大小。默认为64个字符。 proxy_next_upstream timeout; #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off #proxy_ssl_session_reuse on; 默认为on,如果我们在错误日志中发现“SSL3_GET_FINSHED:digest check failed”的情况时,可以将该指令设置为off.
Explication de l'équilibrage de charge Nginx
Dans l'articleConfiguration détaillée de Nginx, j'ai mentionné les algorithmes d'équilibrage de charge disponibles dans nginx. Dans cette section, je vais expliquer en détail comment les configurer.
Tout d'abord, laissez-moi expliquer la directive upstream. Cette directive est utilisée pour définir un groupe d'adresses de serveurs proxifiés, puis configurer l'algorithme d'équilibrage de charge. Les adresses des serveurs proxifiés peuvent être écrites de deux manières.
upstream mysvr {
server 192.168.10.121:3333;
server 192.168.10.122:3333;
}
server {
....
location ~*^.+$ {
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
}
}
Passons maintenant à des choses pratiques.
1. Secours à chaud : si vous avez 2 serveurs, le second serveur n'est activé que lorsque le premier serveur rencontre une défaillance. L'ordre dans lequel les serveurs traitent les requêtes : AAAAAA, puis soudain A tombe en panne, BBBBBBBBBBBBBB.....
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
2. Round robin : nginx utilise par défaut le round-robin avec un poids par défaut de 1 pour tous les serveurs. L'ordre dans lequel les serveurs traitent les requêtes : ABABABABAB....
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
}
3. Round robin pondéré : les requêtes sont distribuées à différents serveurs en quantités différentes selon le poids configuré. Si aucun poids n'est défini, le poids par défaut est 1. L'ordre des requêtes pour les serveurs ci-dessous est : ABBABBABBABBABB....
upstream mysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
4. ip_hash : nginx achemine les requêtes provenant de la même IP client vers le même serveur.
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
ip_hash;
}
5. Si vous ne comprenez pas très bien les 4 algorithmes d'équilibrage ci-dessus, vous pouvez consulterConfiguration détaillée de Nginx, ce qui pourrait faciliter la compréhension.
À ce stade, vous pourriez trouver que la configuration de l'équilibrage de charge de nginx est particulièrement simple et puissante. Mais ce n'est pas encore fini. Continuons, et ici je vais faire une petite digression.
Explication de plusieurs paramètres d'état dans la configuration de l'équilibrage de charge de nginx.
-
down : indique que le serveur actuel ne participe temporairement pas à l'équilibrage de charge.
-
backup : machine de secours réservée. Elle ne sera sollicitée que lorsque toutes les autres machines non-backup sont en panne ou occupées, donc cette machine a la charge la plus légère.
-
max_fails : nombre d'échecs de requête autorisés, la valeur par défaut est 1. Lorsque le nombre maximal est dépassé, l'erreur définie par le module proxy_next_upstream est renvoyée.
-
fail_timeout : durée de mise en pause du service après avoir subi max_fails échecs. max_fails peut être utilisé avec fail_timeout.
upstream mysvr {
server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;
}
À ce stade, on peut affirmer que tous les algorithmes d'équilibrage de charge intégrés de nginx ont été couverts. Si vous souhaitez comprendre plus en profondeur les algorithmes d'équilibrage de charge de nginx, nginx fournit officiellement quelques plugins que vous pouvez explorer.
URL de l'article original : https://www.cnblogs.com/knowledgesea/p/5199046.html