탕구리's 블로그

AWS ALB - HTTP/2.0 적용하기 본문

AWS

AWS ALB - HTTP/2.0 적용하기

탕구리당 2022. 6. 15. 00:06
반응형

개요

  • 현재 주로 사용중인 http/1.1 환경에서 벗어나 실제 http/2.0을 도입하기 위한 방법에 대한 문서화를 목표
  • http/2.0 도입이 어려운 경우 http/1.1 환경을 개선하기 위해 고려해야할 부분에 대해 소개

 

목적

기존 게임 서비스에서 가지는 네트워크 환경을 개선하기 위해  http/1.1에서 발생하는 단점을 보완하기 위해 http/2.0 적용 검토를 진행

 

http/1.1에서 가지고 있든 단점은 크게 3가지이다.

  • HOLB(Head Of Line Blocking) 문제
  • multi connection establish로 인한 resource 비용 낭비
  • 헤더 압축 불가

 

http/1.1과 2.0의 connection 생성 및 관리 형태 - (multi-flexing)

HTTP/1에서는 프로토콜 차원의 응답 다중화가 지원되지않았고 응답의 병렬 처리는 브라우저가 관리하는 형태이며 그렇기 때문에 브라우저의 정책에 따라 요청의 병렬처리가 가능한 개수가 달랐다.

하지만 HTTP/2는 출처 별로 128개의 병렬 요청을 처리할 수 있으므로, 하나의 큰 파일이 아닌 작은 여러 개의 파일로 나눠서 동시에 요청하고 받아올 수 있는 등의 HTTP/1.1에서는 하지 못했던 성능 개선이 가능하게 되었다.

 

http/2.0의 도입이 어려운 경우 기존의 http/1.1을 유지하되 connection pool 관리를 통해 기존 multi-connection resource 비용의 감소 및 도메인 샤딩을 통한 connection 관리가 가능하다.

** http/1.1 connection 관리의 중요성  : https://developer.mozilla.org/ko/docs/Web/HTTP/Connection_management_in_HTTP_1.x

클라이언트 http 2.0 사용하기

일반적으로 사용하는 웹서비스와 네이티브앱에서 http/2.0을 사용하기는 어렵지않다.

현재 사용하고 있는 http 라이브러리에서 http/2.0을 지원하고 있다면 별도의 작업이 필요 없으며, 라이브러리에서 지원하지 않는 경우 버전 업데이트가 필요하다.

대표적으로 안드로이드는 okHttp 2.5+, ios의 경우  내장 라이브러리에서 지원하고 있으며 서버에서 http/2.0을 지원하는 경우 자동으로 처리된다.

 

HTTP/2이 지원되는 Implementations는 다음과 같다.   

namelanguagerole(s)negotiation(s)protocol id(s)
Aerys PHP server ALPN, Upgrade, direct h2, h2c
Akamai GHost C++ intermediary ALPN, NPN h2, h2-14
Apache HTTP Server 2.4.17+ C server ALPN, Upgrade, direct h2, h2c
Apache Traffic Server v5.3.0 C++ intermediary ALPN, NPN h2, h2-14
Apache Tomcat 8.5+ Java Server ALPN, Upgrade, direct h2, h2c
http4s-blaze Scala server ALPN h2, h2-14
Brocade Traffic Manager (formerly Riverbed/Zeus TM) C++ Server ALPN, Upgrade, direct h2, h2c
Chatterbox Erlang Server, Client ALPN h2
Chromium C++ client ALPN, NPN h2, h2-14
Chicken Scheme hpack lib Chicken Scheme hpack direct h2-14
cl-http2-protocol Common Lisp client, server NPN, direct h2-14
curl and libcurl C client ALPN, NPN, Upgrade h2-14, h2c-14
Dart Dart client, server ALPN, direct h2
Deuterium C client, server ALPN, direct h2, h2-14, h2c, h2c-14
E2 Systems PATH C Client, Proxy, Server (Testing tool) ALPN h2
elixir-hpack Elixir HPACK    
Ericsson MSP   proxy NPN, Upgrade, direct h2, h2-14, h2c, h2c-14
F5 C server, proxy ALPN, NPN h2-14 (11.6.0 HF2) h2 (upcoming release)
GFE C++ intermediary ALPN, NPN h2
H2O C Server, proxy ALPN, NPN, Upgrade, direct h2, h2-14, h2-16
Haskell http2 lib Haskell HPACK, framing    
hpack Erlang HPACK    
hpack Swift HPACK    
http-2 Ruby server, client ALPN, NPN, Upgrade, direct h2, h2c, h2-17
http2 Go client, server NPN, ALPN h2, h2-14
HttpTwo C# client direct h2, h2c
hyper Python client, server NPN, ALPN h2, h2-16, h2-15, h2-14
hyper Rust client Upgrade h2
Shaka Technologies Ishlangu Load Balancer C, Java server, proxy ALPN h2
Jetty Java client, intermediary, server ALPN, Upgrade, Direct h2, h2-17, h2-14, h2c, h2c-17
LiteSpeed Enterprise C++ Server ALPN, NPN, Upgrade h2, h2-17, h2-14, h2c
lua-http Lua client, server ALPN, direct h2
Lucid Erlang Server NPN, direct h2, h2-16, h2-14
Microsoft C/C++ Client, Server ALPN h2
Microsoft Internet Explorer   client ALPN (others?) h2 (Windows 10 only?)
mod_h2 C Server ALPN, Upgrade, direct h2, h2c
Mozilla Firefox C++ client ALPN, NPN h2-15, h2-14, h2
Netty Java client, server ALPN, NPN, Upgrade, direct h2, h2c
nghttp2 C client, server, intermediary ALPN, NPN, Upgrade, direct h2, h2-16, h2-14, h2c
Radware C++/C proxy, server ALPN h2
NGINX C server ALPN, NPN, direct h2, h2c
node-http2 NodeJS server, client ALPN, NPN, direct h2
node-spdy NodeJS server, client ALPN, NPN, direct h2
OkHttp Android, Java mock server, client ALPN, NPN h2
Fast Android Networking Android, Java client ALPN, NPN h2
OpenLiteSpeed C++ Server ALPN, NPN, Upgrade h2, h2-17 , h2-14, h2c
Protocol::HTTP2 Perl server, client ALPN, NPN, Upgrade, direct h2, h2c
River Elixir client ALPN h2
Sasazka NodeJS server NPN  
second-transfer Haskell server ALPN h2-14, h2
ShimmerCat Haskell server ALPN, Ahead Of Time Transfer Engine h2
Swoole PHP server ALPN, NPN h2
Trusterd C/mruby client, server ALPN, NPN, direct  
Twitter C++ server, client ALPN, NPN h2
Undertow Java Server, Intermediary ALPN, Upgrade  
Vert.x Java Client, Server ALPN, Upgrade, direct h2, h2c
WASD C/OpenVMS Server ALPN, Upgrade, direct h2, h2c
Warp Haskell Server ALPN, direct  
Wireshark C other ALPN, NPN, Upgrade, direct  
WKWebView Obj-C, Swift client    
http2 Go server, client ALPN, Upgrade h2, h2c

 

http/2.0 사용을 위해 AWS 설정하기

현재 aws에서는 ALB(application load balancer L7), cloudfront에서 http/2.0을 사용할 수 있도록 기능을 지원한다.

대부분의 게임 서비스에서 클라이언트는 게임 환경에 접속하기위해 도메인과 연결된  AWS ALB를 통해 접속 시도를 하고 있으며

퍼블릭 네트워크 환경 즉, 클라이언트와 ALB간의 네트워크 성능을 개선하는 경우 글로벌 서비스에서도 이점을 취할 수 있을것으로 예상된다.

 

ALB의 경우 별도의 설정은 필요없으며 http/2.0에 대한 요청이 들어온 경우 자동으로 처리된다.

 

** 프렌즈사천성의 경우 별도의 작업을 진행하지 않아도 ALB에서 http/2.0에 대한 처리가 가능하다**

 

설정에 대한 부분은 아래 링크를 참조

 

 

웹서버 http/2.0 설정하기

Http/2 적용하기 spring, nginx, apache

https://tecoble.techcourse.co.kr/post/2021-09-20-http2/

https://httpd.apache.org/docs/2.4/howto/http2.html

https://stackoverflow.com/questions/38612704/enable-http2-with-tomcat-in-spring-boot

반응형
Comments