NGINX Plus 릴리스 21(R21)이 출시되었음을 기쁘게 알려드립니다. NGINX Open Source를 기반으로 하는 NGINX Plus는 로드 밸런서, 콘텐츠 캐시, 웹 서버 및 API 게이트웨이를 모두 갖춘 유일한 올인원 솔루션입니다. 4억 5천만 개 이상의 웹사이트가 NGINX를 사용하고 있는 만큼, NGINX Plus R21은 그 어느 때보다 뛰어난 안정성과 보안성을 제공하며, 주로 NGINX Open Source의 버그 수정 및 안정성 개선 사항을 반영하는 데 중점을 두었습니다.
NGINX Plus R21의 새로운 기능은 다음과 같습니다:
- 동적 gRPC 프록시 – 백엔드 gRPC 서비스로 gRPC 연결을 전달할 때 변수를 사용할 수 있도록 지원을 추가했습니다. 이를 통해 클라이언트 속성에 따라 gRPC 연결을 서비스 그룹으로 동적으로 라우팅할 수 있습니다.
- NGINX JavaScript 모듈 개선 사항 – NGINX JavaScript 모듈(njs)이 버전 0.3.9로 업데이트되었으며, 여러 버그 수정과 하위 요청 및 파일 시스템 지원과 관련된 추가 기능 개선 사항이 포함되었습니다.
중요한 동작 변경 사항
- 허용 가능한 요청 – RFC 7230에 따라 NGINX Plus는 더 이상 여러 개의
Host헤더가 포함된 클라이언트 요청을 허용하지 않습니다. - 새롭게 지원되는 운영 체제 – Alpine Linux 3.11.
- 더 이상 지원되지 않는 이전 운영 체제 – 32비트 플랫폼(i386 아키텍처).
품질에 대한 투자
효율적인 소프트웨어와 코드 품질은 오픈 소스 NGINX와 NGINX Plus를 개발하는 데 있어 핵심 원칙입니다.
NGINX 팀은 상용 소프트웨어에서 기대할 수 있는 모든 최신 CI/CD 및 자동화 테스트 도구를 활용합니다. 매일 실시되는 테스트 결과, 현재 개발 브랜치의 ‘결함 밀도’는 코드 1,000줄당 단 0.01개로 매우 낮게 나타났습니다. 이는 비슷한 규모의 코드베이스에서 평균적으로 코드 1,000줄당 0.7개의 결함이 발생하는 것과 비교됩니다.
또한 오픈 소스 및 NGINX Plus 구성 요소 모두에 대해 외부 독립 기관에 침투 테스트와 코드 검토를 의뢰합니다. 최근 실시한 침투 테스트와 코드 검토에서 여러 문제가 발견되었으며, 이번 릴리스에서 해당 문제를 해결했습니다.
버그 수정
NGINX Plus R21에는 총 14개의 버그 수정 사항이 포함되어 있습니다:
- HTTP/2 사용 시 소켓 누수(서로 다른 두 가지 버그)
- Socket leak when using subrequests in the njs 모듈에서 하위 요청과
aio지시어를 사용할 때 발생하는 소켓 누수 - 다음에서 발생할 수 있는 메모리 고갈 문제: WebDav 모듈
- 잠재적인 메모리 정보 노출이 MP4 모듈에서 발생할 수 있음
- 상태 코드
494오류가400대신 반환되었습니다. 이는 코드가494인 오류가error_page지시어를 통해 리디렉션되었을 때 발생했습니다. - SSL 연결에서 파이프라인 요청을 처리하는 동안 시간 초과가 발생할 수 있음
- 다음 기능을 사용한 경우 워커 프로세스에서 세그멘테이션 오류가 발생할 수 있습니다: OCSP 스테이플링 was used
- 구성에 빈 대체 문자열을 사용하는
rewrite지시어가 포함된 경우 시작 시 또는 재구성 중에 세그멘테이션 오류가 발생할 수 있음 - 다음과 같은 경우 워커 프로세스에서 세그멘테이션 오류가 발생할 수 있습니다.
break지시어를alias지시어와 함께 사용하거나, URI가 포함된proxy_pass지시어와 함께 사용한 경우 - 첫 번째
Transfer-Encoding요청 헤더만 처리됨 - 요청 URI가 null 문자를 포함하도록 다시 작성된 경우
Location응답 헤더 줄에 잘못된 데이터가 포함될 수 있음 - 본문이 있는 요청은
error_page지시어로 리디렉션을 반환할 때 잘못 처리되었습니다. - HTTP/2 사용 시
debug_points지시어의 버그
이러한 버그 중 심각한 것은 없었으며, 관련된 CVE 기록도 없다는 점을 참고해 주세요.
NGINX Plus 로드맵에 대한 투자
이번 릴리스 시점에 저희는 2020년 로드맵을 실현하기 위해 최선을 다하고 있습니다. 올해 안에 프로덕션급 구현을 제공할 예정인 HTTP/3(QUIC라고도 함)에 관심이 있어 진행 상황을 지켜보거나 이 기술을 테스트하고 싶다면, 앞으로 몇 주 내에 공개될 실험용 패치를 확인해 보시기 바랍니다.
새로운 기능 상세
동적 gRPC 프록시
NGINX Plus R15에서는 업스트림 그룹으로의 gRPC 트래픽 라우팅 및 부하 분산 지원이 도입되었습니다. grpc_pass 지시문을 포함하면 NGINX Plus를 활용하여 gRPC 트래픽을 라우팅할 수 있습니다.
NGINX Plus R21에서는 grpc_pass 지시문에 대한 변수 지원이 도입되어 gRPC 워크로드까지 확장되는 동적 API 기반 라우팅 정책을 제공할 수 있습니다. 이를 통해 다음과 같은 사용 사례를 지원할 수 있습니다:
- A/B 테스트 – gRRC 요청을 여러 업스트림에 통계적으로 분산하여 어느 업스트림의 성능이 더 우수한지 확인합니다.
- 디버그 라우팅 – 트래픽은 프로덕션 gRPC 서비스로 라우팅하되, 특정 속성(소스 IP 주소, gRPC 메타데이터)이 있는 요청은 디버그 gRPC 서비스로 라우팅합니다.
다음 구성은 디버그 라우팅의 구현 예시입니다.
코드 예제를 로드하는 중…
1번째 줄에서는 네트워크 범위를 키로 사용할 수 있는 키-값 저장소를 정의합니다( type=ip 매개변수로 활성화). 2번째 줄에서는 $greeter_upstream 변수가 클라이언트 IP 주소($remote_addr)를 키로 사용하여 grpc-greeter 키-값 저장소에서 조회를 수행한 결과로 평가되도록 지정합니다.
10번째 줄에서는 grpc://$greeter_upstream을 grpc_pass 지시문의 매개변수로 지정하여 TLS를 종료하고 클라이언트의 IP 서브넷을 기반으로 gRPC 요청을 동적으로 라우팅합니다.
예를 들어 NGINX Plus 인스턴스에서 다음 명령을 실행하여 192.168.80.0/24 서브넷에서 들어오는 요청을 grpc-servers-greeter-debug로 라우팅할 수 있습니다:
$ curl -iX POST -d '{"192.168.80.0/24":"grpc-servers-greeter-debug"}' http://localhost:8080/api/6/http/keyvals/grpc-greetergRPC 트래픽을 프로덕션 서비스 그룹(grpc-servers-greeter-prod)으로 전환하려면 다음 명령을 실행하세요:
$ curl -iX PATCH -d '{"192.168.80.0/24":"grpc-servers-greeter-prod"}' https://localhost:8080/api/6/http/keyvals/grpc-greeterNGINX JavaScript 모듈 개선 사항
NGINX JavaScript 모듈(njs)이 버전 0.3.9로 업데이트되었으며, 여러 버그 수정과 하위 요청 및 파일 시스템 지원과 관련된 일부 기능 개선 사항이 포함되었습니다.
하위 요청
The r.subrequest 함수는 njs 코드가 모든 URI에 비동기 HTTP 요청을 보낼 수 있도록 합니다. 이 기능은 다양하게 활용할 수 있으며, 대표적인 예로 OAuth 2.0 토큰 검사와 같은 외부 인증 서버에 대한 API 호출이 있습니다. 이번 릴리스에서는 서브요청에 두 가지 중요한 개선 사항, 즉 프로미스와 분리된 서브요청이 추가되었습니다.
[편집자 – 다음 두 가지 사용 사례는 NGINX JavaScript 모듈의 수많은 활용 사례 중 일부에 불과합니다. 전체 목록은 NGINX JavaScript 모듈 사용 사례를 참조하세요.]
프로미스
하위 요청에는 일반적으로 하위 요청의 응답을 처리하는 콜백 함수가 포함됩니다. 이제 콜백 함수를 생략하고 JavaScript 프로미스를 사용하여 호출 코드 내에서 응답을 처리할 수 있습니다. 다음 예제에서는 콜백을 사용하지 않고 연속된 하위 요청을 하나의 코드 시퀀스로 연결하는 방법을 보여 줍니다.
코드 예제를 로드하는 중…
분리된 하위 요청
하위 요청은 비동기식이며, 이전에는 js_content 지시문에서 호출해야 했습니다. 이제 변수 평가 중에 js_set 지시문에서도 하위 요청을 트리거할 수 있습니다. 이러한 ‘분리된’ 하위 요청은 여전히 비동기식으로 작동하지만 호출 함수에 데이터를 반환하지 않으며, 모든 응답은 무시됩니다.
다음 샘플 코드는 분리된 하위 요청을 사용하여 교환된 총 데이터 양이 1MB를 초과할 경우 요청 헤더의 복사본을 보안 정보 및 이벤트 관리(SIEM) 시스템으로 전송합니다.
[편집자 – 다음 구성은 js_import 지시문을 사용하도록 업데이트되었습니다. 이 지시문은 js_include 지시문을 대체하며, NGINX Plus R23<.htmla>부터 적용됩니다. 자세한 내용은 NGINX JavaScript 모듈 참조 문서를 확인하십시오. 구성 예시 섹션에서는 NGINX 구성 파일과 JavaScript 파일의 올바른 구문을 보여 줍니다.]
코드 예제를 로드하는 중…
그런 다음 액세스 로그를 작성할 때 변수 평가를 요청하면 로그 단계에서 JavaScript 코드가 실행됩니다.
코드 예제를 로드하는 중…
파일 시스템
JavaScript 파일 시스템 객체 fs가 비동기 작업에 Promise를 지원하도록 개선되었습니다. 또한 다음과 같은 새로운 파일 시스템 메서드가 추가되었습니다: access(), realpath(), symlink(), unlink().
NGINX Plus 업그레이드 또는 체험
NGINX Plus를 실행 중이라면 가능한 한 빨리 NGINX Plus R21로 업그레이드하시기를 강력히 권장합니다. 업그레이드하면 여러 추가 수정 사항과 개선 사항도 적용되며, 지원 티켓을 제출해야 할 때 NGINX가 더 원활하게 지원하는 데 도움이 됩니다.
업그레이드를 진행하기 전에 이 블로그 게시물에 설명된 새로운 기능과 동작 변경 사항을 주의 깊게 검토하시기 바랍니다.
아직 NGINX Plus를 사용해 보지 않으셨다면 보안, 부하 분산, API 게이트웨이 용도로, 또는 향상된 모니터링 및 관리 API를 갖춘 완전한 지원이 제공되는 웹 서버로 사용해 보시기 바랍니다. 지금 바로 30일 무료 평가판으로 시작해 보세요. NGINX Plus가 애플리케이션을 제공하고 확장하는 데 어떻게 도움이 되는지 직접 확인해 보세요.
작성자 소개

관련 블로그 게시물
시청하기: 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에게서 알아보세요.