
NGINX Reverse Proxy
요청 헤더 수정 및 응답 버퍼링 미세 조정을 지원하는 HTTP 및 기타 프로토콜에 대한 Reverse Proxy로 NGINX Plus 를 구성하세요.
이 문서에서는 Proxy 서버의 기본 구성에 대해 설명합니다. 다양한 프로토콜을 통해 NGINX Plus 에서 Proxy 서버로 요청을 전달하고, Proxy 서버로 전송되는 클라이언트 요청 헤더를 수정하고, Proxy 서버에서 오는 응답의 버퍼링을 구성하는 방법을 배우게 됩니다.
목차
1. 소개
2. Proxy 서버에 요청 전달하기
3. 요청 헤더 전달
4. 버퍼 구성
5. 발신 IP 주소 선택
1. 소개
Proxy는 일반적으로 여러 서버에 부하를 분산하거나, 다른 웹사이트의 콘텐츠를 원활하게 표시하거나, HTTP 이외의 프로토콜을 통해 애플리케이션 서버에 처리 요청을 전달하는 데 사용됩니다.
2. Proxy 서버에 요청 전달하기
NGINX는 요청을 Proxy할 때 요청을 지정된 Proxy 서버로 전송하고 응답을 가져와 클라이언트로 다시 보냅니다. 지정된 프로토콜을 사용하여 HTTP 서버(다른 NGINX 서버 또는 기타 서버) 또는 Non-HTTP 서버(PHP 또는 Python과 같은 특정 프레임워크로 개발된 애플리케이션을 실행할 수 있는 서버)로 요청을 Proxy할 수 있습니다. 지원되는 프로토콜에는 FastCGI
, uwsgi
, SCGI
, memcached
등이 있습니다.
HTTP Proxy 서버에 요청을 전달하려면 location
내에 proxy_pass
지시문을 지정합니다. 예를 들면 다음과 같습니다.
location /some/path/ {
proxy_pass http://www.example.com/link/;
}
이 예제 구성은 이 위치에서 처리된 모든 요청을 지정된 주소의 Proxy 서버로 전달합니다. 이 주소는 도메인 이름 또는 IP 주소로 지정할 수 있습니다. 주소에 포트를 포함할 수도 있습니다.
location ~ \.php {
proxy_pass http://127.0.0.1:8000;
}
위의 첫 번째 예제에서 Proxy된 서버의 주소 뒤에는 URI인 /link/
가 있습니다. 주소와 함께 URI가 지정되면 요청 URI에서 위치 매개변수와 일치하는 부분을 대체합니다. 예를 들어, 여기서는 /some/path/page.html
URI를 가진 요청이 http://www.example.com/link/page.html
로 Proxy됩니다. 주소가 URI 없이 지정되었거나 대체할 URI 부분을 확인할 수 없는 경우 전체 요청 URI가 전달됩니다.
HTTP가 아닌 Proxy 서버로 요청을 전달하려면 적절한 **_pass
지시문을 사용해야 합니다.
fastcgi_pass
는 요청을 FastCGI 서버로 전달합니다.uwsgi_pass
는 요청을 uwsgi 서버로 전달합니다.scgi_pass
는 요청을 SCGI 서버로 전달합니다.memcached_pass
는 memcached 서버에 요청을 전달합니다.
Note: 이 경우 주소 지정 규칙이 다를 수 있습니다. 또한 서버에 추가 매개변수를 전달해야 할 수도 있습니다(자세한 내용은 참조 문서 참조하세요).
proxy_pass 지시문은 지정된 서버 그룹을 가리킬 수도 있습니다. 이 경우 요청은 지정된 방법에 따라 그룹에 있는 서버에 분산됩니다.
3. 요청 헤더 전달
기본적으로 NGINX Plus 는 Proxy된 요청에서 두 개의 헤더 필드인 “Host”와 “Connection”을 재정의하고 값이 빈 문자열인 헤더 필드를 제거합니다. “Host”는 $proxy_host
변수로 설정되고 “Connection”은 close
로 설정됩니다.
이러한 설정을 변경하고 다른 헤더 필드를 수정하려면 proxy_set_header
지시문을 사용합니다. 이 지시문은 location
상위 위치에서 지정할 수 있습니다. 특정 server
컨텍스트 또는 http
블록에서 지정할 수도 있습니다. 예를 들면 다음과 같습니다.
location /some/path/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8000;
}
이 구성에서 “Host” 필드는 $host
변수로 설정됩니다.
헤더 필드가 Proxy된 서버로 전달되지 않도록 하려면 다음과 같이 빈 문자열로 설정합니다:
location /some/path/ {
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:8000;
}
4. 버퍼 구성
기본적으로 NGINX Plus 는 Proxy된 서버의 응답을 버퍼링합니다. 응답은 내부 버퍼에 저장되며 전체 응답이 수신될 때까지 클라이언트로 전송되지 않습니다. 버퍼링은 느린 클라이언트의 성능을 최적화하는 데 도움이 되는데, 응답이 NGINX에서 클라이언트로 동기식으로 전달되면 Proxy된 서버 시간이 낭비될 수 있습니다. 그러나 버퍼링을 사용하도록 설정하면 Proxy된 서버가 응답을 빠르게 처리할 수 있으며, NGINX는 클라이언트가 응답을 다운로드하는 데 필요한 시간만큼 응답을 저장합니다.
버퍼링을 활성화 및 비활성화하는 지시문은 proxy_buffering
입니다. 기본적으로 이 옵션은 on
으로 설정되어 있으며 버퍼링이 활성화되어 있습니다.
proxy_buffers
지시문은 요청에 할당된 버퍼의 크기와 개수를 제어합니다. Proxy된 서버에서 보낸 응답의 첫 번째 부분은 별도의 버퍼에 저장되며, 이 버퍼의 크기는 proxy_buffer_size
지시문으로 설정됩니다. 이 부분은 일반적으로 비교적 작은 응답 헤더를 포함하며 나머지 응답에 대한 버퍼보다 작게 만들 수 있습니다.
다음 예제에서는 기본 버퍼 수를 늘리고 응답의 첫 번째 부분에 대한 버퍼 크기를 기본값보다 작게 설정합니다.
location /some/path/ {
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://localhost:8000;
}
버퍼링을 비활성화하면 클라이언트가 Proxy된 서버에서 응답을 수신하는 동안 응답이 클라이언트에 동기식으로 전송됩니다. 이 동작은 가능한 한 빨리 응답 수신을 시작해야 하는 빠른 대화형 클라이언트에 바람직할 수 있습니다.
원하는 위치에서 버퍼링을 사용하지 않으려면 다음과 같이 off
매개변수가 있는 location
에 proxy_buffering
지시문을 설정합니다.
location /some/path/ {
proxy_buffering off;
proxy_pass http://localhost:8000;
}
이 경우 NGINX Plus 는 응답의 현재 부분을 저장하기 위해 proxy_buffer_size
로 구성된 버퍼만 사용합니다.
Reverse Proxy의 일반적인 용도는 Load Balancing을 제공하는 것입니다.
5. 발신 IP 주소 선택
Proxy 서버에 여러 네트워크 인터페이스가 있는 경우 Proxy 서버 또는 Upstream에 연결하기 위해 특정 소스 IP 주소를 선택해야 하는 경우가 있습니다. 이 기능은 NGINX Plus 뒤에 있는 Proxy 서버가 특정 IP 네트워크 또는 IP 주소 범위의 연결을 허용하도록 구성된 경우에 유용할 수 있습니다.
필요한 네트워크 인터페이스의 proxy_bind
지시문과 IP 주소를 지정합니다.
location /app1/ {
proxy_bind 127.0.0.1;
proxy_pass http://example.com/app1/;
}
location /app2/ {
proxy_bind 127.0.0.2;
proxy_pass http://example.com/app2/;
}
IP 주소는 변수로 지정할 수도 있습니다. 예를 들어 $server_addr
변수는 요청을 수락한 네트워크 인터페이스의 IP 주소를 전달합니다.
location /app3/ {
proxy_bind $server_addr;
proxy_pass http://example.com/app3/;
}