Network

[Network] Proxy Server, NginX

WY J 2022. 10. 11. 17:03

Proxy Server

프록시 서버는 클라이언트가 서버와 소통할 때, 서버에 바로 접근하지 않고 자신을 통해 서버에 접근할 수 있도록 해주는 대리 서버이다.

보통의 경우엔 지역이 제한되어있는 서비스를 이용하기 위해 우회하거나, 캐시를 통해 더 빠른 이용을 하기 위해 프록시 서버를 사용한다.


Proxy Server 종류

프록시 서버는 위치에 따라 Forward Proxy와 Reverse Proxy 두 가지로 나뉜다.

 

1. Forward Proxy

클라이언트 가까이 위치한 프록시 서버로 클라이언트를 대신해 서버에 요청을 전달한다. 주로 캐싱을 제공하는 경우가 많아 사용자가 빠른 서비스를 이용할 수 있도록 도와준다.

 

클라이언트가 서비스의 서버가 아닌 프록시 서버와 소통하며 응답 데이터를 캐시에 저장해 놓으면 동일한 응답을 빠르게 전달할 수 있다. 또한 프록시 서버를 거친 후 서버에 요청이 도착하기 때문에 서버에서 클라이언트의 IP 추적이 필요한 경우 프록시 서버의 IP가 전달되는 보안상의 이점이 있다.

 

2. Reverse Proxy

Forward Proxy와는 반대로 서버 가까이 위치한 프록시 서버로 서비스 서버를 대신해서 클라이언트에 응답을 제공한다. 로드밸런서를 이용하여 분산처리를 목적으로 하거나 보안을 위해 프록시 서버를 이용할 수 있다.

 

서버에 과부하가 올 경우 부하를 분산할 수 있고, Forward Proxy와는 반대로 클라이언트에게 서버의 IP를 숨길 수 있다.


로드 밸런서

과부하로 인한 서버 장애를 서버의 하드웨어를 업그레이드하는 방법과 서버의 갯수를 늘리는 방법으로 해결할 수 있다.

 

1. Scale-Up

물리적으로 서버의 사양을 높이는 하드웨어적인 방법이다. 프로그램 구현에 있어 변화가 필요없지만, 높은 비용이 든다는 단점이 있다.

 

2. Scale-Out

서버의 갯수를 늘려 부하를 분산시키는 방법이다. 클라이언트로부터 온 요청을 여러대의 서버로 나누는 교통정리 역할을 하는 것이 로드 밸런서이고, 이러한 기술을 로드 밸런싱이라고 부른다.

 

로드 밸런서의 종류

종류 기준
L2 데이터 전송 계층에서 Mac 주소를 바탕으로 로드 밸런싱 합니다.
L3 네트워크 계층에서 IP 주소를 바탕으로 로드 밸런싱 합니다.
L4 전송 계층에서 IP주소와 Port를 바탕으로 로드 밸런싱 합니다.
L7 응용 계층에서 클라이언트의 요청을 바탕으로 로드 밸런싱 합니다. (예, 엔드포인트)

오토스케일링

오토스케일링은 Scale-Out 방식으로 서버를 증설할 때 자동으로 서버를 관리해주는 기능이다. 클라이언트의 요청이 많아지면 새 리소스를 자동으로 추가하고, 반대의 경우엔 리소스를 감소시켜 적절한 분산 환경을 만들어 준다.

 

 

오토스케일링의 장점

 

동적 스케일링

  • 사용자의 요구 수준에 따라 리소스를 동적으로 스케일링 할 수 있다.

로드 밸런싱

  • 로드밸런서와 함께 사용하면 다수의 EC2 인스턴스에게 워크로드를 효과적으로 분배할 수 있어 사용자가 정의한 규칙에 따라 워크로드를 효과적으로 관리 할 수 있다.

타겟 트래킹

  • 사용자는 특정 타겟에 대해서만 오토스케일링 할 수 있다. 사용자가 설정한 타겟에 맞춰 EC2 인스턴스의 수를 조정한다.

헬스 체크와 서버 플릿 관리

  • EC2 인스턴스의 헬스 체크 상태를 모니터링 할 수 있다. 특정 인스턴스에 문제가 감지되면 자동으로 다른 인스턴스로 교체한다.
  • 다수의 EC2 서버에서 애플리케이션을 호스팅 하는 경우, 이들 일련의 EC2 서버 집합을 AWS는 서버 플릿이라 부른다.

웹 서버

 

1. Tomcat

Apache사에서 개발한 서블릿 컨테이너만 있는 오픈 소스 웹 애플리케이션 서버이다. Spring Boot의 내장 서버이기 때문에 별도의 설치가 필요 없다. 자바 애플리케이션을 위한 대표적인 오픈소스 WAS(Web Application Server)이다.

spring-boot-starter-web 모듈에 spring-boot-starter-tomcat 모듈이 포함되어있기 때문에 Spring Boot를 실행할 때 내장되어 있는 Tomcat을 통해 실행되는 것이다.

 

2. Jetty

이클립스 재단의 HTTP 서버이자 오픈 소스 자바 서블릿 컨테이너이다. 경량 웹 애플리케이션이다.

 

Spring Boot의 기본 내장 서버인 Tomcat의 의존성을 제거하고 Jetty의 의존성을 추가하면 Jetty로 실행할 수 있다.

dependencies {
	implementation ('org.springframework.boot:spring-boot-starter-web') {
		exclude module: 'spring-boot-starter-tomcat'
	}
	implementation ('org.springframework.boot:spring-boot-starter-jetty')
}

 

3. NginX - Proxy Server

Nginx는 웹 서버로 클라이언트에게 정적 리소스를 빠르게 응답하기 위한 웹 서버로 사용할 수 있다. 트래픽이 많은 웹 사이트의 확장성을 위해 개발된 고성능 웹 서버이다. 비동기 이벤트 기반으로 적은 자원으로 높은 성능과 동시성을 위해 개발되었다. 클라이언트와 서버 사이에 존재하는 리버스 프록시 서버로 사용할 수 있다.

 

기존의 8080포트를 사용하는 스프링부트로 요청을 주고 받았지만, 스프링부트 앞에 Nginx로 리버스 프록시 서버를 구축하여 소통할 수 있도록 할 수 있다.

 

Nginx 설치 (mac 기준)

brew install nginx

 

Nginx 실행

brew services start nginx

 

Nginx 실행 확인

http://localhost:8080 으로 접속하여 연결 확인

 

 

Nginx 설정 파일 수정

nginx -t
vi /opt/homebrew/etc/nginx/nginx.conf

 

포트 번호를 80으로 변경하고 리버스 프록시 서버로서 Spring Boot 프로젝트에 연동한다.

server {
		listen       80; # (Mac OS) 8080 포트에서 80번 포트로 변경합니다.
...
		location / {
				...
				proxy_pass http://localhost:8080; # 요청을 8080 포트로 넘깁니다.
				proxy_set_header X-Real-IP $remote_addr;
				proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
				proxy_set_header Host $http_host;
		}
}

 

Nginx 재실행 후 localhost 80 포트로 접속하여 확인한다.

brew services restart nginx

 

NginX - Load Balancer

NginX를 통해 로컬환경에서 로드밸런싱을 구성할 수 있다.

 

우선 스프링부트 서버를 실행하기 위해서 프로젝트를 빌드하여 실행한다.

./gradlew build
java -jar sample-0.0.1-SNAPSHOT.jar # 기본 8080 포트 서버 실행
java -Dserver.port=8081 -jar sample-0.0.1-SNAPSHOT.jar # 해당 명령어로 지정한 포트에서 실행할 수 있다.

 

NginX 설정파일을 수정하여 로드 밸런싱을 구성한다.

backend 라는 서버 그룹을 만든 뒤, 그룹 자체로 전달하는 구조이다. proxy_pass 값으로 해당 서버 그룹을 설정한다.

이 후, localhost로 접속하면 8080 포트와 8081 포트가 번갈아가며 연결된다.