WebSocket과 NGINX를 활용한 실시간 웹 애플리케이션

NGINX | 2014년 7월 21일

블로그 게시물 「WebSocket 프록시로서의 NGINX」에서는 NGINX를 사용하여 WebSocket 애플리케이션 서버를 프록시하는 방법을 살펴보았습니다. 이 게시물에서는 WebSocket을 활용한 실시간 애플리케이션을 구축할 때 고려해야 할 몇 가지 아키텍처 및 인프라 문제를 비롯해 필요한 구성 요소와 시스템 구성 방법을 살펴보겠습니다.

WebSocket으로 HTTP에 상호작용 기능 추가

HTTP는 요청/응답 방식의 웹 애플리케이션에 적합합니다. 이러한 방식에서는 항상 클라이언트가 요청을 시작하고 백엔드 서버가 이에 응답합니다. 클라이언트와 서버 간에 메시지를 기반으로 더욱 상호작용이 활발하게 이루어지는 웹 애플리케이션에는 단순한 HTTP 이상의 기술이 필요합니다. 이전에도 HTTP를 통해 전이중 통신을 구현하려는 시도가 있었지만, 방식이 복잡하고 여러 단점이 있었습니다. WebSocket 프로토콜과 WebSocket JavaScript 인터페이스를 사용하면 이러한 유형의 애플리케이션을 훨씬 쉽게 구축하는 동시에 데이터 전송량과 지연 시간을 줄일 수 있습니다.

클라이언트와 서버 간에 전이중 소켓 연결을 생성할 수 있으므로 푸시, 폴링 또는 스트리밍 통신을 활용하는 실시간 이벤트 기반 웹 애플리케이션을 개발할 수 있습니다. WebSocket을 사용하면 연결이 설정된 후 클라이언트와 서버 중 어느 쪽에서든 통신을 시작할 수 있습니다. 이를 통해 온라인 게임, 채팅, 주식 시세 추적, 스포츠 경기 점수의 실시간 중계 등 다양한 유형의 웹 애플리케이션을 구현할 수 있습니다.

WebSocket의 또 다른 사용 사례는 WebRTC 기반 애플리케이션을 개발하는 것입니다. WebRTC는 브라우저 간 통신을 수행하는 애플리케이션을 만드는 데 사용됩니다. 통신을 설정하려면 별도의 시그널링 채널이 필요하며, WebSocket은 이에 적합한 프로토콜입니다.

WebSocket 애플리케이션의 기술 요구 사항

WebSocket 웹 애플리케이션에 필요한 최소 인프라는 WebSocket JavaScript 애플리케이션을 실행하며 WebSocket 서버와 통신하는 클라이언트 브라우저입니다. 현재 모든 주요 브라우저의 최신 버전이 WebSocket을 지원하지만, 클라이언트가 WebSocket을 지원하는 브라우저를 사용하고 있는지 확인하는 것이 중요합니다. WebSocket 서버에는 다양한 선택지가 있으며, 다음은 환경별 몇 가지 예입니다(이 목록은 편의를 위해 제공되는 것으로 NGINX, Inc.의 보증이나 추천을 의미하지 않습니다).

대규모 트래픽을 처리하도록 WebSocket 확장하기

단일 WebSocket 서버를 사용할 수도 있지만, 애플리케이션 성능은 서버 용량에 의해 제한되며 해당 서버가 단일 장애점이 되기도 합니다. 많은 실시간 애플리케이션이 널리 사용되기를 기대하며 개발되지만, 성장 속도를 예측하기는 어려울 수 있습니다. 실시간 애플리케이션의 인기가 높아지는 데 대응하려면 인프라는 다음을 수행할 수 있어야 합니다:

  • 많은 동시 사용자를 지원할 수 있도록 확장
  • 클라이언트와 서버 간 통신 처리 시 짧은 지연 시간 제공
  • 고가용성 지원(단일 장애 지점이 없음을 의미)
  • 구성을 쉽게 변경하고 변화하는 상황에 맞게 조정할 수 있도록 지원

이를 위해 NGINX를 WebSocket 서버와 HTTP 서버(대부분의 WebSocket 애플리케이션은 HTTP도 사용함) 앞에 배치하여 WebSocket을 인식하는 리버스 프록시 및 로드 밸런서로 작동하게 할 수 있습니다. 모든 리버스 프록시가 WebSocket을 직접 지원하는 것은 아닙니다. Amazon Web Services(AWS) 환경의 Elastic Load Balancing(ELB)과 같은 일부 서비스는 TCP 모드로 실행해야 하므로 HTTP 헤더를 처리할 수 없습니다. 이러한 제한을 해결하기 위해 Proxy Protocol이 개발되었으며 NGINX도 이를 지원하므로 AWS에서 WebSocket을 완벽하게 사용할 수 있습니다. NGINX를 WebSocket 리버스 프록시로 사용하면 유연한 라우팅, NGINX에서 SSL 연결을 종료하는 기능 등의 추가 이점도 얻을 수 있습니다.

NGINX를 사용하는 일반적인 WebSocket 구성은 다음과 같습니다:

여기서는 다양한 데스크톱 및 모바일 클라이언트가 여러 HTTP 및 WebSocket 서버의 부하를 분산하는 고가용성 NGINX 서버 쌍에 연결되는 구성을 보여 줍니다. 이러한 구성은 WebSocket 서버 또는 NGINX 서버에 장애가 발생해도 이를 견딜 수 있으며, WebSocket 서버를 손쉽게 추가하거나 제거할 수 있습니다. 또한 WebSocket 서버에 연결하는 방법에 관한 모든 라우팅 세부 정보가 클라이언트에 노출되지 않으므로 견고하고 확장 가능한 WebSocket 애플리케이션 인프라를 구축할 수 있습니다. 실시간 웹 애플리케이션에서는 웹 성능과 안정성이 매우 중요합니다. 지금 문의하세요. NGINX Plus가 애플리케이션의 성능, 안정성 및 가용성을 개선하는 데 어떻게 도움이 되는지 알아보실 수 있습니다.

자세한 내용은 다음을 참조하세요:


공유

작성자 소개

Rick Nelson
Rick Nelson솔루션 엔지니어링 지역 담당 부사장

Rick Nelson의 다른 블로그 게시물

관련 블로그 게시물

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
NGINX | 2023. 11. 30.

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric

이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
NGINX | 2023. 03. 23.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법

앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
NGINX | 2021. 09. 27.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션

개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX | 2021. 07. 06.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법

NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX | 2021. 06. 30.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리

NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
NGINX | 2015. 03. 25.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유

Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.