> 운영 및 유지보수 > 엔진스 > nginx에서 프록시 프로토콜을 구성하고 사용하는 방법

nginx에서 프록시 프로토콜을 구성하고 사용하는 방법

王林
풀어 주다: 2023-05-18 08:47:26
앞으로
2829명이 탐색했습니다.

    프록시 프로토콜은 nginx에 적용됩니다

    우리는 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에서는 다음 변수를 통해 해당 클라이언트 정보를 얻을 수 있습니다.

    • $proxy_protocol_addr 및 $proxy_protocol_port는 각각 원래 클라이언트의 IP 주소와 포트 번호를 나타냅니다.

    $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에서 프록시 프로토콜 활성화

    nginx가 이미 프록시 프로토콜을 지원하는 버전인 경우 프록시 프로토콜을 활성화하는 것은 매우 간단합니다. 아래와 같이 서버의 수신 대기에 Proxy_protocol을 추가하기만 하면 됩니다.

    http {
        #...
        server {
            listen 80   proxy_protocol;
            listen 443  ssl proxy_protocol;
            #...
        }
    }
       
    stream {
        #...
        server {
            listen 112233 proxy_protocol;
            #...
        }
    }
    로그인 후 복사

    모두 더 친숙한 것은 nginx에서 http/https에 대한 지원을 나타내는 http 블록입니다. Nginx는 TCP/UDP 프로토콜을 지원합니다. 이 기능은 많은 사람들에게 비교적 생소한 stream 모듈을 통해 구현됩니다.

    위 구성을 통해 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'
    로그인 후 복사

    현재 사용 중인 버전이 그렇지 않은 경우 실제 IP가 있습니다. 걱정하지 마세요. 지금은 소스 코드에서 컴파일해야 할 수도 있습니다.

    컴파일 과정에서 구성 명령을 실행해야 합니다. 이 구성 명령에서는 활성화할 기능(예: 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;
        }
    }
    로그인 후 복사

    http와 스트림의 설정이 다릅니다.

    Logging

    Log는 문제를 찾고 데이터의 통계 분석을 수행하는 데 매우 유용한 기능입니다. 물론 실제 클라이언트 IP 주소도 필요합니다.

    아래와 같이 $proxy_protocol_addr 변수를 사용하여 http 및 스트림 블록에 해당 로그를 기록할 수 있습니다.

    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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    원천:yisu.com
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿