역시나 웹 개발을 업으로 한다면 관심을 가지지 않을 수 없는 HTTP3
입니다.
HTTP2
가 기존에 반복적인 과도한 요청수를 최대한 줄여 주었다지만 여전히 HTTP 1.1
버전을 사용하는 웹 서비스들은 많습니다.
구글 자체 프로토콜이었던 QUIC
이라는 프로젝트가 HTTP/3
로 사실상 표준화가 되어버렸기 때문에 재미있기도한데 구글이 왜 이런 프로토콜의 개발이 필요했을까요?
지난 HTTP2
와 비교시 가장 HTTP3
의 대표적인 장점은 다음과 같습니다.
- Zero RTT (Round Trip Time)
- 패킷 손실에 대한 빠른 대응
- 사용자 IP가 바뀌어도 연결 유지 (모바일 환경 등에 유리)
위와 같은 특징 때문에 웹 스트리밍 서비스에 굉장히 유리해보입니다.
역시나 구글이 뛰어 들었던 걸 보면 유튜브같은 서비스는 일찌감치 이미 HTTP3
가 적용되어 있었습니다.
성능에 대해 자세한 내용은 이미 미디엄에 너무나도 읽기 편하게 정리해주신 분이 계셔서 좋은 내용을 링크로 대체하겠습니다.
올해 5월에 NGINX(엔진엑스) Mainline
릴리즈 버전에도 드디어 실험적 기능으로써 HTTP3
가 추가되었기 때문에 별도의 베타 빌드가 아닌 정식 버전에서도 사용이 가능합니다.
NGINX
의 경우 베타 버전도 Apache
와는 달리 서둘러 적용해 주었던 터라 초기에는 문제도 많고 설정도 엉망이었습니다.
지금은 대부분 수정되었으니 이제는 사용할만해졌으리라 생각됩니다.
설치는 사용하시는 환경과 버전에 따라 다양한 방법이 있겠습니다.
제 경우 고스트 CMS 및 마스토돈등의 서비스를 구동하고 있는 오라클 A1 인스턴스에 NGINX를 새로운 버전으로 업데이트를 진행해보겠습니다.
1. 설치에 필요한 디펜던시 설치
sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring
먼저 NGINX의 설치를 위한 필수 구성 요소들을 위 명령어로 설치합니다.
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
다음은 엔진엑스가 apt 패키지 진위를 확인할 수 있도록 공식 NGINX
서명 키를 가져오도록 하겠습니다.
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
다운로드한 파일에 올바른 키가 포함되어 있는지 다시 한번 확인합니다.
다음과 같이 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
값이 출력되어야합니다.
2. MainLine apt source.list 추가
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
먼저 예시로 보여드리는 것으로 stable repo의 버전은 아직 HTTP3(quic)을 지원하지 않습니다.
따라서 공식 가이드를 따라 위처럼 stable 레포를 추가하시면 안되겠습니다!
지원 버전을 확인해 보니, 현재 1.24 버전까지만 제공하고 있기 때문에 한끗 차이로 stable 빌드로는 못 가는군요.
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
따라서 위처럼 mainline 으로 repo를 설정해주셔야합니다.
sudo apt update
apt 업데이트를 진행해줍니다.
sudo apt list --upgradable
apt에서 업그레이드 가능한 패키지를 조회해보면 드디어 원하던 nginx 1.25 버전이 나타납니다.
3. NGINX 업데이트
sudo apt upgrade
기존에 사용 중인 NGINX
에서 바로 업데이트를 진행했습니다.
설치 직후 바로 문제가 발생하는군요.
이번 NGINX
1.25 버전부터 HTTP2를 지원하는 문법이 변경되었기 때문입니다.
sudo nginx -t
NGINX
의 설정파일 문법검사를 진행하면 문제의 원인을 파악할 수 있습니다.
http2 라는 문구가 잘못되었다고 하는군요?
# 기존
listen 443 ssl http2;
# 변경
listen 443 ssl;
http2 on;
사실 위처럼 기존엔 포트 바로 옆에 붙여 주었던 http2 속성이 아예 따로 on off 로 적용되도록 변경되었습니다.
sudo nginx -t
만약 문제가 발생했다면 수정 후 위 명령어로 다시 확인해 보시면 문법에 문제가 없다는 메세지가 나타납니다.
이후 사이트는 정상적으로 구동될테니 이제부턴 직접 설정을 수정하도록 하겠습니다.
4. NGINX 설정파일의 수정
/etc/nginx/sites-available
또는 /etc/nginx/sites-enabled
등으로 서버 목록을 관리하시거나 기본 설정인 default
파일을 직접 수정해서 설정파일을 사용하실겁니다.
위처럼 server
블록 사이에 listen
을 추가로 등록하도록 하겠습니다.
결국 HTTP3
는 udp
통신이지만 SSL
을 사용한다는 전재로 동작하기 때문에 포트는 동일합니다.
listen 443 ssl;
http2 on;
listen 443 quic;
http3 on;
server_name {사용할 도메인};
단순히 위처럼 새로운 listen
항목을 추가하고 http2
와 마찬가지로 http3 on
이란 문구를 추가했습니다.
사용자의 환경에 따라 다르겠지만 제 경우 NGINX
를 단순히 역방향 프록시 서버로 사용하고 있기 때문에 특별한 다른 설정이 필요하진 않았습니다.
제 경우 클라우드 플레어의 터널 서비스와 함께 도메인 기반의 라우팅을 위해 /etc/hosts
를 수정해서 사용하고 있으며 매끄럽게 동작합니다.
5. HTTP3 적용 확인
위 HTTP/3 Check 사이트에서 현재 0-RTT
와 H3(HTTP3)
적용 여부를 확인하실 수 있습니다.
NGINX
의 설정을 변경한 뒤 정상적으로 적용되었다는 것을 확인할 수 있었습니다.
브라우저에서 F12
를 눌러 나타나는 개발자 도구에서 Protocol
을 추가로 표시해주면 사이트에서 h3
를 사용하고 있음을 확인 하실 수 있습니다.
적용 이후 사이트의 속도 개선을 직접 체크해보진 않았지만, 현재까지 별다른 이슈는 보이질 않고 있습니다.
상당히 손쉽게 적용이 가능하니 오라클의 A1 인스턴스의 아키텍쳐가 ARM64
라고 해서 머뭇거렸거나 힙한 궁금함이 있으셨던 분들은 한번 적용해 보시는 것도 좋겠습니다.