오라클 OCI A1 인스턴스(ARM64) NGINX 1.25v HTTP3 적용하기!

오라클 OCI A1 인스턴스(ARM64) NGINX 1.25v HTTP3 적용하기!

역시나 웹 개발을 업으로 한다면 관심을 가지지 않을 수 없는 HTTP3입니다.

HTTP2가 기존에 반복적인 과도한 요청수를 최대한 줄여 주었다지만 여전히 HTTP 1.1 버전을 사용하는 웹 서비스들은 많습니다.

구글 자체 프로토콜이었던 QUIC이라는 프로젝트가 HTTP/3로 사실상 표준화가 되어버렸기 때문에 재미있기도한데 구글이 왜 이런 프로토콜의 개발이 필요했을까요?

지난 HTTP2 와 비교시 가장 HTTP3의 대표적인 장점은 다음과 같습니다.

  1. Zero RTT (Round Trip Time)
  2. 패킷 손실에 대한 빠른 대응
  3. 사용자 IP가 바뀌어도 연결 유지 (모바일 환경 등에 유리)

위와 같은 특징 때문에 웹 스트리밍 서비스에 굉장히 유리해보입니다.

역시나 구글이 뛰어 들었던 걸 보면 유튜브같은 서비스는 일찌감치 이미 HTTP3가 적용되어 있었습니다.

초보개발자 HTTP3 살펴보기
웹과 관련된 개발을 하고 있는 개발자라면 반드시 HTTP를 들어보고 사용하고 있습니다. 특히 많은 개발자들은 23년이 넘는동안 HTTP 1.1을 기반으로 개발을 해오고 있습니다.

성능에 대해 자세한 내용은 이미 미디엄에 너무나도 읽기 편하게 정리해주신 분이 계셔서 좋은 내용을 링크로 대체하겠습니다.

올해 5월에 NGINX(엔진엑스) Mainline 릴리즈 버전에도 드디어 실험적 기능으로써 HTTP3가 추가되었기 때문에 별도의 베타 빌드가 아닌 정식 버전에서도 사용이 가능합니다.

NGINX의 경우 베타 버전도 Apache와는 달리 서둘러 적용해 주었던 터라 초기에는 문제도 많고 설정도 엉망이었습니다.

지금은 대부분 수정되었으니 이제는 사용할만해졌으리라 생각됩니다.

nginx: Linux packages

설치는 사용하시는 환경과 버전에 따라 다양한 방법이 있겠습니다.

제 경우 고스트 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 을 추가로 등록하도록 하겠습니다.

결국 HTTP3udp 통신이지만 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
Is my site using HTTP3? Check HTTP3 service on any URL. Test QUIC service, too.

위 HTTP/3 Check 사이트에서 현재 0-RTTH3(HTTP3) 적용 여부를 확인하실 수 있습니다.

NGINX의 설정을 변경한 뒤 정상적으로 적용되었다는 것을 확인할 수 있었습니다.

브라우저에서 F12 를 눌러 나타나는 개발자 도구에서 Protocol을 추가로 표시해주면 사이트에서 h3를 사용하고 있음을 확인 하실 수 있습니다.

적용 이후 사이트의 속도 개선을 직접 체크해보진 않았지만, 현재까지 별다른 이슈는 보이질 않고 있습니다.

상당히 손쉽게 적용이 가능하니 오라클의 A1 인스턴스의 아키텍쳐가 ARM64라고 해서 머뭇거렸거나 힙한 궁금함이 있으셨던 분들은 한번 적용해 보시는 것도 좋겠습니다.

비정기로 발행되는 추천 포스트를 이메일로 받아 보실 수 있습니다.

특별한 추천 포스트를 바로 이메일로 받아보세요. 물론 무료입니다!
좋아요! 받은 편지함을 확인하고 구독을 확인하려면 링크를 클릭하십시오.
오류! 유효한 이메일 주소를 입력하십시오!