Nous savons que nginx est un serveur Web et un serveur proxy. Il fonctionne généralement derrière un serveur proxy ou un logiciel d'équilibrage de charge (Haproxy, Amazon Elastic Load Balancer (ELB)
). Tout d'abord, le client initie une requête au serveur proxy ou au logiciel d'équilibrage de charge, puis la requête sera transmise à nginx pour un accès réel au Web
Parce qu'elle a traversé plusieurs couches de logiciel, certaines informations du client telles que. car l'adresse IP, le numéro de port, etc. peuvent être perdus. Le fait d'être masqué est préjudiciable à notre analyse des problèmes et à nos statistiques de données. Nous espérons obtenir la véritable adresse IP du client afin d'obtenir l'environnement de demande précis. Vous devez utiliser le protocole PROXY. Si le proxy ou LSB mentionné précédemment implémente le protocole PROXY, qu'il s'agisse du protocole HTTP, SSL, HTTP/2, SPDY, WebSocket ou TCP, nginx peut obtenir l'adresse IP d'origine du client et effectuer certaines tâches. les opérations basées sur l'adresse IP d'origine. Les opérations spéciales, telles que le blocage de l'accès à des adresses IP malveillantes, l'affichage de différentes langues ou pages en fonction de différentes adresses IP, ou une journalisation et des statistiques plus simples, sont toutes très efficaces
Bien sûr, si vous le souhaitez. prend en charge le protocole PROXY, vous devez utiliser la version nginx. Il existe également des exigences spécifiques en matière de version :
Si vous souhaitez prendre en charge le protocole PROXY v2, vous avez besoin de NGINX Plus R16 ou NGINX Open Source 1.13. 11.
Si vous souhaitez prendre en charge le protocole ROXY pour HTTP, vous avez besoin de NGINX Plus R3 ou NGINX Open Source 1.5.12
Pour prendre en charge le protocole PROXY côté client TCP, NGINX Plus R7 ou NGINX Open Source 1.9. .3 est requis.
Pour prendre en charge le protocole PROXY pour TCP, NGINX Plus R11 ou NGINX Open Source 1.11.4
Dans nginx, vous pouvez obtenir les informations client correspondantes via les variables suivantes, en particulier comme suit :
$remote_addr et $remote_port représentent l'adresse IP et le port de l'équilibreur de charge
Si vous utilisez le module d'extension RealIP, alors ceci. Le module réécrira les deux valeursde $remote_addr et $remote_port. Il sera remplacé par l'adresse IP et le numéro de port du client d'origine.
Utilisez ensuite $realip_remote_addr et $realip_remote_port pour représenter l'adresse IP et le port de l'équilibreur de charge.
Dans le module d'extension RealIP, la signification de $proxy_protocol_addr et $proxy_protocol_port reste inchangée, qui est toujours l'adresse IP et le numéro de port du client d'origine.
Configurer et utiliser le protocole proxy dans nginx
Nous avons mentionné ci-dessus l'application de base du protocole proxy dans nginx. Parlons de la façon d'effectuer une configuration spécifique dans nginx.
Si votre nginx est déjà une version qui prend en charge le protocole proxy, alors l'activation du protocole proxy est très simple. Il vous suffit d'ajouter proxy_protocol à l'écoute sur le serveur, comme indiqué ci-dessous :
http { #... server { listen 80 proxy_protocol; listen 443 ssl proxy_protocol; #... } } stream { #... server { listen 112233 proxy_protocol; #... } }
Grâce à la configuration ci-dessus, nginx peut prendre en charge le protocole proxy dans le protocole tcp/udp et le protocole http/https.
Utiliser les modules Real‑IP
Les modules Real‑IP sont un module fourni avec nginx. Vous pouvez vérifier si nginx a un module real-ip installé en exécutant la commande suivante :
nginx -V 2>&1 | grep -- 'http_realip_module' nginx -V 2>&1 | grep -- 'stream_realip_module'
Pendant le processus de compilation, nous devons exécuter une commande configure. Dans cette commande configure, nous pouvons spécifier les fonctions à activer, telles que stream ou http_ssl_module :
$ ./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-pcre=../pcre-8.44 --with-zlib=../zlib-1.2.11 --with-http_ssl_module --with-stream --with-mail
Si vous souhaitez activer la fonction real-ip, vous peut ajouter :
--with-http_realip_module
Si nginx s'exécute derrière SLB ou proxy, vous pouvez utiliser la commande set_real_ip_from pour spécifier la plage IP du proxy ou du serveur d'équilibrage de charge, comme indiqué ci-dessous :
server { #... set_real_ip_from 192.168.1.0/24; #... }
Ensuite, nous devons remplacer l'adresse IP de le proxy ou SLB avec l'adresse du vrai client, alors vous pouvez l'utiliser comme ceci :
http { server { #... real_ip_header proxy_protocol; } }
Redirection de demande
Qu'il s'agisse de http ou d'un bloc de flux, vous pouvez rencontrer une situation où la demande est transmise à l'amont suivant. Pour l'amont, ils espèrent recevoir la véritable adresse IP du client, au lieu de l'adresse du proxy ou du slb, cela peut être résolu par les paramètres suivants :
http { proxy_set_header X-Real-IP $proxy_protocol_addr; proxy_set_header X-Forwarded-For $proxy_protocol_addr; }
stream { server { listen 12345; proxy_pass example.com:12345; proxy_protocol on; } }
Logging
Log est une fonction très importante. Elle est très utile pour localiser les problèmes et effectuer une analyse statistique des données. Bien sûr, ce dont nous avons besoin, c'est de la véritable adresse IP du client.
http { #... log_format combined '$proxy_protocol_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; }
stream { #... log_format basic '$proxy_protocol_addr - $remote_user [$time_local] ' '$protocol $status $bytes_sent $bytes_received ' '$session_time'; }
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!