1. 개요
Nginx는 고성능의 웹 서버이자 리버스 프록시 서버입니다. 주요 기능으로는 리버스 프록시, 로드 밸런싱, 정적/동적 자원 분리 등이 있으며, 시스템의 성능과 보안을 향상시키기 위해 프로젝트 배포 시 널리 사용됩니다. 아래에서는 Nginx의 핵심 기능들을 살펴보겠습니다.
2. 주요 기능
(1) 포워드 프록시(Forward Proxy)
클라이언트가 인터넷 상의 다른 서버에 접근할 때 프록시 서버를 거치도록 설정하는 방식입니다. 클라이언트에서 직접 프록시 설정을 통해 외부 요청을 먼저 프록시 서버로 전송하고, 이후 실제 목적지로 전달됩니다p>
장점은 다음과 같습니다:
- 개인 정보 보호: 클라이언트의 실제 IP 주소가 외부 서버에게 노출되지 않습니다.
- 캐싱 기능: 자주 요청되는 데이터를 캐시에 저장하여 응답 속도를 높일 수 있습니다.
- 콘텐츠 필터링: 조직이나 회사에서 직원들의 웹 접근을 모니터링하거나 부적절한 사이트를 차단할 수 있습니다.
(2) 리버스 프록시(Reverse Proxy)
클라이언트가 접속하는 서버가 실제로는 프록시 역할을 하는 서버이며, 이 서버가 내부 백엔드 서버들로 요청을 전달합니다. 클라이언트는 중간에 프록시 서버가 있는지 알지 못합니다. 일반적인 활용 사례는 다음과 같습니다:
- 로드 밸런싱: 여러 백엔드 서버 간에 요청을 분산시켜 단일 서버의 부하를 줄입니다.
- 보안 강화: 실제 백엔드 서버 주소를 숨겨 추가적인 보안 계층을 제공합니다.
- 캐싱 및 가속: 정적 자원을 캐싱함으로써 백엔드 서버 부담을 줄이고 응답 속도를 개선할 수 있습니다.
(3) 로드 밸런싱(Load Balancing)
단일 서버에 집중된 요청을 여러 서버로 분산시켜 처리 능력을 확장하고 장애 대비를 하기 위한 방법입니다. 이를 위해 서버 클러스터를 구성하게 되며, Nginx는 다양한 알고리즘을 지원하여 요청을 효율적으로 분배할 수 있습니다:
- 라운드 로빈(Round Robin) 기본값으로, 각 요청을 시간 순서대로 하나씩 다른 서버에 할당합니다. 모든 서버의 성능이 동일한 경우 적합합니다.
- 가중치 기반 라운드 로빈(Weighted Round Robin) 각 서버에 가중치(weight) 값을 부여해 요청 비율을 조정합니다. 성능 차이가 있을 때 유용하며, 더 높은 성능의 서버에 더 많은 요청을 보내도록 설정할 수 있습니다.
- IP 해시(IP Hash) 클라이언트의 IP 주소를 기준으로 해시(hash)하여 특정 서버로 고정시킵니다. 같은 클라이언트는 항상 동일한 서버로 연결되므로 세션 유지에 유리합니다.
- 최소 연결 수(Least Connections) 현재 활성 연결 수가 가장 적은 서버로 요청을 전달합니다. 실시간으로 서버 상태를 반영해 부하를 균형 있게 분산시킬 수 있습니다.
(4) 정적/동적 자원 분리
웹 서비스에서는 크게 두 가지 종류의 자원이 존재합니다:
- 정적 자원: CSS, JavaScript, 이미지 파일 등과 같이 서버 처리 없이 바로 제공 가능한 자료입니다.
- 동적 자원: 사용자의 요청에 따라 서버에서 생성되어 반환되는 데이터입니다 (예: API 응답).
Nginx는 이러한 정적 자원을 백엔드 서버에 부담을 주지 않고 직접 처리함으로써 전체 시스템의 성능을 향상시킬 수 있습니다. 또한 정적 자원 특성상 캐싱을 적용하면 응답 속도를 더욱 높일 수 있습니다.
3. 실습 예제
Docker 환경에서 Nginx 컨테이너 실행:
docker run --name test-nginx -d -p 5413:80 nginx
백엔드 테스트용 Spring Boot 컨트롤러 코드:
@RestController
@RequestMapping("/test/nginx")
@Slf4j
public class NginxTestController {
@GetMapping("/info")
public ResponseEntity<String> getInfo() {
log.info("로드 밸런싱 테스트 진행 중");
return ResponseEntity.ok("Success");
}
}
이후에는 Nginx 설정 파일을 수정하여 로드 밸런싱 테스트를 수행합니다.
설정 파일 경로
- 메인 설정 파일:
/etc/nginx/nginx.conf - 추가 설정 디렉토리:
/etc/nginx/conf.d/, 기본적으로default.conf파일이 포함되어 있으며 메인 설정 파일에서 불러옵니다.
로드 밸런싱 설정 예시
- 라운드 로빈 방식
upstream backend { server 127.0.0.1:9201; server 127.0.0.1:9301; } - 가중치 기반
upstream backend { server 127.0.0.1:9201 weight=1; server 127.0.0.1:9301 weight=2; } - IP 해시
upstream backend { ip_hash; server 127.0.0.1:9201; server 127.0.0.1:9301; } - 최소 연결 수
upstream backend { least_conn; server 127.0.0.1:9201; server 127.0.0.1:9301; }
위 설정 후 테스트 URL로 요청을 보내 로그 확인:
http://localhost:5413/test-dev/test/nginx/info