NGINX Plus R32: 성능과 보안 강화의 새로운 도약
NGINX Plus Release 32(R32)의 출시를 발표하게 되어 기쁘게 생각합니다. NGINX Open Source를 기반으로 하는 NGINX Plus는 유일한 all-in-one 소프트웨어 웹 서버, 로드 밸런서, 리버스 프록시, 콘텐츠 캐시 및 API Gateway입니다.
NGINX Plus R32의 새롭고 향상된 기능은 다음과 같습니다:
- SSL Certificate Caching – NGINX Plus R32는 SSL certificate/key 쌍이 반복되는 위치가 많은 구성의 경우 NGINX 시작 시간 및 메모리 사용량이 크게 개선되었습니다.
- Stream_pass 모듈 – 이제 NGINX Plus R32에서는 stream 모듈이 라우터 역할을 할 수 있습니다. stream 모듈에서 http, mail 등의 다른 모듈로 연결을 조건부로 전달하거나 다시 stream 자체로 연결을 전달할 수 있습니다.
- NGINX Plus 공식 컨테이너 이미지 – NGINX Plus R32에서는 권한이 있는 컨테이너 런타임과 권한이 없는 컨테이너 런타임 모두에 대해 공식 NGINX Plus 컨테이너 이미지를 사용할 수 있습니다. 또한 두 배포 방법 모두 NGINX management plane 솔루션과 원활하게 통합할 수 있는 companion daemon인 NGINX Agent가 포함된 컨테이너 이미지(옵션)를 함께 제공합니다.
이번 릴리스의 마무리에는 NGINX Open Source에서 상속된 새로운 기능 및 버그 수정과 NGINX JavaScript 모듈에 대한 업데이트가 포함되어 있습니다.
목차
1. NGINX Plus 중요한 변화
2. OpenTracing 모듈의 사용 중단
3. ModSecurity 모듈 제거
4. PGP Key 업데이트
5. 향후 패키징 및 릴리스 정책
6. NGINX Plus 플랫폼 지원 변경 사항
7. NGINX Plus 새로운 기능 자세히 보기
7-1. NGINX load 동작을 개선하기 위한 SSL 인증서 캐싱
7-2. Stream 모듈에서 다른 모듈로의 연결 전달
7-3. NGINX Plus 컨테이너 이미지
8. 기타 개선 사항 및 버그 수정 NGINX Plus R32
8-1. MQTT 모듈의 버그 수정
8-2. zone_sync 모듈의 버그 수정
8-3. 보안 수정
8-4. NGINX Open Source에서 상속된 변경 사항
8-5. 기능
8-6. 버그 수정
8-7. 보안
8-8. NGINXJavaScript 모듈 변경 사항
8-8-1. 특징
8-8-2. 변경 사항
8-8-3. 버그 수정
9. NGINX Plus 업그레이드 또는 체험
1. NGINX Plus 중요한 변화
참고: NGINX Plus R31 이외의 릴리스에서 업그레이드하는 경우, 이전 공지 블로그의 중요 동작 변경 사항 섹션에서 현재 버전과 이 버전 사이의 모든 릴리스에 대해 확인하시기 바랍니다.
2. OpenTracing 모듈의 사용 중단
NGINX Plus R18에 도입된 OpenTracing 모듈은 더 이상 사용되지 않으며 NGINX Plus R34에서 제거될 예정입니다. 관련 패키지는 그때까지 모든 NGINX Plus 릴리스에서 사용할 수 있습니다. OpenTracing 모듈의 사용은 NGINX Plus R29에 도입된 OpenTelemetry 모듈로 대체할 것을 강력히 권장합니다.
3. ModSecurity 모듈 제거
ModSecurity 모듈은 2024년 3월 31일에 지원이 종료되었습니다. 따라서 ModSecurity 패키지는 NGINX Plus 리포지토리에서 제거되었으며, 앞으로 더 이상 NGINX Plus 리포지토리에서 사용할 수 없습니다.
4. PGP Key 업데이트
NGINX Open Source 및 NGINX Plus 패키지는 PGP Key를 사용하여 서명합니다. 이 key는 2024년 6월 16일에 만료되도록 설정되어 있습니다. 2024년 6월 16일 이후에도 기존 패키지를 계속 확인할 수 있도록 key의 만료일을 업데이트했습니다. 향후 릴리스에 대한 패키지에 설명할 수 있는 새로운 key 쌍을 생성할 예정입니다.
모든 NGINX 사용자는 다음 단계에 따라 업데이트된 PGP Key를 다운로드하여 설치해야 합니다.
Ubuntu/Debian:
wget -qO - https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
RHEL/CentOS
sudo rpm -e gpg-pubkey-7bd9bf62-5762b5f8
sudo rpm --import https://nginx.org/keys/nginx_signing.key
2024년 6월 16일 이후에는 key를 업데이트할 때까지 소프트웨어 서명을 확인할 수 없습니다.
5. 향후 패키징 및 릴리스 정책
향후 NGINX Plus 릴리스에서는 패키징 및 릴리스 정책을 간소화할 예정입니다. 지원되는 운영체제 배포판의 최신 버전에서만 NGINX Plus를 빌드하고 테스트할 것입니다. 이전 배포판에 NGINX Plus를 설치하는 경우 패키지 관리자가 종속 라이브러리 및 패키지 업데이트를 제안할 수 있습니다.
6. NGINX Plus 플랫폼 지원 변경 사항
이번 릴리스에서 지원되는 플랫폼은 다음과 같이 변경되었습니다.
새로운 운영체제:
- Ubuntu 24.04
제거된 운영체제:
- 2023년 12월 31일에 EOL에 도달한 FreeBSD 12
이전 운영체제는 더 이상 사용되지 않으며 NGINX Plus R33에서 제거될 예정입니다:
- CentOS 7/RHEL 7/Oracle Linux 7
- Alpine Linux 3.16
7. NGINX Plus 새로운 기능 자세히 보기
7-1. NGINX load 동작을 개선하기 위한 SSL 인증서 캐싱
이전에는 NGINX에서 인증서, 키 또는 인증서 해지 목록을 참조할 때마다 NGINX 구성에서 로드했습니다. 즉, 동일한 개체를 여러 번 참조하면 해당 개체를 동일한 횟수만큼 다시 로드해야 했습니다. 이 지연 시간은 신뢰할 수 있는 인증서 목록과 같은 지시문을 상속할 때 더 커집니다. 특정 조건에서 이 동작은 NGINX 시작 시간에 상당한 영향을 미치며 구성을 저장하는 데 많은 양의 메모리가 필요할 수 있습니다.
새로운 동작에 따라 SSL 지시문은 이제 캐시된 인증서 파일 및 관련 개체를 참조합니다. 따라서 동일한 인증서 개체를 반복적으로 참조하는 구성의 메모리 사용량과 로드 시간이 크게 줄어듭니다. 이 이점은 많은 수의 위치 블록에서 신뢰할 수 있는 작은 인증서 집합을 참조하는 대규모 NGINX 구성과 관련된 경우에 가장 분명하게 드러납니다.
다음은 약 5,400개의 location 블록(최상위 및 중첩)과 878개의 인증서로 NGINX를 구성한 경우의 로드 시간 개선에 대한 시각화입니다.

그래프의 오른쪽에서 로드 시간이 크게 줄어든 것을 확인할 수 있으며, 평균 로드 시간은 변경 전 약 40초에서 새로운 동작에 따라 약 6초로 감소합니다.
7-2. Stream 모듈에서 다른 모듈로의 연결 전달
NGINX Plus R32는 NGINX Open Source 1.25.5의 기능을 이어받아 NGINX에 새로운 구성 기능을 추가했습니다. 특히 NIGNX Stream 모듈은 이제 라우터로 작동하여 stream 컨텍스트에서 http, mail 등의 다른 컨텍스트로 연결을 전달하거나 stream 컨텍스트 자체 내에서 별도의 가상 서버로 연결을 전달하는 프록시 역할을 할 수 있습니다.
이 기능은 이번 릴리스에 도입된 ngx_stream_pass_module 모둘의 일부로 사용할 수 있습니다. 이 모듈에는 클라이언트 연결을 전달할 주소를 지정하는 데 사용할 수 있는 단일 지시문 “pass”가 있습니다. 주소는 IP 주소와 포트 조합, 소켓 경로로 지정하거나 NGINX 변수로 참조할 수 있습니다.
이 기능을 사용하면 단일 L4 엔드포인트를 통해 모든 트래픽을 실행하려는 고객은 이제 L4 stream 컨텍스트에서 SSL 연결을 Termination하고 stream 컨텍스트 내의 모듈(http, mail) 또는 기타 가상 서버로 전달할 수 있습니다. 또한 서버 이름이나 프로토콜에 따라 SSL 연결을 조건부로 Termination하고 나머지 트래픽을 다른 곳으로 프록시할 수 있습니다. 이로써 단일 엔드포인트에서 트래픽을 관리하기 위한 새로운 구성 동작이 가능해졌습니다.
다음 구성 스니펫은 stream 모듈에서 SSL 연결을 Termination하고, 요청된 서버 이름에 따라 stream 컨텍스트의 http 컨텍스트 또는 다른 가상 서버로 조건부로 전달합니다.
http {
server {
listen 8000;
location / {
return 200 foo;
}
}
}
stream {
map $ssl_server_name $pass_port {
foo.example.com 8000;
default 9001;
}
server {
listen 9000 ssl;
ssl_certificate domain.crt;
ssl_certificate_key domain.key;
pass 127.0.0.1:$pass_port;
}
server{
listen 9001;
return bar\n;
}
}
이 예제에서는 모든 SSL 연결이 stream server 블록에서 Termination됩니다. 들어오는 요청의 서버 이름에 따라 포트 8000에서 수신 대기 중인 http 또는 포트 9001에서 수신 대기 중인 stream 가상 서버로 연결이 전달됩니다.
이 모듈의 또 다른 애플리케이션은 third-part 모듈이 SSL Termination을 지원하지 않는 사용 사례를 처리합니다. 이러한 시나리오에서 stream_pass 모듈은 third-party 모듈에 전달하기 전에 TLS 암호화된 연결을 종료할 수 있습니다.
이 예는 기본적으로 SSL을 지원하지 않는 RTMP 모듈이 stream_pass 모듈을 사용하여 TLS 암호화된 트래픽을 수락하는 방법을 보여줍니다.
rtmp {
server {
listen 1935;#rtmp
application foo{
live on;
}
}
}
stream {
server {
listen 1936 ssl; #rtmps
ssl_certificate domain.crt;
ssl_certificate_key domain.key;
pass 127.0.0.1:1935;
}
}
이 구성 스니펫에서는 SSL 연결이 stream server 블록에서 Termination되고 rtmp로 전달됩니다. 연결은 RTMP 모듈에 암호화되지 않은 상태로 표시되므로 SSL 연결을 지원하기 위한 추가 사용자 지정이나 처리 오버헤드가 필요하지 않습니다.
7-3. NGINX Plus 컨테이너 이미지
NGINX Plus R32에는 권한이 있는 실행과 권한이 없는 실행 모두에 대한 NGINX Plus 컨테이너 이미지의 공식적인 가용성이 포함되어 있습니다. 또한 두 컨테이너 유형 모두 NGINX Agent를 옵션으로 설치하여 NGINX supproted management plane에 쉽게 연결할 수 있습니다. 이미지는 NGINX registry(private-registry.nginx.com)에서 다운로드할 수 있습니다. 다음 지침에 따라 NGINX Plus certificate 및 key 또는 JSON Web Token(JWT)을 사용하여 이미지에 액세스합니다.
8. 기타 개선 사항 및 버그 수정 NGINX Plus R32
8-1. MQTT 모듈의 버그 수정
기본 속성을 사용할 때 잘못된 패킷: 이 릴리스에는 NGINX Plus R29에 도입된 MQTT(Message Queuing Telemetry Transport) 모듈에서 잘못된 패킷을 유발하는 문제에 대한 수정 사항이 포함되어 있습니다. 이전에는 속성 필드가 존재하고 MQTT Connect 메시지의 모든 속성에 대한 기본값이 포함된 경우, 발신 패킷의 길이가 속성 길이 필드(1byte)를 고려하지 않았습니다. 이로 인해 패킷 길이가 예상보다 1byte 짧아져 잘못된 패킷이 발생했습니다. R32의 이 수정은 이 문제를 해결했습니다.
8-2. zone_sync 모듈의 버그 수정
구성 reload 시 메로리 누수: 이전에는 보류 중인 규 동기화 작업에서 해제되지 않은 별도의 풀에서 할당된 chain link를 사용했습니다. 이로 인해 master는 물론 모든 worker process에서 메모리 누수가 발생했습니다. 이번 릴리스의 수정 사항은 pending 대기열에 사이클 풀을 사용하는 이전 영역 동기화 구현으로 되돌아갑니다.
8-3. 보안 수정
실험적인 HTTP3/QUIC 구현에서 다음과 같은 잠재적인 보안 문제가 확인되어 수정되었습니다.
- Heap overflow with write (CVE-2024-32760): 공개되지 않은 HTTP/3 인코더 명령어로 인해 NGINX worker process가 종료되거나 다른 영향이 발생할 수 있습니다.
- Stack overflow/use after free (CVE-2024-31079): 공개되지 않은 HTTP/3 요청으로 인해 NGINX worker process가 종료되거나 다른 영향을 미칠 수 있습니다. 이 공격은 공격자가 가시성이 없고 영향력이 제한적인 connection draining 프로세스 중에 요청의 특정 타이밍을 지정해야 합니다.
- Null pointer dereference with empty header (CVE-2024-35200): 공개되지 않은 HTTP/3 요청으로 인해 NGINX worker process가 종료되거나 다른 영향이 발생할 수 있습니다.
- Memory disclosure during QUIC handshake (CVE-2024-34161): 네트워크 인프라가 조각화 없이 4096 이상의 최대 전송 단위(MTU)를 지원하는 경우, 공개되지 않은 QUIC 메시지로 인해 NGINX worker process가 종료되거나 이전에 해제된 메모리가 누출될 수 있습니다.
8-4. NGINX Open Source에서 상속된 변경 사항
NGINX Plus R32는 NGINX Open Source 1.25.5를 기반으로 하며 NGINX Plus R31이 출시된 이후 기능 변경, 특징 및 버그 수정 사항을 상속합니다(NGINX 1.25.4 및 1.25.5에서).
8-5. 기능
- 기능: stream 모듈의 가상 서버
- ngx_stream_pass_module
- stream 모듈의 “listen” 지시문의 “deffered”, “accept_filter”, “setfib” 매개변수
- 일부 아키텍처에 대한 cache line 크기 감지
- 애플 실리콘에서 홈브루 지원
8-6. 버그 수정:
- Windows 교차 컴파일 버그 수정 및 개선.
- QUIC에서 0-RTT 사용 중 예기치 않은 연결 종료.
- 이전 worker process를 정상적으로 종료하는 동안 보류 중인 AIO 작업과의 연결이 조기에 종료될 수 있었습니다.
- 하위 요청에 AIO가 사용된 경우 worker process에서 소켓 설명자 오류, 소켓 누수 또는 세그멘테이션 오류(SSL 프록시의 경우)가 발생할 수 있습니다.
- SSL 프록시가 “image_filter” 지시문과 함께 사용되었고 코드 415의 오류가 “error_page” 지시문으로 리다이렉션된 경우 worker process에서 세그멘테이션 오류가 발생할 수 있습니다.
- HTTP/3의 버그 수정 및 개선.
8-7. 보안
- HTTP/3을 사용할 때 특수하게 제작된 QUIC 세션을 처리하는 동안 worker process에서 세그먼트 분할 오류가 발생할 수 있습니다(CVE-2024024989, CVE-2024-24990).
최근 릴리스에서 상속된 새로운 변경 사항, 기능, 버그 수정 및 해결 방법의 전체 목록은 NGINX 변경 사항 파일을 참조하세요.
8-8. NGINX JavaScript 모듈 변경 사항
NGINX Plus R32에는 NGINX JavaScript(njs) 모듈 버전 0.8.4의 변경 사항이 통합되어 있습니다. 다음은 0.8.2(NGINX Plus R31과 함께 제공된 버전) 이후 njs의 주목할 만한 변경 사항 목록입니다.
8-8-1. 특징
- 기능: 발신 헤더에 대한 서버 헤더를 설정할 수 있습니다.
- 기능: CLI에서 QuickJS 엔진 지원
8-8-2. 변경 사항
- 개선: r.subrequest()에서 URI 및 args 인수의 유효성 검사.
- 개선: 중복된 js_set 변수가 있는지 확인합니다.’
8-8-3. 버그 수정
- 버그 수정: Headers.set()을 수정했습니다.
- 버그 수정: 버퍼 값으로 js_set을 수정했습니다.
- 버그 수정: 시간 초과가 지정되지 않은 경우 shared dictionary의 clear() 메서드를 수정했습니다.
- 버그 수정: js_periodic이 활성화된 경우 stub_status 통계를 수정했습니다.
- 버그 수정: libxml2 2.12 이상에서 빌드를 수정했습니다.
- 버그 수정: 오버플로우 및 NaN 값에 대한 Date 생성자를 수정했습니다.
- 버그 수정: querystring.parse()의 언더플로우를 수정했습니다.
- 버그 수정: String.prototype.match()에서 잠재적인 버퍼 오버라이드를 수정했습니다.
- 버그 수정: for-in 루프의 구문 분석을 수정했습니다.
- 버그 수정: 자릿수가 없는 16진수, 8진수 및 이진 리터럴의 구문 분석을 수정했습니다.
- 버그 수정: 0.8.3에 도입된 타임아웃이 없는 shared dictionary의 clear() 메서드를 수정했습니다.
- 버그 수정: Buffer 인수가 있는 타임아웃이 없는 shared dictionary의 r.send() 메서드를 수정했습니다.
- 버그 수정: 패딩되지 않은 base64 문자열이 있는 atob()을 수정했습니다.
모든 기능, 변경 사항 및 버그 수정에 대한 전체 목록은 njs 변경 로그를 참조하세요.
9. NGINX Plus 업그레이드 또는 체험
NGINX Plus를 실행 중인 경우 가능한 한 빨리 NGINX Plus R32로 업그레이드할 것을 강력히 권장합니다. 모든 훌륭한 새 기능 외에도 몇 가지 추가 수정 및 개선 사항이 적용되어 지원 티켓을 제기해야 하는 경우 NGINX에서 더 쉽게 도움을 받을 수 있습니다.
NGINX Plus 사용자가 아니라면 한 번 사용해 보시기 바랍니다. 보안, 로드 밸런싱, API Gateway 사용 사례에 사용하거나 향상된 모니터링 및 관리 API를 통해 완벽하게 지원되는 웹 서버로 사용할 수 있습니다.
NGINX Plus를 직접 사용해 보시려면 30일 무료 평가판을 신청하거나, NGINX STORE에 연락하여 논의하십시오.
댓글을 달려면 로그인해야 합니다.