서버 및 Docker 이미지에 대한 CURL 명령의 HTTP 버전

서버 및 Docker 이미지에 대한 CURL 명령의 HTTP 버전

Docker 컨테이너에서 CURL 호출을 수행하면 curl https://example.com오류가 발생합니다 curl: (92) HTTP/2 stream 0 was not closed cleanly: HTTP_1_1_REQUIRED (err 13). 그러나 docker 컨테이너를 실행하는 호스트 서버(RHEL)에서 동일한 명령을 실행하면 제대로 작동합니다.

그래서 docker 컨테이너의 명령에 --http1.1을 추가했더니 제대로 작동했습니다. 하지만 호스트 서버에서 --http1.1을 사용하여 동일한 명령을 실행하면 오류가 발생합니다 curl: option --http1.1: is unknown.

  1. 컬은 호출할 때 어떻게 http 버전을 얻나요? 기본적으로 특정 버전을 사용하도록 정의할 수 있는 설정이 있습니까?
  2. --http1.1이 서버에서는 작동하지 않지만 Docker 컨테이너에서는 작동하는 이유는 무엇입니까?

서버의 Curl 버전은 7.29.0입니다. Docker 컨테이너의 Curl 버전은 7.64.0입니다.

답변1

간단히 말해서:웹 서버를 복구하십시오.

아주 긴 이야기

HTTP 서버가 뭔가 잘못하고 있는 게 틀림없어요! curl서버에서 요청하지 않는 한 HTTP/2 연결은 시도되지 않습니다.

따라서 질문에 대한 대답은 다음과 같습니다.

컬은 호출할 때 어떻게 http 버전을 얻나요?

서버가 지원한다고 주장하는 콘텐츠를 수신합니다.

기본적으로 특정 버전을 사용하도록 정의할 수 있는 설정이 있습니까?

예, 이는 실제로 TLS(https://…), 이는 TLS/ALPN의 프로토콜 식별자를 사용하여 클라이언트에 의해 명시적으로 정의되어야 하며 h2서버는 해당 h2프로토콜을 지원한다고 응답합니다. 즉, 실제로 HTTP/2와 통신할 수 있다는 데 동의합니다.

그렇지 않으면 curl그럴 것입니다.아니요HTTP/2를 사용하세요.

HTTP 서버의 잘못된 동작을 직접 확인할 수 있습니다!

$ # https://stackoverflow.com does support HTTP/2
$ curl --verbose --output /dev/null https://stackoverflow.com
* Connected to stackexchange.com (151.101.65.69) port 443 (#0)
* ALPN: offers h2
* ALPN: offers http/1.1
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN: server accepted h2
* Using HTTP2, server supports multiplexing
> GET / HTTP/2

따라서 여기서는 프로토콜 ID가 서버에 curl제공되므로 HTTP/2를 사용하기 전에 서버가 실제로 이를 수락해야 함을 알 수 있습니다.h2curl

이를 오래된 웹 서버의 동작 및 반응과 비교해 보세요 curl.

$ # https://www.gnu.org only supports HTTP/1.1, in 2023.
$ curl --verbose --output /dev/null https://www.gnu.org/software/grub/manual/grub/html_node/normal.html
* Connected to www.gnu.org (2001:470:142:5::116) port 443 (#0)
* ALPN: offers h2
* ALPN: offers http/1.1
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server accepted http/1.1
> GET /software/grub/manual/grub/html_node/normal.html HTTP/1.1

curl따라서 웹 서버는 TLS 연결 설정 중에 HTTP/2(신호 전달을 통해)를 지원한다고 알려야 h2하지만 실제로는 지원하지 않습니다.

--http1.1이 서버에서는 작동하지 않지만 Docker 컨테이너에서는 작동하는 이유는 무엇입니까?

귀하의 호스팅 서버 curl매우이전 버전입니다. 이 옵션은 거의 10년 전 컬 버전 7.33.0에 추가되었습니다.

관련 정보