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에 연락하여 논의하십시오.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required