NGINX Unit 앱 서버 소개

NGINX Unit 오픈소스에 대한 포스트를 시작합니다.

웹 애플리케이션의 지형이 바뀌었습니다. 과거에는 응용 특정 요구 사항을 충족하기 위해 처음부터 작성되었습니다. 업그레이드는 현재에 비해 거의 발행되지 않았습니다.

오늘날 애플리케이션은 자주 릴리스되며, 시간이 지남에 따라 완전히 다시 작성됩니다. 미들웨어는 요청(Request)을 받아 애플리케이션 코드(Code)로 안내합니다. 여러 유형의 설치, 구성, 조정 및 유지 관리 다양한 유형의 애플리케이션 언어를 위한 미들웨어 서버 및 버전에는 많은 작업, 전문 지식 및 시간이 필요합니다.

nginx 개발팀은 애플리케이션에서 이러한 변경 사항을 관찰했습니다. 처음부터 이러한 문제를 해결하는 솔루션을 개발하기 위해 노력해 왔습니다. 이는 컴퓨팅의 새로운 시대를 위해 구축된 것입니다. NGINX Unit은 운영 복잡성을 줄이는 것을 목표로 다양한 언어와 애플리케이션을 실행할 수 있는 미들웨어 서버 이며 서비스 중단 없이 구성을 업데이트할 수 있습니다.

NGINX Unit은 nginx OSS와 동일한 개발 문화를 반영합니다. nginx(OSS) 팀 구성원이 처음부터 매우 효율적이고 런타임에 완벽하게 구성할 수 있도록 구축했습니다.

NGINX Unit은 2018년 4월 공식 발표되었지만 아직 국내에는 잘 알려져 있지 않은 NGINX Unit의 장점은 초경량, 고성능, 다중 언어 지원, 무중단 동적 재구성 등에 대해 알아봅니다. NGINX를 좋아한다면 NGINX Unit도 좋아할 것입니다.

목차

1. NGINX Unit 소개
2. NGINX Unit 주요 특징
2-1. 유연성
2-2. 성능
2-3. 보안 및 견고성
2-4. 지원 되는 앱 언어
3. NGINX Unit은 NGINX와 어떻게 비교됩니까?
3-1. 진화된 아키텍처
3-2. 애플리케이션 코드 실행
3-3. NGINX Unit의 완전 동적 구성 경험
4. NGINX Unit을 사용하는 이유는 무엇입니까?
4-1. NGINX Unit의 마이크로서비스 간소화
4-2. 모놀리스 현대화

4-3. 보안 앱 런타임
5. 결론

1. NGINX Unit 소개

NGINX Unit은 최신 애플리케이션 스택의 여러 계층을 성능, 짧은 대기 시간 및 확장성에 중점을 둔 강력하고 일관된 솔루션으로 압축하는 범용 도구를 구축하고 있습니다. 엔터프라이즈 규모 배포에서 작은 규모의 홈페이지에 이르기까지 복잡성에 관계없이 모든 웹 아키텍처의 빌딩 블록으로 사용됩니다.

NGINX Unit에서 제공하는 RESTful JSON API는 서비스 중단 없이 유연한 구성으로 동적 업데이트를 가능하게 하며, 즉시 사용 가능한 프로덕션급 워크로드로 안정적으로 확장됩니다. 우리는 오늘날의 컴퓨팅 플랫폼을 최대한 활용하면서 보안과 견고성을 보장하기 위해 여러 프로세스로 구성된 복잡한 비동기(asynchronous) 멀티스레딩(multithreading) 아키텍처를 통해 이를 달성합니다.

NGINX Unit은 Unix 계열 시스템에서 사용할 수 있는 다중 언어 앱 서버입니다. 각 언어의 여러 버전뿐만 아니라 여러 언어를 제공할 수 있는 완전히 동적인 애플리케이션 서버입니다. RESTful JSON API를 사용하여 서비스 중단이나 구성 다시 로드 없이 메모리의 구성을 변경한다는 점에서 동적입니다.

다중 언어 앱 서버로서 Java, PHP, Python, Node.js, Go, Ruby, Perl, Assembly 언어를 지원합니다. 동일한 언어의 다른 버전으로 여러 언어로 앱을 시작할 수 있습니다. 운영자는 더 이상 여러 스택을 관리할 필요가 없습니다. 다른 UNIT 사용자가 자격 증명을 사용하면 독립적이고 격리된 상태에서 앱을 일관되게 합니다.

마이크로서비스 아키텍처(MSA)에서 NGINX Unit을 Docker 형태로 K8s와 Cloud에 쉽게 배포하실 수 있습니다.

NGINX Unit을 사용해보면 전체 시스템을 중단하지 않고(다운타운 없이) 애프리케이션 구성 요소를 업그레이드하는 것이 얼마나 쉬운지 알게 되실 것입니다. 변경사항을 즉시 적용하고 다시 로드(Reload)하거나 다시 시작하지 않습니다. 추가 리소스를 사용하지 않고 변경 사항이 REST API를 통해 구성됩니다.

JSON 페이로드 API 단위로 보낸다음 재구성하기 쉽기 때문에 표준 REST API를 선택한 서버의 config 파일 앱을 시작하기 위해 각 호출을 다시 로드하지 않고 자체적으로 동일한 서버 소프트웨어 단위를 사용하여 앱을 올바르게 시작하도록 자체 구성합니다.

nginx unit

2. NGINX Unit 주요 특징

2-1. 유연성

  • HTTP/HTTPS를 통해 RESTful JSON API로 NGINX Unit의 전체 구성을 동적으로 관리합니다.
  • 구성 업데이트는 중단 없이 런타임에 세부적으로 수행됩니다.
  • 클라이언트의 요청(Request)는 정적 콘텐츠, 업스트림 서버 및 로컬 앱 간에 라우팅됩니다.
  • 요청 필터링 및 디스패치는 정규식을 허용하는 정교한 일치규칙을 사용합니다.
  • 여러 언어 및 언어 버전의 앱을 나란히 실행할 수 있습니다.
  • 지원되는 모든 언어에 대한 공통 언어별 API가 원활하게 실행됩니다.
  • 업스트림 서버 그룹은 가중(weighted) 라운드 로빈 방식을 사용하여 동적 로드 밸런싱을 제공합니다.
  • 발신(오리진) IP 식별 지원 X-Forwarded-For 및 유사한 헤더 필드

2-2. 성능

  • 요청은 효율적인 이벤트 루프(epoll, kqueue)를 사용하여 스레드에서 비동기식으로 처리됩니다.
  • 시스템 호출 및 데이터 복사 작업은 필요한 최소 수준으로 유지됩니다.
  • 10,000개의 비활성 HTTP 연결 유지 연결은 몇 MB의 메모리만 차지합니다.
  • 라우터 및 앱 프로세스는 공유 메모리를 통해 잠금 없는 대기열로 구축된 저지연 IPC에 의존합니다.
  • 앱별 프로세스의 수는 정적으로 정의되거나 주어진 한도 내에서 선제적으로 확장됩니다.
  • 다중 스레드 요청 처리는 Java, Perl, Python 및 Ruby 앱에서 지원됩니다.

2-3. 보안 및 견고성

  • 클라이언트 연결은 권한이 없는 별도의 라우터 프로세스에 의해 처리됩니다.
  • 리소스 부족 조건(메모리 부족 또는 설명자 부족) 및 앱 충돌이 정상적으로 처리됩니다.
  • SSL/TLS와 SNI, 세션 캐시와 티켓 통합 (OpenSSL을 1.0.1 이상)
  • 다른 앱은 별도의 프로세스에서 격리됩니다.
  • 네임스페이스 및 파일 시스템 격리로 앱을 추가로 컨테이너화할 수 있습니다.
  • 정적 파일 서비스는 chrooting, symlink 및 마운트 지점 통과 제한의 이점을 제공합니다.

2-4. 지원되는 앱 언어

Unit은 다음과 상호 운영됩니다.

  • 일반적으로 이진 컴파일 된 언어 : 포함된 libunit 라이브러리 사용
  • Go : http 모듈에 의해 오버라이드
  • JavaScript(Node.js) : http 및 websocket 모듈을 자동으로 오버로드 하여
  • Java : Servlet 사양 3.1 및 WebSocket API 사용
  • Perl : PSGI 사용
  • PHP : 사용자 정의 SAPI 모듈 사용
  • Python : WebSocket 지원과 함께 WSGI 또는 ASGI 사용
  • Ruby : Rack API 사용

※ epoll : 확장 가능한 I/O 이벤트 알림 메커니즘을 위한 Linux 커널 시스템 호출로, Linux 커널 버전 2.5.44에서 처음 도입. 그 기능은 여러 파일 설명자를 모니터링하여 I/O가 가능한지 여부를 확인하는 것입니다.

※ kqueue : 2000년 7월 FreeBSD 4.1에 도입된 확장 가능한 이벤트 알림 인터페이스이며 NetBSD, OpenBSD, DragonFly BSD 및 macOS 에서도 지원됩니다. Kqueue는 원래 Jonathan Lemon이 2000년에 작성했으며 당시 FreeBSD 코어 팀에 참여했습니다. Kqueue를 사용하면 nginx와 같은 소프트웨어가 c10k 문제를 해결할 수 있습니다.

3. NGINX Unit은 NGINX와 어떻게 비교됩니까?

3-1. NGINX Unit의 진화된 아키텍처

  • NGINX Unit은 완전히 새로운 오픈소스 코드베이스(codebase)에서 기존 nginx oss 팀에 의해 만들어졌습니다.
  • 이 아키텍처는 10년 넘게 세계에서 가장 인기 있는 웹 서버를 운영하면서 얻은 통찰력을 통합합니다.
  • NGINX 웹 서버와 달리 NGINX Unit은 다중 프로세스, 다중 스레드 아키텍처를 사용합니다.

3-2. 애플리케이션 코드 실행

  • NGINX 웹 서버는 종종 웹 애플리케이션 앞에 리버스 프록시로 배포됩니다. NGINX Unit은 애플리케이션 코드를 직접 실행하여 전체 애플리케이션 구성을 한 곳에서 찾을 수 있습니다.
  • NGINX Unit은 중간 프로세스 관리자나 애플리케이션 서버 없이 Java, PHP, Python 또는 Ruby로 작성된 웹 애플리케이션 및 API를 실행할 수 있습니다.
  • NGINX Unit은 웹 애플리케이션의 정적 자산과 동적 콘텐츠를 모두 제공할 수 있습니다.

3-3. NGINX Unit의 완전 동적 구성 경험

  • NGINX Unit은 완전히 JSON으로 구성되어 있으므로 배울 새로운 구성 구문이 없습니다.
  • 변경 사항은 다시 로드(Reload)하거나 진행 중인 요청에 대한 중단 없이 즉시 적용됩니다.
  • 구성 API를 통해 단일 값을 수정하거나 전체 구성을 바꿀 수 있습니다.

4. NGINX Unit을 사용하는 이유는 무엇입니까?

4-1. NGINX Unit의 마이크로서비스 간소화

웹 응용 프로그램에는 일반적으로 리버스 프록시, 웹 서버 및 응용 프로그램 서버 스택이 필요합니다. NGINX Unit은 단일 구성 요소의 모든 기능을 공통 구성과 결합하여 동일한 서버에서 전체 단일 페이지 애플리케이션 또는 웹 API Endpoint를 제공할 수 있도록 합니다.

NGINX Unit은 애플리케이션 코드를 위한 경량 런타임을 제공하여 마이크로서비스 구축 및 배포에 이상적입니다. 여러 프로그래밍 언어 및 프레임워크를 지원하는 NGINX Unit은 모든 마이크로서비스에 대해 동일한 개발, 구성 및 배포 환경을 제공합니다.

독립적인 개발, 배포 및 애플리케이션 격리의 이점을 잃지 않고 마이크로서비스를 효율적으로 공동 배치합니다. NGINX Unit은 더 간단하고 확장 가능한 폼 팩터(Form factor)에서 마이크로서비스의 모든 이점을 제공합니다.

4-2. NGINX Unit 모놀리스 현대화

NGINX Unit은 친숙한 JSON/REST 구성, 컨테이너 친화적인 풋프린트 및 기존 앱에 대한 최신 TLS 구현을 사용합니다.

NGINX Unit을 사용하면 애플리케이션 코드를 건드리지 않고도 기존 애플리케이션에서 Cloud-Native 모노리스를 생성할 수 있습니다.

NGINX Unit은 또한 요청(Request) 라우팅을 수행하여 모놀리스에서 마이크로서비스(Microservices)로의 마이그레이션을 용이하게 합니다.

4-3. NGINX Unit 보안 앱 런타임

종단 간 TLS를 제공하는 데는 여전히 종종 해독된 네트워크 홉(Hop)과 가로채기 기회가 포함됩니다. NGINX Unit은 런타임까지 암호화를 통해 진정한 종단 간 TLS를 제공합니다. NGINX Unit은 TLS 계층을 처리하고 공유 메모리를 통해 애플리케이션 코드와 직접 통신합니다.

인증서 관리는 동일한 JSON/REST 구성 API에 의해 처리되지만 애플리케이션에서 분리됩니다. 단일 인증서를 여러 앱에서 공유하거나 애플리케이션 호스트 이름과 자동으로 일치시킬 수 있습니다.

격리된 환경에서 애플리케이션을 실행하여 애플리케이션과 호스트를 서로 보호할 수 있습니다. NGINX Unit은 Linux 네임스페이스 , cgroups 및 파일 시스템 격리 를 사용하여 각 애플리케이션에 안전한 런타임을 제공합니다.

5. 결론

NGINX Unit 오픈소스를 사용해 보실 준비가 되셨나요? NGINX STORE에서 제공하는 NGINX Unit 공식 한글 번역 문서를 보시면서 설치해보시면 개발자, DevOps 엔지니어, 클라우드 엔지니어 등 누구나 쉽게 설치하실 수 있습니다.