サーバーおよび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

簡単に言うと:Webサーバーを回復します。

とても長い話

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

これを古いWebサーバーの動作と反応と比較してください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したがって、WebサーバーはTLS接続の確立中にHTTP / 2(シグナル転送を介して)をサポートすることを知らなければなりませんh2が、実際にはサポートしません。

--http1.1がサーバーでは機能しませんが、Dockerコンテナでは機能するのはなぜですか?

あなたのホスティングサーバーcurl非常に以前のバージョンです。このオプションは、ほぼ10年前のカールバージョン7.33.0に追加されました。

関連情報