[ 편집자 : NGINX는 이제 공식적으로 QUIC와 함께 HTTP/3를 지원합니다. 오픈 소스 사용자를 위한 NGINX 1.25.1 메인라인 버전과 기업 고객을 위한 NGINX Plus R30 의 일부로 제공됩니다.]
[ngx_snippet 이름='테이블 스타일 블로그']
QUIC+HTTP/3에 대한 NGINX 지원의 미리보기 구현이 이제 두 가지 배포판에 대한 사전 빌드된 바이너리 패키지로 사용 가능하다는 소식을 알려드리게 되어 기쁩니다.
바이너리는 미리 보기 구현을 호스팅하는 별도의 nginx-quic repo의 quic 브랜치에서 제공되는 최신 파일입니다. NGINX에서 QUIC+HTTP/3 작업을 시작한 이래로, QUIC+HTTP/3 및 QUIC를 지원하는 SSL/TLS 라이브러리를 선택하여 NGINX 오픈 소스를 다운로드하고 빌드 할 수 있습니다. 코드는 실험적이라고 표시되어 있지만, 여러 커뮤니티 구성원이 프로덕션에서 nginx-quic을 성공적으로 사용하고 있다고 보고했습니다.
사전 빌드된 바이너리를 출시하는 주된 동기는 QUIC+HTTP/3로 NGINX를 더 빠르고 쉽게 테스트할 수 있도록 하는 것입니다. 바이너리를 사용하면 소스에서 컴파일할 필요가 없으며 표준 패키지 관리 도구를 사용하여 설치할 수 있습니다.
이 글을 쓰는 시점에서 오픈소스 SSL/TLS의 사실상 표준인 OpenSSL은 QUIC를 지원하지 않습니다. 따라서 우리는 종속성으로 자동 설치되는 quictls 라이브러리 패키지로 바이너리 배포판을 빌드합니다. 우리는 현재 안정성, 호환성, 기능 면에서 가장 적합한 조합을 나타내는 quictls를 선택했습니다.
바이너리 배포판에 대한 설치 지침은 NGINX QUIC 웹사이트 에서 확인할 수 있습니다.
NGINX를 QUIC+HTTP/3에 맞게 구성하기 위한 새로운 지침이 몇 개 있지만, 기존 가상 서버( server{}
) 구성 블록에서 HTTP/1.1 및 HTTP/2에 대한 지침과 쉽게 결합할 수 있습니다.
가장 기본적인 기능 구성의 경우 server{}
(및 child location{}
) 블록에 세 개의 지시문을 포함하기만 하면 됩니다.
지령 | 설명 |
---|---|
듣다 443 빠른 재사용 포트; | NGINX가 HTTP/1.1 및 HTTP/2와 동일한 포트(여기서는 443)에서 HTTP/3 연결을 수신하도록 알리기 위해 여러 NGINX 작업자 프로세스가 있는 경우 올바른 작동을 위해서는 |
ssl_프로토콜 TLSv1.3; | QUIC에서 요구하는 대로 허용 프로토콜 목록에 TLS 1.3을 포함합니다. (이 지시어는 아마도 구성에 이미 존재할 것이지만, 필요하다면 추가하세요.) 모든 브라우저를 지원하려면 이전 TLS 버전도 포함해야 할 수도 있습니다. TLS 1.3에 대한 브라우저 지원에 대한 자세한 내용은 TLS 1.3을 사용할 수 있나요?를 참조하세요. |
add_header Alt-Svc 'h3=":$server_port"; ma=86400'; | 이 지시어를 포함하면 NGINX에서 브라우저에 QUIC으로 업그레이드할 수 있다는 사실과 연결할 포트를 알려주는 응답 헤더를 추가합니다. 관례에 따라 포트(여기서는
|
다음은 server{}
블록의 샘플입니다.
server { # 더 나은 호환성을 위해
# QUIC와 TCP에 동일한 포트 번호를 사용하는 것을 권장합니다
listen 443 quic reuseport; # QUIC
listen 443 ssl; # TCP
ssl_certificate certs/example.com.crt;
ssl_certificate_key certs/example.com.key;
ssl_protocols TLSv1.3;
location / {
# 구성된 포트에서 QUIC를 사용할 수 있음을 알립니다
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
#proxy_pass <상류 그룹>;
#루트 /<루트 디렉토리>;
}
}
다음을 포함하여 여러 가지 새로운 선택적 HTTP/3 관련 지시문 및 변수가 있습니다(스니펫에 표시되지 않음):
$http3
– (변수) HTTP/3 세션 중에 요청이 전송되면 h3
로 설정됩니다(그렇지 않으면 빈 문자열입니다).quic_retry
– (지시어) on
으로 설정하면 NGINX가 요청자에게 QUIC 재시도 메시지를 다시 보내 요청자의 IP 주소를 검증할 목적으로 사용할 새 연결 ID를 지정하도록 합니다. QUIC 재시도 패킷은 QUIC가 UDP를 통해 실행되기 때문에 TCP 3방향 연결 핸드셰이크를 사용하여 연결을 검증할 수 없다는 사실을 부분적으로 보완합니다.ssl_early_data
– (지시어) on
으로 설정하면 클라이언트가 새 TLS 1.3 연결을 통해 보낸 첫 번째 요청에서 애플리케이션 데이터를 허용하도록 NGINX에 지시합니다(해당 클라이언트에서 이전에 연결이 있었을 경우). 이것을 0 왕복 시간(0‑RTT) 연결 재개 라고 합니다. "조기 데이터" 전송 지원은 TLS 1.3 의 기능이며 TLS 핸드셰이크에 필요한 추가 왕복 메시지 교환을 제거하여 QUIC+HTTP/3의 성능을 향상시키는 데 기여합니다.
메모: 0‑RTT 연결 재개는 GET이
아닌 HTTP 요청 방법이 포함되어 있을 경우 초기 데이터가 재생 공격을 받을 수 있으므로 보안 위험을 초래할 수 있습니다. 자세한 내용은 블로그의 NGINX Plus R17 발표 에서 TLS 1.3 관련 섹션을 참조하세요.
이 다이어그램은 QUIC+HTTP/3를 사용한 0‑RTT 연결 재개가 클라이언트가 NGINX에 대한 QUIC 연결을 재개할 때 첫 번째 메시지에서 HTTP 요청을 보낼 수 있기 때문에 성능이 어떻게 향상되는지 강조합니다. 반면 TLS가 있는 TCP의 경우 클라이언트는 NGINX와 새로운 TLS 핸드셰이크를 수행하여 보안 연결을 설정해야 하며, 이는 여러 번의 추가 왕복을 희생해야 합니다.
모든 새로운 지침과 변수에 대한 자세한 내용은 3을 참조하세요. 구성 섹션의 nginx-quic 읽어주세요.
이전에 언급했듯이, 사전 빌드된 바이너리를 릴리스하는 동기 중 하나는 NGINX가 HTTP/3 트래픽을 올바르게 처리하는지 테스트하기 쉽게 만드는 것입니다. 간단한 명령줄 테스트를 위해 HTTP/3를 지원하도록 curl을
빌드 하거나 미리 빌드된 컨테이너를 사용할 수 있습니다. 또한, 대부분의 브라우저의 최신 버전은 QUIC+HTTP/3을 지원합니다.
QUIC 지원 사이트가 브라우저의 HTTP/3 연결 요청을 충족하는지 확인하려면 브라우저의 개발자 도구를 사용하여 NGINX에서 반환된 HTTP 헤더를 검사할 수 있습니다. NGINX가 TCP를 통한 브라우저의 초기 HTTP 요청에 대한 응답에서 위에서 설명한 Alt-Svc
헤더를 포함하는 경우 QUIC+HTTP/3 구현이 올바르게 작동합니다.
그 시점에서 QUIC 지원 브라우저는 Alt-Svc
지시문에 지정된 포트에서 QUIC 연결을 만들고, 이후의 HTTP 요청과 응답은 QUIC를 통해 이루어집니다. QUIC+HTTP/3가 사용되고 있는지 확인하는 또 다른 방법은 add_header
지시문을 포함하여 사용자 지정 HTTP 헤더의 값을 $server-protocol
변수에서 캡처한 프로토콜로 설정하는 것입니다. QUIC 연결이 설정되기 전의 HTTP/ 1.x
에서 QUIC가 사용 중일 때의 HTTP/3.0
으로 헤더 값이 어떻게 변경되는지 추적할 수 있습니다.
사용자 정의 HTTP 헤더가 X-protocol
인 샘플 위치
블록은 다음과 같습니다.
location / { # 구성된 포트에서 QUIC를 사용할 수 있음을 알립니다.
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
# QUIC+HTTP/3를 사용하는지 여부를 알립니다.
add_header X-protocol $server_protocol always;
#proxy_pass <상류 그룹>;
#루트 /<루트 디렉토리>;
}
대신, Chrome HTTP Indicator 확장 프로그램과 같은 도구를 사용하면 사용 중인 프로토콜을 시각적으로 표시할 수 있습니다. (이는 특정 브라우저 확장 프로그램을 추천하는 것이 아니며, 사용자는 자신의 상황을 고려하여 확장 프로그램의 보안 문제가 허용 가능한 수준인지 스스로 확인해야 합니다.)
앞으로 몇 주 안에 QUIC+HTTP/3에 대한 솔루션을 계속 제공하고 NGINX 최적화의 더 많은 예를 제공할 것입니다. 그동안 귀하의 테스트 결과를 공유하여 당사의 결정에 도움을 주시기 바랍니다. NGINX 개발 메일링 목록 과 NGINX 커뮤니티 Slack 의 #quic‑http3 채널에서 피드백을 공유할 수 있습니다.
nginx-quic repo를 메인 NGINX 오픈 소스 브랜치에 병합하는 것과 같은 다음의 중요한 이정표를 포함하여 QUIC+HTTP/3 관련 작업에 대한 업데이트를 받으려면 NGINX 발표 메일링 목록 을 구독하세요.
또한 2023년 4월 19일 수요일 에 열리는 Get Hands‑On with NGINX and QUIC+HTTP/3 웨비나에 참석해 주시기 바랍니다.
"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."