NGINX 공유 메모리의 이해와 활용
NGINX 는 고성능 웹 서버로, 공유 메모리를 활용하여 여러 worker process 간 데이터를 효율적으로 공유합니다.
이는 캐싱, 속도 제한, 세션 관리 등 다양한 기능에서 중요한 역할을 합니다. 이 글에서는 NGINX의 공유 메모리 개념, 활용 사례, 설정 방법, 그리고 최적화 및 주의 사항을 자세히 살펴보겠습니다.
목차
1. NGINX 공유 메모리란?
2. NGINX 공유 메모리 활용 사례
2-1. NGINX Cache Management
2-2. NGINX Rate Limit
2-3. NGINX Session Persistence
2-4. NGINX 상태 공유
3. NGINX 공유 메모리 설정 및 최적화
3-1. 공유 메모리 존 설정
3-2. 최적화 팁
4. 주의 사항
5. 결론
1. NGINX 공유 메모리란?
공유 메모리는 NGINX의 워커 프로세스가 공통으로 접근할 수 있는 메모리 공간입니다. 이를 통해 프로세스간 통신(IPC)을 구현하고, 데이터를 빠르게 공유할 수 있습니다. NGINX는 Share Memory Zone을 설정하여 공유 메모리를 관리하며, 이를 통해 모든 worker process가 일관된 데이터를 참조할 수 있습니다.
- 특징: 일반적으로 휘발성 메모리를 사용하여 서버 재시작 시 데이터가 초기화됩니다.
- 장점: 디스트 I/O를 줄이고, 빠른 데이터 접근을 가능하게 합니다.
2. NGINX 공유 메모리 활용 사례
NGINX에서 공유 메모리는 다양한 모듈과 기능에서 활용됩니다. 주요 사례는 다음과 같습니다.
2-1. NGINX Cache Management
NGINX의 프록시 캐시(proxy_cache)는 공유 메모리를 사용하여 캐시 메타데이터를 저장합니다. 이를 통해 모든 worker process가 동일한 캐시 데이터를 참조하여 응답 시간을 단축합니다.
Syntax: proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [min_free=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];Default: —Context: http
예를 들어 아래와 같이 구성할 수 있습니다:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
- keys_zone – 공유 메모리 존의 이름(
my_cache)과 크기(10m)를 정의합니다. - max_size – 디스크에 저장되는 캐시 데이터의 최대 크기를 정의합니다.
- inactive – 캐시 항목이 사용되지 않을 경우 삭제되기까지의 시간을 정의합니다.
2-2. NGINX Rate Limit
NGINX의 limit_req 모듈은 공유 메모리를 사용하여 클라이언트의 요청 속도를 제한합니다. 모든 worker process가 동일한 속도 제한 상태를 공유하여 일관된 제어를 보장합니다.
Syntax: limit_req zone=name [burst=number] [nodelay | delay=number];Default: —Context: http, server, location
예를 들어 아래와 같이 구성할 수 있습니다:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;server { location / { limit_req zone=mylimit burst=20; }}
- zone – 공유 메모리 존의 이름(
mylimit)과 크기(10m)를 정의합니다. - rate – 초당 허용 요청 수를 정의합니다.
- burst – 초과 요청을 일시적으로 허용하는 버퍼 크기를 정의합니다.
2-3. NGINX Session Persistence
세션 유지(sticky session)을 위해 upstream 블록에서 공유 메모리를 사용할 수 있습니다. 이를 통해 클라이언트 요청이 동일한 백엔드 서버로 라우팅되도록 보장합니다.
Syntax: ip_hash;Default: —Context: upstream
예를 들어 아래와 같이 구성할 수 있습니다:
upstream backend { ip_hash; server backend1.example.com; server backend2.example.com;}
- ip_hash – 클라이언트 IP를 기반으로 세션 유지를 구현하며, 공유 메모리를 활용하여 상태를 관리합니다.
NGINX Plus를 사용하면 sticky cookie를 사용하여 보다 효율적인 세션 관리를 할 수 있습니다.
Syntax: sticky cookie name [expires=time] [domain=domain] [httponly] [samesite=strict|lax|none|$variable] [secure] [path=path];sticky route $variable ...;sticky learn create=$variable lookup=$variable zone=name:size [timeout=time] [header] [sync];Default: —Context: upstream
2-4. NGINX 상태 공유
NGINX의 zone_sync 모듈은 공유 메모리를 사용하여 여러 NGINX 인스턴스 간 상태를 동기화합니다. 이는 고가용성(HA) 환경에서 특히 유용합니다.
3. NGINX 공유 메모리 설정 및 최적화
공유 메모리 존의 크기와 설정을 적절히 조정하는 것은 NGINX의 성능과 안정성에 직접적인 영향을 미칩니다.
3-1. 공유 메모리 존 설정
공유 메모리 존은 keys_zone 또는 zone 매개변수를 통해 정의됩니다. 크기는 저장할 데이터의 양과 worker process 수에 따라 결정됩니다.
크기 계산 예시:
- 클라이언트 IP별 속도 제한 데이터를 저장하려면, IP 주소당 약 128bytes가 필요.
- 10,000개의 IP를 추적하려면 약
10,000 * 128bytes = 1.28MB의 메모리가 필요. - 따라서
zone=mylimit:2m으로 설정하면 충분한 여유 공간을 확보할 수 있습니다.
3-2. 최적화 팁
- 적정 크기 설정 – 서버의 메모리 용량과 사용 사례에 맞게 크기를 조정합니다. 너무 작으면 데이터가 누락되고, 너무 크면 메모리 낭비가 발생할 수 있습니다.
- 모니터링 – NGINX 상태 페이지(
stub_status) 또는 NGINX Plus를 사용하여 live activity 대시보드 모니터링 도구를 사용하여 메모리 사용량을 점검할 수 있습니다. - 캐시 정리 –
inactive매개변수를 활용하여 오래된 캐시 데이터를 자동으로 제거할 수 있습니다. - 분산 환경 – 여러 NGINX 인스턴스를 사용할 경우,
zone_sync를 활용하여 메모리 존을 동기화할 수 있습니다.
4. 주의 사항
공유 메모리를 사용할 때는 다음과 같은 점에 유의해야 합니다:
- 충돌 방지 – 동일한 이름의 공유 메모리 존을 중복 정의하지 않도록 주의해야 합니다. 예를 들어,
my_cache라는 존을 두 번 정의하면 오류가 발생합니다. - 휘발성 데이터 – 공유 메모리는 서저 배시작 시 초기화되므로, 중요한 데이터는 디스크에 백업합니다.
- 보안 – 공유 메모리에 민감한 데이터(예: 세션 토큰)를 저장할 경우, 접근 제어를 철저히 설정합니다.
- 메모리 초과 – 공유 메모리 존이 가득 차면 새로운 데이터가 저장되지 않거나 기존 데이터가 덮어씌워질 수 있습니다.
5. 결론
NGINX의 공유 메모리는 캐싱, 속도 제한, 세션 유지 등 다양한 기능에서 worker process 간 효율적인 데이터 공유를 가능하게 합니다. 적절한 공유 메모리 존 설정과 최적화를 통해 NGINX 서버의 성능을 극대화하고, 안정적인 운영 환경을 구축할 수 있습니다. 서버의 메모리 용량과 사용 사례를 고려하여 공유 메모리를 설계하고, 모니터링을 통해 지속적으로 관리하는 것이 중요합니다.
NGINX 상업용 버전을 직접 사용해 보시려면 30일 무료 평가판을 신청하거나 NGINX STORE에 연락하여 논의하십시오.