QUIC 및 HTTP/3 지원에 대한 NGINX의 로드맵
작성 시점에서 핵심 QUIC 전송 및 암호화 계층을 설명하는 총 4개의 RFC가 발표되었습니다. 추가로 HTTP/3 의 최종 정의를 포함한 11개의 관련 사양이 아직 초안 상태로 남아 있습니다. 그러나 많은 클라이언트 및 서버 구현이 이미 널리 사용되고 있습니다. 실제로, CDN 제공업체와 기술 기업들의 노력 덕분에 이미 전체 웹사이트의 20%가 HTTP/3 을 지원하고 있습니다. NGINX도 이러한 초안 표준에 발맞춰 발전하고 있습니다.
목차
1. 개요
2. QUIC 및 HTTP/3 에 대한 NGINX의 로드맵
3. QUIC 의 TLS 레이어 통합
4. 도움을 줄 수 있는 방법
1. 개요
작년에는 QUIC 및 HTTP/3에 대한 기술 미리보기를 발표했으며, 그 이후로 많은 일이 있었습니다. 다음은 QUIC 및 HTTP/3에 대한 NGINX 구현에 진행된 주요 개발 노력에 대한 간략한 설명입니다:
- NGINX는 HTTP/3의 여러 초안 버전을 구현했습니다. 초안 23부터 초안 29, 그리고 초안 34까지 구현했습니다.
- NGINX 본선 브랜치에서 이루어진 모든 변경 사항을 nginx-quic 브랜치에 병합하여 모든 새로운 기능과 수정 사항을 QUIC로 테스트할 수 있도록 했습니다.
- 다양한 클라이언트와 비교하여 지속적으로 다른 서버 구현과 비교하면서 NGINX의 구현이 지속적으로 테스트되도록 QUIC 상호 운용성 테스트에 참여했습니다.
- NGINX의 다중 프로세스 아키텍처를 활용하기 위해 eBPF 프로그램을 개발했습니다. NGINX는 여러 워커 프로세스를 사용하여 다중 CPU 코어에서 높은 확장성 성능을 제공합니다.
최대 효율성을 위해 NGINX는 각 연결을 동일한 워커 프로세스로 처리하려고 합니다.
그러나 QUIC는 연결을 클라이언트의 IP 주소에 바인딩하지 않으며, Linux 커널은 UDP 포트-프로세스 연결을 제공하지 않습니다.
이를 해결하기 위해 NGINX는 eBPF 확장을 구현하여 SO_REUSEPORT와 통합했습니다.
이를 통해 QUIC 연결 ID를 처음 처리한 워커에 매핑할 수 있습니다.
이는 NGINX 코어에 깔끔하게 통합되어 NGINX가 eBPF 바이트코드를 커널의 소켓 선택 코드에 로드합니다. - 장기간 유지되는 연결이 구성되는 방식을 단순화하기 위해 NGINX의 연결 처리 코드를 통합했습니다.
이전에 HTTP/1.1에만 적용되던 구성 지시문은 이제 HTTP/2에도 적용되며, QUIC+HTTP/3에도 적용됩니다. 프로토콜 버전이 다르기 때문에 동일한 기능을 위해 다른 지시문을 사용할 필요가 없습니다.
client_header_timeout, keepalive_requests, keepalive_timeout 및 large_client_header_buffers 지시문을 참조하세요. - 추가 코드를 두 부분으로 재구성했습니다. NGINX 코어에 영향을 주는 변경 사항이 포함된 작은 부분과 전송 프로토콜의 구현이 포함된 큰 부분입니다.
이렇게 코드베이스를 구성함으로써 NGINX 내부의 변경 사항을 최소화하여 NGINX 자체에 보안 버그를 도입하는 위험을 줄일 수 있습니다.
2. QUIC 및 HTTP/3 에 대한 NGINX의 로드맵
QUIC+HTTP/3에 대한 로드맵에는 두 가지 주요 이정표가 있습니다.
- nginx-quic 개발 분기를 NGINX 메인라인 분기에 병합
- 성능 최적화 구현
QUIC 및 HTTP/3 프로토콜의 구현은 완료되었으며, 이제 nginx-quic 분기의 새 코드를 NGINX 메인라인 분기(새로운 기능 출시)에 병합하는 신중한 프로세스를 진행하고 있습니다. NGINX 코어에 대한 변경 사항은 상대적으로 작으며(코드 최대 3000줄), 병합이 원활하게 진행되고 있습니다.
더 큰 작업은 전송 프로토콜 코드(약 27,000줄의 코드)를 병합하는 것입니다. HTTP/2 구현을 NGINX에 병합한 경험을 바탕으로 이 작업에는 몇 달이 걸릴 것으로 예상됩니다.
다음 초점은 성능을 최적화하는 것입니다. QUIC의 일부 이점은 즉시 나타날 것이지만, 다른 이점들은 좀 더 시간이 걸릴 것입니다. TCP와 UDP는 다양한 운영 체제의 커널과 네트워크 드라이버에서 수십 년 동안 개발된 이점을 가지고 있지만, QUIC는 주로 사용자 공간에서 구현됩니다.
이는 혼잡 제어 및 기본 패킷 크기 감지와 같은 NGINX가 당연하게 여기는 기능들을 이제 각 클라이언트 및 서버 소프트웨어 제공 업체가 개별적으로 구현해야 함을 의미합니다.
3. QUIC 의 TLS 레이어 통합
QUIC는 암호화된 전송을 네트워크 스택의 필수적이고 협상 불가능한 부분으로 만듭니다. QUIC는 TLS 1.3 표준을 지원하지만, TLS 소프트웨어 구현은 QUIC의 인터페이스도 지원해야 합니다. NGINX는 일반적으로 OpenSSL을 외부 종속성으로 사용하여 공식 NGINX 오픈 소스 패키지 및 NGINX Plus의 운영 체제와 함께 제공되는 SSL/TLS 라이브러리를 활용할 수 있습니다. 암호화 구현을 NGINX에서 분리함으로써 SSL/TLS 라이브러리의 버그와 보안 취약점을 해결할 수 있습니다.
이 글을 작성하는 시점에서 OpenSSL은 QUIC를 지원하지 않으며, QUIC를 지원하는 SSL/TLS 라이브러리가 운영 체제 배포판에 포함되기까지 몇 개월이 걸릴 수 있습니다.
현재 NGINX의 QUIC 구현은 BoringSSL과 quictls 포크된 OpenSSL을 지원하며, 이는 NGINX와 함께 컴파일되어야 합니다.
nginx-quic 개발 브랜치를 NGINX 메인라인에 병합하는 동안 QUIC를 지원하는 SSL/TLS 라이브러리의 상태가 더욱 명확해질 것으로 예상됩니다.
4. 도움을 줄 수 있는 방법
NGINX의 QUIC+HTTP/3 구현을 테스트하여 도움을 줄 수 있습니다.
버그와 예외 상황이 더 많이 발견될수록 병합 프로세스를 더 빠르게 완료하고 NGINX에 QUIC+HTTP/3 지원을 제공할 수 있습니다.
만약 QUIC와/또는 HTTP/3에 익숙하다면, 잘 알고 있는 부분에 대한 코드 리뷰를 진행해주세요.
대규모 인터넷 서비스를 운영한다면, 일부 사용자 또는 일부 서비스에 nginx-quic을 배포하여 A/B 테스트를 진행해보세요.
웹 사이트 및/또는 애플리케이션을 관리한다면, 자동화된 테스트에서 현재 버전 대신 nginx-quic을 사용해보세요.
Dockerfile
# Builds NGINX from the QUIC+HTTP/3 development branch
# - Based on the official NGINX docker image, including all modules built by default
# - OpenSSL replaced with LibreSSL to support QUIC's TLS requirements (statically linked)
#
# docker build --no-cache -t nginx:quic .
# docker run -d -p 443:443 -p 443:443/udp nginx:quic
#
# Note that a suitable configuration file and TLS certificates are required for testing!
# See <https://quic.nginx.org/readme.html> for more info
FROM nginx AS build
WORKDIR /src
RUN apt-get update && apt-get install -y git gcc make autoconf libtool perl
RUN git clone -b v3.6.1 https://github.com/libressl-portable/portable.git libressl && \
cd libressl && \
./autogen.sh && \
./configure && \
make check && \
make install
RUN apt-get install -y mercurial libperl-dev libpcre3-dev zlib1g-dev libxslt1-dev libgd-ocaml-dev libgeoip-dev
RUN hg clone -b quic https://hg.nginx.org/nginx-quic && \
cd nginx-quic && \
auto/configure `nginx -V 2>&1 | sed "s/ \-\-/ \\\ \n\t--/g" | grep "\-\-" | grep -ve opt= -e param= -e build=` \
--with-http_v3_module --with-stream_quic_module \
--with-debug --build=nginx-quic \
--with-cc-opt="-I/src/libressl/build/include" --with-ld-opt="-L/src/libressl/build/lib" --with-ld-opt="-static" && \
make
FROM nginx
COPY --from=build /src/nginx-quic/objs/nginx /usr/sbin
RUN /usr/sbin/nginx
EXPOSE 80 443 443/udp
QUIC 및 HTTP/3에 대한 자세한 내용과 사용 사례에 대해 상담하려면 NGINX STORE에 문의해보세요.
아래 뉴스레터를 구독하고 NGINX와 NGINX STORE의 최신 정보들을 빠르게 전달 받아보세요.