이 글은 Minio에서 소프트웨어 개발자로 일하는 Nitish Tiwari가 작성한 게스트 블로그 게시물입니다. Minio는 클라우드 애플리케이션과 DevOps 방식의 애플리케이션 개발 및 배포에 특화된 분산 객체 스토리지 서버입니다. Nitish는 소프트웨어 기반 인프라, 특히 스토리지와 분산 시스템에 관심이 많습니다.
이 게시물에서 Nitish는 NGINX와 NGINX Plus를 Minio 서버용 리버스 프록시 및 로드 밸런서로 사용하는 방법을 설명합니다. 이 게시물의 내용은 NGINX와 NGINX Plus에 동일하게 적용되지만, 간결성을 위해 NGINX Plus로만 지칭합니다.
객체 스토리지 설계
거의 모든 애플리케이션에는 스토리지가 필요하지만, 애플리케이션마다 스토리지를 필요로 하고 사용하는 방식은 다릅니다. 예를 들어 문서 저장소는 규모가 작을 때는 빈번한 읽기 요청을 처리할 필요가 없을 수 있지만, 시간이 지남에 따라 확장할 수 있어야 합니다. 이미지 갤러리와 같은 애플리케이션은 요청을 신속하게 처리하는 동시에 시간이 지남에 따라 확장할 수 있어야 합니다.
이러한 미묘한 차이로 인해 스토리지를 설정하기가 어렵습니다. 하지만 상황이 마냥 암울한 것만은 아닙니다. 비정형 데이터를 저장하는 기본 방식으로 객체 스토리지가 자리 잡으면서 HTTP가 기본 통신 방식이 되어 애플리케이션과 스토리지 간의 통신 방식이 표준화되었습니다.
하지만 여전히 의문은 남습니다. 애플리케이션 요구 사항에 맞게 최적화하면서도 유연성을 유지하는 객체 스토리지 환경을 어떻게 구축할 수 있을까요?
객체 스토리지는 HTTP 서버와 클라이언트를 사용하므로, HTTP 트래픽을 처리할 수 있도록 NGINX Plus와 같은 다목적 웹 서버를 프런트엔드에 배치하는 것이 합리적입니다. 백엔드에는 Minio와 같은 경량 객체 스토리지 서버를 사용하여 확장 가능한 스토리지를 제공할 수 있습니다. 이러한 시스템의 유연성은 엔터프라이즈급 서비스를 구축하는 핵심 요소입니다.

NGINX Plus를 사용하면 관리자는 수신 트래픽의 부하를 분산할 수 있을 뿐만 아니라, 트래픽을 캐싱하고 속도를 제한하며 SSL/TLS를 종료하고 다양한 매개변수에 따라 필터링할 수도 있습니다. 한편 Minio는 Amazon S3와 호환되는 경량 객체 스토리지 서버를 제공합니다.
MinIO는 AI 스토리지를 위해 구축되었으며 사진, 동영상, 로그 파일, 백업, VM 및 컨테이너 이미지와 같은 비정형 데이터를 저장하는 데 가장 적합합니다. Minio 서버는 Node.js, Redis, MySQL처럼 애플리케이션 스택에 함께 포함할 수 있을 만큼 가볍습니다. 또한 Minio는 분산 모드를 지원하므로 서로 다른 머신에 있는 드라이브를 포함해 여러 드라이브를 하나의 객체 스토리지 서버로 통합할 수 있습니다.
이 게시물에서는 다양한 사용 사례에서 NGINX Plus의 몇 가지 기능을 살펴보고, 이를 Minio와 결합하여 프로덕션급의 확장성과 가용성이 뛰어난 안정적인 객체 스토리지 시스템을 구축하는 방법을 알아봅니다.
리버스 프록시 및 로드 밸런서로서의 NGINX Plus
NGINX Plus는 리버스 프록시 서버로 잘 알려져 있습니다. 그렇다면 Minio에 리버스 프록시가 필요한 이유는 무엇일까요? 몇 가지 사용 사례를 살펴보겠습니다.
- 하나 이상의 Minio 서버 앞에 NGINX Plus 리버스 프록시를 배치하면 클라이언트나 애플리케이션을 업데이트하지 않고도 필요에 따라 Minio 서버 인스턴스를 다른 머신이나 위치로 자유롭게 이동할 수 있습니다.
- NGINX Plus는 수신 트래픽의 부하를 분산하여 여러 분산형 Minio 서버 인스턴스에 고르게 전달할 수 있습니다.
- NGINX Plus 프록시는 Minio Client(
mc)의mirror명령을 사용하여 Minio 기반 고가용성 객체 스토리지 구성의 일부로 활용할 수 있습니다.
NGINX Plus는 요청을 proxy_pass 지시문에 지정된 URL에서 수신 대기 중인 백엔드 서버로 전달하여 클라이언트 트래픽을 리버스 프록시합니다. 다음 구성 예시에서는 독립 실행형 Minio 인스턴스가 localhost에서 실행되므로 http://localhost:9000에서 사용할 수 있습니다. www.example.com의 최상위 디렉터리(/)로 포트 80을 통해 들어오는 모든 요청은 Minio로 전달됩니다. NGINX Plus는 Host 헤더를 원래 요청의 값으로 명시적으로 설정합니다.
server { listen 80;
server_name www.example.com;
location / {
proxy_set_header Host $http_host;
proxy_pass http://localhost:9000;
}
}Minio 서버가 여러 대인 경우, 해당 서버들을 upstream 구성 블록에 나열하고 proxy_pass 지시문에서 업스트림 그룹을 참조하여 서버 간 트래픽 부하를 분산합니다:
upstream minio_servers { server minio-server-1:9000; server minio-server-2:9000; }
server {
listen 80;
server_name www.example.com;
location / {
proxy_set_header Host $http_host;
proxy_pass http://minio_servers;
}
}NGINX 또는 NGINX Plus를 Minio용 프록시로 설정하는 방법에 대한 자세한 내용은 Minio 설명서를 참조하세요.
SSL/TLS 종료
이제 HTTPS가 많은 웹 트래픽의 기본 프로토콜로 자리 잡고 있으므로 Minio에는 단순한 HTTP 서버보다 HTTPS 서버를 배포하는 것이 합리적입니다. NGINX Plus를 HTTPS 서버로 설정하는 것은 비교적 간단합니다. 시작하려면 SSL/TLS 인증서가 필요합니다. Let’s Encrypt는 무료 SSL/TLS 인증서를 제공하며 NGINX Plus와 통합됩니다.
다음 단계는 NGINX Plus 구성 파일을 편집하는 것입니다. 여기서 ssl 매개변수를 listen 지시문에 지정한 다음, server 블록에서 서버 인증서와 개인 키가 포함된 파일을 지정해야 합니다:
server { listen 80;
server_name www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt; ssl_certificate_key www.example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_set_header Host $http_host;
proxy_pass http://localhost:9000;
}
}SSL/TLS 종료에 대한 자세한 내용은 NGINX Plus 관리자 가이드를 참조하세요.
캐싱
객체 스토리지 서버는 속도가 빠른 것으로 알려져 있지는 않지만, 그렇다고 해서 클라이언트에 대한 응답까지 느려야 하는 것은 아닙니다. NGINX Plus 서버에서 캐싱을 활성화하면 자주 액세스하는 데이터를 저장해 두었다가 요청을 백엔드 서버로 전달하지 않고도 클라이언트에 즉시 반환할 수 있습니다.
작동 방식은 다음과 같습니다. NGINX Plus 웹 캐시는 클라이언트와 Minio 사이에 위치하여 요청된 각 콘텐츠 파일의 사본을 저장합니다. 클라이언트가 캐시에 저장된 콘텐츠를 요청하면 NGINX Plus는 Minio에 연결하지 않고 해당 콘텐츠를 직접 반환합니다. 이를 통해 클라이언트 응답 시간이 단축되고 Minio 서버의 부하도 줄어듭니다.
다음 proxy_cache_path 및 proxy_cache 지시문을 사용하여 Minio용 NGINX Plus 캐시를 설정합니다. proxy_cache_path 지시문은 캐시의 위치와 구성을 설정하고, proxy_cache 지시문은 캐시를 활성화합니다. 자세한 내용은 NGINX 및 NGINX Plus 캐싱 가이드를 참조하세요.
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
# ...
location / {
proxy_cache my_cache;
proxy_set_header Host $http_host;
proxy_pass http://localhost:9000;
}
}속도 제한
비즈니스 또는 보안상의 이유로 요청을 제한해야 하는 경우가 있습니다. NGINX Plus를 사용하면 사용 가능한 대역폭, 요청 수 또는 연결 수를 제한할 수 있습니다.
대역폭을 제한하려면 limit_rate 지시어를 사용합니다. 다음 예에서는 다운로드 속도를 초당 200KB로 제한합니다:
server { # ...
location /images/ {
limit_rate 200k;
# ...
}
}요청 속도를 제한하려면 limit_req 및 limit_req_zone 지시어를 사용합니다. 다음 예시에서는 각 고유 IP 주소의 요청을 초당 10개로 제한하되, 최대 20개의 요청이 일시적으로 몰리는 것을 허용합니다.
limit_req_zone $binary_remote_addr zone=my_req_limit:10m rate=10r/s;
server {
# ...
location /images/ {
limit_req zone=my_req_limit burst=20;
# ...
}
}연결 수를 제한하려면 limit_conn 및 limit_conn_zone 지시어를 사용합니다. 이 예에서는 각 고유 IP 주소의 동시 연결 수를 5개로 제한합니다.
limit_conn_zone $binary_remote_addr zone=my_conn_limit:10m;
server {
# ...
location /images/ {
limit_conn my_conn_limit 5;
# ...
}
}자세한 내용은 NGINX Plus 관리자 가이드를 참조하세요.
요약
이 게시물에서는 부하 분산을 위한 여러 NGINX Plus 기능, 특히 Minio 오브젝트 스토리지 서버 앞단에서 부하를 분산하는 방법을 살펴보았습니다. NGINX Plus와 Minio를 함께 사용하면 애플리케이션 요구 사항에 맞춘 유연한 오브젝트 스토리지 서버를 구축할 수 있습니다.
NGINX Plus를 사용한 부하 분산에 대한 자세한 내용은 다음 블로그 게시물과 기타 자료를 참조하세요:
- 고성능 부하 분산: NGINX 및 NGINX Plus를 활용한 부하 분산에 대한 개괄적인 소개
- NGINX Plus 관리자 가이드
- 로드 밸런싱을 소프트웨어로 전환해야 하는 5가지 이유, 하드웨어 ADC에서 벗어나야 하는 주요 이유를 살펴보는 전자책
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에게서 알아보세요.