Nginx 기초 사용법

1. 개요

Nginx는 고성능의 웹 서버이자 리버스 프록시 서버입니다. 주요 기능으로는 리버스 프록시, 로드 밸런싱, 정적/동적 자원 분리 등이 있으며, 시스템의 성능과 보안을 향상시키기 위해 프로젝트 배포 시 널리 사용됩니다. 아래에서는 Nginx의 핵심 기능들을 살펴보겠습니다.

2. 주요 기능

(1) 포워드 프록시(Forward Proxy)

클라이언트가 인터넷 상의 다른 서버에 접근할 때 프록시 서버를 거치도록 설정하는 방식입니다. 클라이언트에서 직접 프록시 설정을 통해 외부 요청을 먼저 프록시 서버로 전송하고, 이후 실제 목적지로 전달됩니다p>

장점은 다음과 같습니다:

  • 개인 정보 보호: 클라이언트의 실제 IP 주소가 외부 서버에게 노출되지 않습니다.
  • 캐싱 기능: 자주 요청되는 데이터를 캐시에 저장하여 응답 속도를 높일 수 있습니다.
  • 콘텐츠 필터링: 조직이나 회사에서 직원들의 웹 접근을 모니터링하거나 부적절한 사이트를 차단할 수 있습니다.

(2) 리버스 프록시(Reverse Proxy)

클라이언트가 접속하는 서버가 실제로는 프록시 역할을 하는 서버이며, 이 서버가 내부 백엔드 서버들로 요청을 전달합니다. 클라이언트는 중간에 프록시 서버가 있는지 알지 못합니다. 일반적인 활용 사례는 다음과 같습니다:

  • 로드 밸런싱: 여러 백엔드 서버 간에 요청을 분산시켜 단일 서버의 부하를 줄입니다.
  • 보안 강화: 실제 백엔드 서버 주소를 숨겨 추가적인 보안 계층을 제공합니다.
  • 캐싱 및 가속: 정적 자원을 캐싱함으로써 백엔드 서버 부담을 줄이고 응답 속도를 개선할 수 있습니다.

(3) 로드 밸런싱(Load Balancing)

단일 서버에 집중된 요청을 여러 서버로 분산시켜 처리 능력을 확장하고 장애 대비를 하기 위한 방법입니다. 이를 위해 서버 클러스터를 구성하게 되며, Nginx는 다양한 알고리즘을 지원하여 요청을 효율적으로 분배할 수 있습니다:

  1. 라운드 로빈(Round Robin) 기본값으로, 각 요청을 시간 순서대로 하나씩 다른 서버에 할당합니다. 모든 서버의 성능이 동일한 경우 적합합니다.
  2. 가중치 기반 라운드 로빈(Weighted Round Robin) 각 서버에 가중치(weight) 값을 부여해 요청 비율을 조정합니다. 성능 차이가 있을 때 유용하며, 더 높은 성능의 서버에 더 많은 요청을 보내도록 설정할 수 있습니다.
  3. IP 해시(IP Hash) 클라이언트의 IP 주소를 기준으로 해시(hash)하여 특정 서버로 고정시킵니다. 같은 클라이언트는 항상 동일한 서버로 연결되므로 세션 유지에 유리합니다.
  4. 최소 연결 수(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 파일이 포함되어 있으며 메인 설정 파일에서 불러옵니다.

로드 밸런싱 설정 예시

  1. 라운드 로빈 방식
    upstream backend {
        server 127.0.0.1:9201;
        server 127.0.0.1:9301;
    }
    
  2. 가중치 기반
    upstream backend {
        server 127.0.0.1:9201 weight=1;
        server 127.0.0.1:9301 weight=2;
    }
    
  3. IP 해시
    upstream backend {
        ip_hash;
        server 127.0.0.1:9201;
        server 127.0.0.1:9301;
    }
    
  4. 최소 연결 수
    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

태그: nginx reverse-proxy load-balancing docker spring-boot

9월 10일 21:11에 게시됨