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
を介してターゲットサーバーにリクエストを発行すると、接続は即座に殺された。 ab
はHTTP/1.0
ではなくHTTP/1.1
を使用するため、これは予期されることです。しかし、古いディストリビューションをApacheでターゲットにすると、どちらの場合も接続は開いたままになります。つまり、実際には、受信側も役割を果たします。
編集2:両方のクライアントのすべての/proc/sys/net/ipv4/
設定を取得しました:
for file in /proc/sys/net/ipv4/*
do
echo "$file $(cat $file)"
done
これらはここにあります:
--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 。
フォーマットがオフの場合は申し訳ありませんが、これは私の最初の投稿です:)
お役に立てば幸いです。
あたり https://ec.haxx.se/usingcurl-persist.html
curlは常に接続を維持し、可能な限り既存の接続を再利用しようとします。
そのため、そのままではツールを使用できません。
@ pl-nowlanが回答で述べたように、これを行う唯一の方法はサーバー側にあります。