WebSocket 및 NGINX를 사용한 실시간 웹 애플리케이션 구현
해당 포스트에서는 WebSocket 을 사용한 실시간 애플리케이션을 만들 때 고려해야 할 아키텍처와 인프라 이슈, 그리고 필요한 컴포넌트와 시스템 구조에 대해서 논의할 것입니다.
목차
1. WebSocket은 HTTP에 상호 작용을 추가합니다.
2. WebSocket 애플리케이션에 대한 기술 요구 사항
3. WebSocket을 높은 트래픽 볼륨으로 확장
1. WebSocket은 HTTP에 상호 작용을 추가합니다.
HTTP는 클라이언트가 요청하면 백엔드 서버가 응답하는 요청(Request)/응답(Response) 기반의 웹 애플리케이션에 적합합니다.
그러나 클라이언트와 서버 간 상호작용이 보다 대화형, 메시지 기반인 웹 애플리케이션에서는 단순한 HTTP 만으로는 부족합니다.
이전에 시도되었던 HTTP를 통한 full-duplex 통신 시도는 복잡하고 여러가지 단점이 있었습니다.
Web Socket JavaScript 인터페이스는 이러한 유형의 애플리케이션을 더 쉽게 구축할 수 있도록 도와주며, 전송되는 데이터 양과 지연 시간을 줄일 수 있습니다.
WebSocket을 사용하면 클라이언트와 서버 간의 full-duplex 소켓 연결을 생성할 수 있으므로 push, poll 또는 streaming 통신을 활용한 실시간 이벤트 기반 웹 애플리케이션을 개발할 수 있습니다.
WebSocket을 사용하면 연결이 설정된 후 클라이언트 또는 서버 중 어느 쪽이든 통신을 시작할 수 있습니다.
이를 통해 온라인 게임, 채팅, 주식 추적 및 스포츠 점수의 실시간 보고 등 다양한 유형의 웹 애플리케이션을 구현할 수 있습니다.
WebSocket의 또 다른 사용 사례는 WebRTC 기반 애플리케이션 개발입니다. WebRTC는 브라우저 간 통신을 수행하는 애플리케이션을 만드는데 사용됩니다, 통신 설정을 위한 별도의 시그널링 채널이 필요하며 WebSocket은 이에 적합한 프로토콜 입니다.
2. WebSocket 애플리케이션에 대한 기술 요구 사항
WebSocket 웹 애플리케이션에 필요한 최소 인프라는 Web Socket Javascript 애플리케이션이 실행되는 클라이언트 브라우저와 WebSocket서버와의 통신입니다. 최근에 출시된 모든 대형 브라우저는 이제 WebSocket을 지원하지만, 클라이언트가 WebSocket을 지원하는 브라우저를 가지고 있는지 확인하는 것이 중요합니다. WebSocket서버에는 많은 옵션이 있으며, 다양한 환경에 대한 몇 가지 예시를 제공합니다.
Node.js | Ruby | Perl | Tomcat | PHP | WebLogic | Python |
---|---|---|---|---|---|---|
ws | websocket-rails | Mojolicious | WebSocket How-to | Ratchet | Using WebSocket in WebLogic Server | websockets |
socket.io | em-websocket | Net::WebSocket::Server | PHP-Push-WebSocket | ws4py | ||
SockJS | webmachine-ruby | PHP-WebSockets |
3. WebSocket을 높은 트래픽 볼륨으로 확장
실시간 애플리케이션을 위한 단일 WebSocket서버를 사용할 수도 있지만, 이 경우 서버 용량이 제한되며, 서버 자체가 단일 장애 지점이 됩니다. 많은 실시간 애플리케이션들은 대규모 이용자를 기대하고 개발되지만, 성장률을 예측하기 어려울 수 있습니다.
이에 대응하기 위해서 인프라는 다음과 같은 요구사항을 충족해야 합니다.
- 다수의 동시 사용자를 지원할 수 있도록 확장 가능해야 합니다.
- 클라이언트와 서버 간의 통신의 지연시간을 최소화 해야합니다.
- 고가용성을 지원해야 합니다. (즉, 단일 장애 지점이 없어야 합니다)
- 구성을 쉽게 변경하고, 변경된 조건에 대응할 수 있어야 합니다.
NGINX를 WebSocket서버와 HTTP 서버 앞에 놓아 WebSocket-Aware 리버스 프록시 및 로드 밸런서로 작동하도록 설정하여 이를 달성할 수 있습니다. (웹 소켓 애플리케이션 대부분이 HTTP도 사용하기 때문에). 일부 리버스 프록시는 WebSocket에 대한 직접적인 지원을 제공하지 않습니다. 예를 들어 AWS (Amazon Web Service) 환경의 Elastic Load Balancing (ELB)은 TCP 모드에서 실행해야 하기 때문에 HTTP 헤더를 다룰 수 없습니다. Proxy Protocol은 이러한 제한을 해결하기 위해 개발되었으며, NGINX도 지원하므로 WebSocket은 AWS에서 완전히 지원됩니다.
Web Socket 리버스 프록시로서 NGINX를 사용하면 경로 유연성과 NGINX가 SSL 연결을 종료할 수 있는 기능과 같은 추가적인 이점을 제공합니다.
NGINX를 사용한 일반적인 WebSocket 구성은 다음과 같을 수 있습니다.

여기에서는 다양한 데스크탑 및 모바일 클라이언트가 HTTP 및 Web Socket 서버를 로드 밸런싱하는 두 개의 고가용성 NGINX 서버에 연결되는 것을 보여줍니다. 이러한 유형의 구성은 WebSocket서버 또는 NGINX 서버의 장애를 견딜 수 있으며 WebSocket서버를 쉽게 추가하거나 제거할 수 있습니다. 또한 WebSocket서버에 연결하는 라우팅 세부 정보는 클라이언트에서 숨겨져 있으므로 견고하고 확장 가능한 WebSocket 애플리케이션 인프라를 제공합니다. 실시간 웹 애플리케이션의 웹 성능과 신뢰성은 매우 중요합니다.
NGINX Plus가 귀사의 애플리케이션 성능, 신뢰성 및 가용성을 개선하는 방법을 알아보려면 오늘 바로 NGINX STORE에 문의 하십시오.
댓글을 달려면 로그인해야 합니다.