본문 바로가기
기타/nginx

Reverse Proxy & Load Balancing

by oneny 2023. 10. 1.

Reverse Proxy

Nginx의 Reverse Proxy는 클라이언트 요청을 다른 서버로 전달하고 해당 서버로부터 받은 응답을 클라이언트에게 반환하는 역할을 하는 중간 서버이다. 이를 통해 Nginx는 여러 가용성 및 보안 기능을 제공하고, 웹 서버나 애플리케이션 서버의 부하 분산을 수행할 수 있다. Reverse Rroxy 서버의 장점은 다음과 같다.

  • 단일 진입점: Reverse Proxy는 여러 도메인 및 경로에 대한 단일 진입점을 제공하여 여러 애플리케이션 서버로 들어오는 클라이언트 요청을 분산하는 로드 밸런싱 기능을 수행할 수 있다. 이를 통해 트래픽을 고르게 분산하고 서버 부하를 분산시키고, 무중단 배포도 지원할 수 있다.
  • 보안 강화: 애플리케이션 서버를 직접 노출하지 않고 Reverse Proxy를 통해 통신하므로 보안이 강화된다. 따라서 악의적인 요청으로부터 애플리케이션을 보호하고 보안 취약성을 최소화할 수 있다.
  • SSL: Reverse Proxy는 클라이언트와의 SSL/TLS 연결을 처리하고 백엔드 서버로는 암호화되지 않은 요청을 전달하여 애플리케이션 서버는 SSL/TLS 암호화 작업을 수행하지 않아도 되므로 성능을 향상시킬 수 있다.
  • 캐싱: Reverse Proxy는 정적 콘텐츠를 캐싱하고 동적 요청을 정적 콘텐츠로 변환하여 클라이언트에게 빠른 응답을 제공할 수 있다.

 

Reverse Rroxy 설정

/etc/nginx/sites-available/default를 통해서 nginx의 설정 파일을 수정했다. 아래 출처에 있는 사이트를 참고했다.

  • proxy_pass http:/(ip주소):8080: proxy_pass 지시문이 reverse proxy의 기능을 수행한다고 생각하면 된다. 즉, 클라이언트 요청을 전달할 애플리케이션 서버의 주소를 지정하면 요청이 들어오게 되면 해당 주소로 포워딩된다.
  • proxy_set_header X-Real-IP $remote_addr: proxy_set_header 지시문은 HTTP 헤더를 설정한다. X-Real-IP라는 사용자 정의 헤더를 설정하고, 그 값을 $remote_addr로 설정한다. 이렇게 하면 애플리케이션 서버에 전달되는 요청 헤더에 클라이언트 실제 IP 주소가 포함된다.
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for: 이 헤더는 클라이언트와 Reverse Proxy를 거치는 중간 프록시 서버의 IP 주소 목록을 포함한다. 이를 통해 백엔드 서버는 요청이 어떤 클라이언트에서 왔는지 파악할 수 있다.
  • proxy_set_header Host $http_host: 요청 헤더의 Host 필드에 원래 클라이언트가 요청한 호스트 이름이 포함된다. 이것은 가상 호스트를 호스팅하는 서버에 필요한 정보이다.

이러한 설정은 Nginx Reverse Proxy를 구성할 때 일반적으로 사용되며, 클라이언트 요청을 애플리케이션 서버로 전달하면서 필요한 헤더 정보를 추가하고 수정하여 애플리케이션 서버가 요청을 올바르게 처리할 수 있도록 할 수 있다.

 

결과

Reverse Proxy가 잘 적용되어 스프링 WAS의 결과를 받은 것을 확인할 수 있다.

 

 

Load Balancing

 

로드 밸런싱은 네트워크 또는 서버 환경에서 트래픽을 여러 애플리케이션 서버로 분산시켜 부하를 고르게 분담하고 시스템의 성능을 향상시키는 기술이다. 주요 목적은 단일 서버에 집중된 트래픽으로 인한 부하와 장애를 방지하고, 서비스의 안전성을 유지하는 것이다.

  • 부하 분산: 로드 밸런서는 클라이언트 요청을 여러 대상 서버로 분배하여 각 서버에 동등한 부하를 유지할 수 있다. 이를 통해 시스템의 전체 처리량을 향상시킬 수 있다.
  • 가용성 향상: 여러 애플리케이션 서버로 요청을 분산시키면 특정 서버의 장애로 인한 서비스 중단을 방지할 수 있다. 만약 한 서버의 장애가 나면 다른 서버로 트래픽을 전환할 수 있어 서비스의 가용성을 향상시킬 수 있다.
  • 확장성: 새로운 서버를 추가하여 시스템의 확장성을 향상시킬 수 있다. 로드 밸런서를 사용하면 서버를 동적으로 추가하거나 제거할 수 있으므로 시스템의 용량을 조절하기 용이하다.

 

Load Balancing 설정

  • upstream backend { ... }: upstream 지시문은 애플리케이션 서버의 그룹을 정의하는데 사용할 수 있다. 이 블록에서는 backend라는 그룹을 정의하고, 이 그룹에 속한 서버들을 나열했다.
  • proxy_pass http://backend: 앞에서 정의한 upstream backend 블록의 백엔드 서버 그룹을 가리키며, 모든 요청은 이 그룹에 속한 서버 중 하나로 전달된다.

Nginx의 기본 로드 밸런싱 알고리즘은 Round Robin(라운드 로빈)이다. 이는 들어오는 요청을 차례대로 각 백엔드 서버에 순서대로 분배하는 방식으로 동작한다. 만약 다른 로드 밸런싱 알고리즘을 적용하고 싶다면 upstream 블록 내에 least_conn, ip_hash, hash, random 등과 같은 지시문과 옵션을 사용하여 설정할 수 있다.

이러한 설정을 통해 로드 밸런싱을 적용하여 서버의 성능 및 가용성을 향상시킬 수 있고, 단일 서버에 집중된 트래픽으로 인한 부하와 장애를 방지하여 서비스의 안전성을 유지할 수 있다.

 

결과

로드 밸런싱이 적용되어 같은 url 요청이더라도 다른 애플리케이션 서버로 요청을 전달함으로써 다른 결과를 응답받는 것을 확인할 수 있다.

 

출처

Java servers like Jetty, GlassFish and Tomcat

NGINX로 Reverse Proxy 및 로드 밸런싱 이해하기

'기타 > nginx' 카테고리의 다른 글

Nginx Performance  (0) 2023.09.30
Nginx Configuration (2/2)  (0) 2023.09.30
Nginx Configuration (1/2)  (0) 2023.09.29
소스코드로 Nginx 시작하기  (0) 2023.09.28