NGINX는 다양한 HTTP 기반 애플리케이션을 가속할 수 있는 강력한 프록시입니다. 캐싱, HTTP 연결 처리 및 오프로딩 기능을 통해 애플리케이션 성능을 크게 향상하며, 특히 부하가 높은 시기에 효과적입니다.
편집자 주 – NGINX Plus 릴리스 5 이상에서는 TCP 기반 애플리케이션의 부하 분산도 지원합니다. TCP 부하 분산 기능은 릴리스 6에서 상태 확인, 동적 재구성, SSL 종료 등의 기능이 추가되면서 크게 확장되었습니다. NGINX Plus 릴리스 7<.htmla> 이상에서는 TCP 부하 분산기가 HTTP 부하 분산기와 완전히 동일한 기능을 제공합니다. UDP 부하 분산 지원은 릴리스 9에서 도입되었습니다.
TCP 및 UDP 부하 분산은 stream 컨텍스트에서 http 컨텍스트 대신 구성합니다. HTTP와 TCP/UDP의 본질적인 차이로 인해 사용할 수 있는 지시문과 매개변수가 다소 다릅니다. 자세한 내용은 HTTP 및 TCP Upstream 모듈 설명서를 참조하세요.
NGINX Plus는 다음과 같은 추가 부하 분산 기능을 제공하여 NGINX의 기능을 확장합니다: 상태 검사, 세션 지속성, 실시간 활동 모니터링, 그리고 부하 분산 서버 그룹의 동적 구성.
이 블로그 게시물에서는 여러 웹 서버로 트래픽을 분산하도록 NGINX를 구성하는 과정을 단계별로 안내합니다. 또한 NGINX Plus에서 제공하는 몇 가지 추가 기능도 소개합니다.
더 자세한 내용은 NGINX Plus 관리자 가이드와 이 글의 후속 글인 NGINX 및 NGINX Plus를 사용한 로드 밸런싱, 2부도 참조하세요.
NGINX로 트래픽 프록시하기
먼저 한 쌍의 업스트림 웹 서버로 트래픽을 프록시하겠습니다. 다음 NGINX 구성만으로 포트 80으로 들어오는 모든 HTTP 요청을 처리하고, 업스트림 그룹의 웹 서버에 라운드 로빈 방식으로 전달할 수 있습니다:
http { server {
listen 80;
location / {
proxy_pass http://backend;
}
}
upstream backend {
server web-server1:80;
server web-server2:80;
}
}이 간단한 구성에서는 NGINX가 포트 80에서 수신한 각 요청을 web-server1과 web-server2에 번갈아 전달하며, 요청마다 새로운 HTTP 연결을 설정합니다.
부하 분산 방식 설정
기본적으로 NGINX는 각 서버의 상대적 처리 용량을 나타내기 위해 선택적으로 할당할 수 있는 “weight” 값을 고려하여, 라운드 로빈 방식으로 서버 간에 트래픽을 균등하게 분산합니다.
The IP 해시 방식은 소스 IP 주소의 해시를 기반으로 트래픽을 분산합니다. 동일한 클라이언트 IP 주소에서 들어오는 요청은 항상 동일한 업스트림 서버로 전송됩니다. 이는 서버에 장애가 발생하거나 서버가 복구될 때 또는 업스트림 그룹이 수정될 때마다 다시 계산되는 단순한 세션 지속성 방식입니다. 세션 지속성이 필요한 경우 NGINX Plus에서 더 나은 솔루션을 제공합니다.
The 최소 연결 방식은 각 요청을 활성 연결 수가 가장 적은 업스트림 서버로 전달합니다. 이 방식은 빠르게 처리되는 요청과 복잡한 요청이 혼재된 경우에 효과적입니다.
모든 부하 분산 방식은 weight 매개변수를 선택적으로 server 지시어에 지정하여 조정할 수 있습니다. 서버마다 처리 용량이 다를 때 유용합니다. 다음 예시에서 NGINX는 web-server1보다 web-server2에 4배 더 많은 요청을 전달합니다:
upstream backend { zone backend 64k;
least_conn;
server web-server1 weight=1;
server web-server2 weight=4;
}NGINX에서는 각 워커 프로세스가 가중치를 독립적으로 관리합니다. NGINX Plus는 업스트림 데이터에 공유 메모리 세그먼트(zone 지시문으로 구성)를 사용하므로 워커 간에 가중치가 공유되어 트래픽이 더욱 정확하게 분산됩니다.
장애 감지
NGINX가 서버에 연결하거나, 서버로 요청을 전달하거나, 응답 헤더를 읽는 중에 오류 또는 시간 초과가 발생하면 다른 서버에 연결을 다시 시도합니다. (요청을 재시도할 다른 조건을 정의하려면 구성에 proxy_next_upstream 지시어를 포함할 수 있습니다.) 또한 NGINX는 장애가 발생한 서버를 사용 가능한 서버 집합에서 제외하고, 서버가 복구되었는지 확인하기 위해 간헐적으로 해당 서버에 요청을 보낼 수 있습니다. max_fails 및 fail_timeout 매개변수와 server 지시어를 사용하여 이 동작을 제어할 수 있습니다.
NGINX Plus는 각 업스트림 서버를 대상으로 정교한 HTTP 테스트를 수행하여 활성 상태인지 확인하는 일련의 대역 외 상태 확인 기능과 복구된 서버를 부하 분산 그룹에 점진적으로 다시 투입하는 느린 시작 메커니즘을 추가로 제공합니다:
server web-server1 slow_start=30s;흔히 놓치는 부분 – Host 헤더 수정
업스트림 서버는 요청의 Host 헤더를 사용하여 제공할 콘텐츠를 결정하는 경우가 많습니다. 서버에서 예기치 않은 404 오류가 발생하거나 잘못된 콘텐츠를 제공하고 있음을 시사하는 다른 문제가 있다면, 가장 먼저 이 부분을 확인해야 합니다. 그런 다음 구성에 proxy_set_header 지시어를 추가하여 헤더에 적절한 값을 설정합니다:
location / {
proxy_pass http://backend;
# Rewrite the 'Host' header to the value in the client request
# or primary server name
proxy_set_header Host $host;
# Alternatively, put the value in the config:
#proxy_set_header Host www.example.com;
}NGINX Plus를 사용한 고급 로드 밸런싱
NGINX Plus는 다양한 고급 기능을 제공하므로 여러 업스트림 서버로 구성된 서버 팜 앞단에 배치하기에 이상적인 로드 밸런서입니다:
- 부하 분산 및 세션 지속성 – 워커 프로세스 간 부하 분산을 개선하고 애플리케이션 세션을 식별하여 유지하는 세션 지속성 방식
- HTTP 상태 확인 및 서버 슬로우 스타트 – 비동기식 ‘합성 트랜잭션’을 통해 각 업스트림 서버가 올바르게 작동하는지 점검하고, 서버가 복구되면 ‘슬로우 스타트’ 방식으로 점진적으로 다시 투입
- 실시간 활동 모니터링 – 활동 및 성능을 즉시 보고
- 동적으로 구성되는 업스트림 서버 그룹 – 서버를 안전하게 일시적으로 제거하는 작업 등 일반적인 업스트림 관리 작업을 간편하게 수행할 수 있도록 지원하는 도구
고급 로드 밸런싱 및 프록시에 대한 자세한 내용은 이 글의 후속 게시물인 NGINX 및 NGINX Plus를 사용한 로드 밸런싱, 2부를 참조하세요.
NGINX Plus를 사용해 보려면 지금 30일 무료 평가판을 시작하거나, 로드 밸런싱 사용 사례에 대해 논의하려면 문의해 주세요.
작성자 소개

관련 블로그 게시물
시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.
F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.
Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.
진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.
NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.
Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.