WebAssembly ( Wasm 으로 약칭)는 웹 애플리케이션 세계에 많은 것을 제공할 수 있습니다. 브라우저에서 이 기능은 프런트엔드 개발자가 성능 저하 없이 다양한 고급 언어(JavaScript뿐만 아니라!)로 작업할 수 있는 안전한 샌드박스 실행 환경을 제공합니다. 백엔드(서버 측)에서는 WebAssembly의 크로스 플랫폼 지원과 다중 아키텍처 이식성을 통해 그 어느 때보다 쉽게 개발, 배포, 확장할 수 있습니다.
NGINX에서는 수정 없이, 여러 빌드 파이프라인 없이도 서버 측 WebAssembly 모듈을 만들고 어디서나 실행할 수 있는 세상을 꿈꿉니다. 대신, WebAssembly 모듈은 로컬 개발에서 시작해서 미션 크리티컬 멀티 클라우드 환경까지 실행됩니다.
NGINX Unit 1.31이 출시 되면서 이러한 비전을 실현하게 되어 기쁩니다. NGINX Unit은 TLS, 정적 파일, 요청 라우팅의 다른 필수 속성과 함께 애플리케이션 코드가 실행되는 범용 웹 앱 서버입니다 . 게다가 NGINX Unit은 이 모든 작업을 수행하는 동시에 7개의 프로그래밍 언어 런타임 과 이제는 WebAssembly에 대해서도 일관된 개발자 경험을 제공합니다.
NGINX Unit에 WebAssembly를 추가하는 것은 여러 측면에서 의미가 있습니다.
메모 : 이 글을 쓰는 시점에서 WebAssembly 모듈은 기술 미리보기 단계입니다. 자세한 내용은 아래를 참조하세요.
NGINX 유닛의 아키텍처는 네트워킹 프로토콜을 애플리케이션 런타임에서 분리합니다. unitd: 라우터
프로세스는 들어오는 HTTP 요청을 처리하고 필요에 따라 TLS 계층을 처리합니다. 이 요청을 어떻게 처리할지 결정한 후 "HTTP 컨텍스트"(URI, 헤더, 본문)가 애플리케이션 런타임에 전달됩니다.
많은 프로그래밍 언어에는 HTTP 컨텍스트를 애플리케이션 코드에서 제공하는 방법과 개발자가 URI, 헤더, 본문에 액세스하는 방법에 대한 정확한 사양이 있습니다. NGINX Unit은 NGINX Unit의 라우터와 애플리케이션 런타임 사이의 인터페이스 계층을 구현하는 여러 언어 모듈을 제공합니다.
NGINX Unit용 WebAssembly 언어 모듈은 WebAssembly 런타임과 라우터 프로세스 사이에 비슷한 인터페이스 계층을 제공합니다. WebAssembly 샌드박스의 선형 메모리는 현재 요청의 HTTP 컨텍스트로 초기화되고 최종적인 응답은 클라이언트로 전송하기 위해 라우터로 다시 전송됩니다.
샌드박스 실행 환경은 Wasmtime 런타임에 의해 제공됩니다. 아래 다이어그램은 클라이언트에서 라우터를 거쳐 Wasmtime이 실행하는 WebAssembly 모듈로 가는 HTTP 요청의 흐름을 보여줍니다.
NGINX Unit을 구성하여 WebAssembly 모듈을 실행하는 것은 다른 언어와 마찬가지로 간단합니다. 아래 구성 스니펫에는 다음과 같은 속성을 가진 helloworld
라는 애플리케이션이 있습니다.
type은
이 애플리케이션에 로드될 언어 모듈을 정의합니다.모듈은
컴파일된 WebAssembly 바이트코드를 가리킵니다.액세스는
샌드박스 외부의 리소스에 애플리케이션이 액세스할 수 있도록 하는 Wasmtime 런타임의 기능입니다.request_handler
, malloc_handler
및 free_handler는
HTTP 컨텍스트를 Wasmtime으로 전송하는 SDK 기능과 관련됩니다(다음 섹션에서 자세히 설명).{
"applications":{
"helloworld":{
"type":"wasm",
"module":"/path/to/wasm_module.wasm",
"access":{
"filesystem":[
"/tmp",
"/var/tmp"
]
},
"request_handler":"luw_request_handler",
"malloc_handler":"luw_malloc_handler",
"free_handler":"luw_free_handler"
}
}
}
위에서 언급했듯이 NGINX Unit의 WebAssembly 언어 모듈은 현재 요청의 HTTP 컨텍스트로 WebAssembly 실행 샌드박스를 초기화합니다. 많은 프로그래밍 언어 런타임이 HTTP 메타데이터에 대한 기본 직접 액세스를 제공하지만, WebAssembly에는 그러한 표준이 없습니다.
우리는 WASI-HTTP 표준이 궁극적으로 이러한 요구를 충족시킬 것으로 기대하지만, 그동안 Rust와 C를 위한 소프트웨어 개발 키트(SDK)를 제공합니다. Unit-Wasm SDK를 사용하면 WebAssembly로 컴파일되고 NGINX Unit에서 실행되는 웹 애플리케이션과 API를 쉽게 작성할 수 있습니다. WebAssembly 사용 방법 가이드 에서는 개발 환경과 빌드 단계를 살펴볼 수 있습니다.
WebAssembly의 범용 런타임으로서의 잠재력을 실현하려는 우리의 비전과 열망에도 불구하고, 이 SDK로 빌드된 애플리케이션은 NGINX Unit에서만 실행됩니다. 이것이 우리가 WebAssembly 지원을 기술 미리보기로 소개하는 이유입니다. 가능한 한 빨리 WASI-HTTP 지원으로 대체할 것으로 예상합니다.
기술 미리보기는 웹 애플리케이션을 실행하기 위한 가벼운 서버를 제공하는 동시에 서버 측 WebAssembly의 잠재력을 보여주기 위해 마련되었습니다. "타이어를 차보는" 사고방식으로 접근해 보세요. 실험해 보시고 피드백을 제공해 주세요. NGINX 커뮤니티 Slack 이나 NGINX 단위 GitHub 저장소를 통해 여러분의 의견을 들려주세요.
시작하려면 NGINX Unit을 설치하고 WebAssembly 사용 방법 가이드 로 이동하세요.
"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."