우리는 nginx가 웹 서버이자 프록시 서버라는 것을 알고 있습니다. 이는 일반적으로 프록시 서버 또는 로드 밸런싱 소프트웨어(Haproxy, Amazon Elastic Load Balancer(ELB)
) 뒤에서 작동합니다. 우선, 클라이언트는 프록시 서버나 로드 밸런싱 소프트웨어에 요청을 시작한 다음 실제 웹 액세스를 위해 요청이 nginx로 전달됩니다.
다중 소프트웨어 계층을 통과했기 때문에 클라이언트의 정보 중 일부는 다음과 같습니다. IP 주소, 포트 번호 등이 손실될 수 있으므로 문제 분석 및 데이터 통계에 해를 끼칠 수 있습니다. 이 경우 정확한 요청 환경을 얻기 위해 클라이언트의 실제 IP 주소를 얻으려고 합니다. PROXY 프로토콜을 사용해야 합니다. 앞에서 언급한 프록시 또는 LSB가 HTTP, SSL, HTTP/2, SPDY, WebSocket 또는 TCP 프로토콜인지에 관계없이 PROXY 프로토콜을 구현하는 경우 nginx는 클라이언트의 원래 IP 주소를 가져와 일부 작업을 수행할 수 있습니다. 원래 IP 주소를 기반으로 한 작업, 악성 IP로부터의 접근 차단, 다른 IP를 기반으로 다른 언어나 페이지 표시, 보다 간단한 로깅 및 통계 등의 특수 작업은 모두 매우 효과적입니다
물론, PROXY 프로토콜을 지원하려면 nginx 버전을 사용해야 합니다. 특정 버전 요구 사항은 다음과 같습니다.
PROXY 프로토콜 v2를 지원하려면 NGINX Plus R16 또는 NGINX Open Source 1.13이 필요합니다. 11.
HTTP용 ROXY 프로토콜을 지원하려면 NGINX Plus R3 또는 NGINX Open Source 1.5.12가 필요합니다.
TCP 클라이언트 측 PROXY 프로토콜을 지원하려면 NGINX Plus R7 또는 NGINX Open Source 1.9가 필요합니다.
TCP, NGINX Plus R11 또는 NGINX Open Source 1.11.4에 대한 PROXY 프로토콜을 지원하려면
nginx에서는 다음 변수를 통해 해당 클라이언트 정보를 얻을 수 있습니다.
$remote_addr 및 $remote_port는 로드 밸런서의 IP 주소와 포트를 나타냅니다.
RealIP 확장 모듈을 사용하는 경우 다음과 같습니다. 모듈은 $remote_addr 및 $remote_port의 두 값을 다시 작성합니다. 이는 원래 클라이언트의 IP 주소와 포트 번호로 대체됩니다.
그런 다음 $realip_remote_addr 및 $realip_remote_port를 사용하여 로드 밸런서의 IP 주소와 포트를 나타냅니다.
RealIP 확장 모듈에서 $proxy_protocol_addr 및 $proxy_protocol_port의 의미는 변경되지 않으며 여전히 원래 클라이언트의 IP 주소 및 포트 번호입니다.
nginx에서 프록시 프로토콜 구성 및 사용
위에서 nginx에서 프록시 프로토콜의 기본 적용에 대해 언급했습니다. nginx에서 특정 구성을 수행하는 방법에 대해 이야기해 보겠습니다.
nginx가 이미 프록시 프로토콜을 지원하는 버전인 경우 프록시 프로토콜을 활성화하는 것은 매우 간단합니다. 아래와 같이 서버의 수신 대기에 Proxy_protocol을 추가하기만 하면 됩니다.
http { #... server { listen 80 proxy_protocol; listen 443 ssl proxy_protocol; #... } } stream { #... server { listen 112233 proxy_protocol; #... } }
위 구성을 통해 nginx는 tcp/udp 프로토콜과 http/https 프로토콜 모두에서 프록시 프로토콜을 지원할 수 있습니다.
Real-IP 모듈 사용
Real-IP 모듈은 nginx와 함께 제공되는 모듈입니다. 다음 명령을 실행하여 nginx에 real-ip 모듈이 설치되어 있는지 확인할 수 있습니다.
nginx -V 2>&1 | grep -- 'http_realip_module' nginx -V 2>&1 | grep -- 'stream_realip_module'
컴파일 과정에서 구성 명령을 실행해야 합니다. 이 구성 명령에서는 활성화할 기능(예: stream 또는 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
실제 IP 기능을 활성화하려면 다음을 추가할 수 있습니다:
--with-http_realip_module
nginx가 SLB 또는 프록시 뒤에서 실행 중인 경우 set_real_ip_from 명령을 사용하여 아래와 같이 프록시 또는 로드 밸런싱 서버의 IP 범위를 지정할 수 있습니다.
server { #... set_real_ip_from 192.168.1.0/24; #... }
그런 다음 IP 주소를 바꿔야 합니다. 실제 클라이언트의 주소로 프록시 또는 SLB를 사용하면 다음과 같이 사용할 수 있습니다.
http { server { #... real_ip_header proxy_protocol; } }
요청 전달
http이든 스트림 블록이든 요청이 후속 업스트림으로 전달되는 상황이 발생할 수 있습니다. 업스트림의 경우 프록시나 slb 주소 대신 실제 클라이언트 IP 주소를 받기를 원하며 다음 설정으로 해결할 수 있습니다.
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는 문제를 찾고 데이터의 통계 분석을 수행하는 데 매우 유용한 기능입니다. 물론 실제 클라이언트 IP 주소도 필요합니다.
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'; }
위 내용은 nginx에서 프록시 프로토콜을 구성하고 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!