web-dev-qa-db-ja.com

カールでキープアライブを無効にする方法

curlを介してHTTPリクエストを発行しているさまざまなクライアントマシンでキープアライブを常にオフにする方法を理解しようとしています。

これは私のターゲットサーバーです:

- Ubuntu 18.04.2 LTS
- 4.15.0-47-generic
- HA-Proxy version 1.8.19-1ppa1~bionic 2019/02/12

これはクライアント1であり、ここでcurl(Vanillaインストール)を発行しています。

- Ubuntu 16.04.3 LTS
- 4.4.0-62-generic
- curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3

これは私がcurl(Vanillaインストール)を発行しているクライアント2です。

- Ubuntu 18.04 LTS
- 4.15.0-20-generic
- curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.0g zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3

キープアライブをオフにするために、-H "Connection: close"--no-keepalive--keepalive-time 1を使用してみましたが、最初のオプションのみが機能しているようですが、クライアント1からのみです。

クライアント1(Ubuntu 16)では、接続は開いたままではありませんが、クライアント2(Ubuntu 18)からは、タイムアウトになるまで接続は開いたままになります。ターゲットサーバーのwatch -n 0.1 "netstat -na | fgrep CLIENT_IP_ADDRESS"を確認するか、両方のクライアントで-vvvを使用して、クライアント1では常に* Closing connection 0、クライアント2では常に* Connection #0 to Host www.example.com left intactであることを確認します。

クライアント1と2の違いは明らかに、Ubuntuバージョンとcurlバージョンです。クライアント1では接続が閉じられ、クライアント2では接続が閉じられないのは何ですか?

また、ターゲットサーバーを古いApache httpdで古いディストリビューションを実行している別のマシンに変更した場合、Connection: closeを送信するかどうかに関係なく、キープアライブが常にどちらかから使用されることもわかりました。私の2つのクライアントの。したがって、ターゲットサーバーの構成もその中で何らかの役割を果たすと思います。

Edit:さらに複雑にするために、クライアント1と2からabを介してターゲットサーバーにリクエストを発行すると、接続は即座に殺された。 abHTTP/1.0ではなくHTTP/1.1を使用するため、これは予期されることです。しかし、古いディストリビューションをApacheでターゲットにすると、どちらの場合も接続は開いたままになります。つまり、実際には、受信側も役割を果たします。

編集2:両方のクライアントのすべての/proc/sys/net/ipv4/設定を取得しました:

for file in /proc/sys/net/ipv4/*
do
  echo "$file $(cat $file)"
done

これらはここにあります:

4
cherouvim

--no-keepaliveオプションが役立つのは、TCPキープアライブパケットの場合のみです。これは、curl Webサイトのこのアーカイブされたスレッドで言及されています: https://curl.haxx.se/mail /archive-2013-04/0037.html

具体的には、HTTPキープアライブパケットを無効にする必要があるようです。これは、keepalive_timeout 0を使用してサーバーで実行されます。このstackoverflowスレッドで述べたように https://stackoverflow.com/questions/24924237/linux-curlnginx-cant-request-with-no-keepalive

フォーマットがオフの場合は申し訳ありませんが、これは私の最初の投稿です:)

お役に立てば幸いです。

4
PL Nowlan

あたり https://ec.haxx.se/usingcurl-persist.html

curlは常に接続を維持し、可能な限り既存の接続を再利用しようとします。

そのため、そのままではツールを使用できません。

@ pl-nowlanが回答で述べたように、これを行う唯一の方法はサーバー側にあります。

1
chutz