MinIO 및 NGINX Plus 를 사용한 엔터프라이즈급 클라우드 스토리지
해당 포스트는 NGINX와 NGINX Plus 를 MinIO 서버의 리버스 프록시 및 로드 밸런서로 사용하는 방법에 대해 설명합니다. 이 포스트는 NGINX와 NGINX Plus에 모두 적용되며, 간결함을 위해 NGINX Plus에만 언급되었습니다.
목차
1. MinIO 사용 객체 스토리지 설계
2. MinIO 서버에 대한 리버스 프록시 및 로드 밸런서로서의 NGINX Plus
3. MinIO 서버에서의 SSL/TLS Termination
4. Caching
5. Throttling
6. 요약
1. MinIO 사용 객체 스토리지 설계
거의 모든 애플리케이션은 스토리지가 필요하지만, 각 앱은 특정한 방식으로 스토리지를 필요로하고 사용합니다. 예를 들어 문서 스토리지를 살펴보면, 작을 때는 빈번한 읽기 요청을 제공할 필요가 없지만 시간이 지남에 따라 확장이 필요합니다. 이미지 갤러리와 같은 다른 애플리케이션은 요청을 빠르게 처리하고 시간이 지남에 따라 확장해야합니다.
이러한 미묘한 차이로 인해 스토리지 설정이 어려워집니다. 그러나 모든 것이 흑색으로만 보이는 것은 아닙니다.
비정형 데이터를 저장하는 기본 방법으로서의 객체 스토리지의 등장으로 인해 HTTP가 통신 모드로서 기본이 되어 애플리케이션이 스토리지와 통신하는 방식이 표준화되었습니다.
그래도 여전히 남아있는 의문은, 어떻게 애플리케이션 요구사항에 맞게 조정된 객체 스토리지 설정을 구축하면서도 유연성을 유지할 수 있는지입니다.
객체 스토리지는 HTTP 서버와 클라이언트를 포함하므로, HTTP 트래픽을 처리하기 위해 NGINX Plus와 같은 다용도 웹 서버를 앞단에 두는 것이 합리적입니다. 가벼운 객체 스토리지 서버인 MinIO 를 사용하여 확장 가능한 스토리지를 백엔드에서 제공할 수 있습니다. 이러한 시스템의 유연성이 엔터프라이즈급 서비스를 만들기 위한 핵심입니다.

NGINX Plus를 사용하면 관리자는 들어오는 트래픽을 로드 밸런싱하는 것뿐만 아니라 Cache, Throttling, SSL/TLS Termination 및 다양한 매개변수를 기반으로 트래픽을 필터링할 수도 있습니다. 반면 MinIO 는 Amazon S3와 호환되는 경량 객체 스토리지 서버를 제공합니다.
MinIO 는 사진, 비디오, 로그 파일, 백업, VM 및 컨테이너 이미지와 같은 비구조화된 데이터를 저장하는 데 가장 적합합니다. MinIO 서버는 Node.js, Redis 및 MySQL과 유사하게 애플리케이션 스택에 번들로 포함될 수 있을만큼 가볍습니다. MinIO 는 분산 모드도 지원하여 여러 드라이브를 하나의 객체 스토리지 서버로 풀링할 수 있습니다. 심지어 다른 기기에도 가능합니다.
이 포스트에서는 다양한 사용 사례에서 NGINX Plus의 일부 기능을 탐색하고 MinIO와 결합하여 엔터프라이즈 수준의 고도로 확장 가능하고 고가용성이며 안정적인 객체 스토리지 시스템을 구축하는 방법에 대해 알아보겠습니다.
2. MinIO 서버에 대한 리버스 프록시 및 로드 밸런서로서의 NGINX Plus
NGINX Plus는 리버스 프록시 서버로 잘 알려져 있습니다. 그러나 MinIO 에 리버스 프록시가 필요한 이유는 무엇일까요? 몇 가지 사용 사례를 살펴보겠습니다.
- NGINX Plus 리버스 프록시를 하나 이상의 Minio 서버 앞에 두면, 클라이언트나 애플리케이션을 업데이트하지 않고도 MinIO 서버 인스턴스를 시간이 지남에 따라 다른 기기/위치로 이동할 수 있습니다.
- NGINX Plus는 들어오는 트래픽을 로드 밸런싱하여 분산된 Minio 서버 인스턴스에 균등하게 분산시킬 수 있습니다.
- NGINX Plus 프록시는 MinIO와 함께 사용하여 고가용성 객체 스토리지 설정의 일부가 될 수 있으며, MinIO 클라이언트 (mc) 미러 명령을 사용할 수 있습니다.
트래픽을 리버스 프록시합니다.
다음 구성 스니펫에서는 독립 실행형 MinIO 인스턴스가 localhost에서 실행되므로 http://localhost:9000에서 사용할 수 있습니다.
http://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 그룹을 참조하여 사용할 수 있습니다.
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;
}
}
MinIO를 위한 프록시로 NGINX 또는 NGINX Plus를 설정하는 자세한 내용은 MinIO 문서를 참조하십시오.
3. MinIO 서버에서의 SSL/TLS Termination
현재 HTTPS가 대부분의 웹 트래픽에 대한 기본 프로토콜이 되어가고 있으므로, Minio를 위해 단순히 HTTP 서버가 아닌 HTTPS 서버를 배포하는 것이 합리적입니다. NGINX Plus를 HTTPS 서버로 설정하는 것은 상당히 쉽습니다.
시작하기 위해 SSL/TLS 인증서가 필요합니다. Let’s Encrypt는 무료 SSL/TLS 인증서를 제공하며 NGINX Plus와 통합됩니다.
다음 단계는 NGINX Plus 구성 파일을 편집하는 것입니다. 이 단계에서는 서버 블록의 listen 지시문에 ssl 매개변수를 지정하고, 서버 인증서와 개인 키가 포함된 파일을 지정해야 합니다.
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 Termination에 대한 자세한 내용은 NGINX STORE의 “NGINX SSL Termination“을 참조하십시오.
4. Caching
객체 스토리지 서버는 속도로 알려져 있지 않지만, 이는 클라이언트에 대한 느린 응답을 의미하지는 않습니다.
NGINX Plus 서버에서 캐싱을 활성화하면 자주 액세스되는 데이터를 저장하여 백엔드 서버에 요청을 전달하지 않고도 클라이언트에 즉시 반환할 수 있습니다.
작동 방식은 다음과 같습니다. NGINX Plus 웹 캐시는 클라이언트와 MinIO 사이에 위치하여 각 요청된 콘텐츠 파일의 사본을 저장합니다. 클라이언트가 캐시에 저장된 콘텐츠를 요청하면 NGINX Plus는 MinIO에 연락하지 않고 직접 반환합니다. 이는 클라이언트에 대한 응답 시간을 개선하고 객체 스토리지 서버의 부하를 줄이는 데 도움이 됩니다.
NGINX Plus 캐시를 객체 스토리지에 설정하기 위해 proxy_cache_path
및 proxy_cache
지시문을 사용합니다. proxy_cache_path
지시문은 캐시의 위치와 구성을 설정하고, proxy_cache 지시문은 캐시를 활성화합니다. 자세한 내용은 “NGINX Cache 자주 묻는 질문(FAQ)“을 참조하십시오.
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;
}
}
5. Throttling
경우에 따라 비즈니스나 보안 상의 이유로 요청을 제한해야 할 때가 있습니다. NGINX Plus를 사용하면 사용 가능한 대역폭, 요청 수 또는 연결 수를 제한할 수 있습니다.
대역폭을 제한하려면 limit_rate
지시문을 사용하십시오. 이 예제에서는 다운로드 속도를 초당 200 KB로 제한합니다.
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;
# ...
}
}
6. 요약
이 게시물에서는 특히 MinIO 객체 저장 서버 앞에서 로드 밸런싱을 위해 여러 NGINX Plus 기능의 사용법을 보여주었습니다. NGINX Plus와 MinIO의 조합을 사용하면 애플리케이션 요구 사항에 맞게 유연한 객체 저장 서버를 설정할 수 있습니다.
NGINX Plus를 직접 시도해 보려면 30일 무료 평가판을 시작하거나 사용사례에 대해 논의하기 위해 NGINX STORE에 문의하십시오.
아래 뉴스레터를 구독하고 NGINX와 NGINX STORE의 최신 정보들을 빠르게 전달 받아보세요.
댓글을 달려면 로그인해야 합니다.