如何在 curl 中禁用 keepalive

che*_*vim 5 networking http keepalive curl

我试图弄清楚如何在通过curl.

这是我的目标服务器:

- Ubuntu 18.04.2 LTS
- 4.15.0-47-generic
- HA-Proxy version 1.8.19-1ppa1~bionic 2019/02/12
Run Code Online (Sandbox Code Playgroud)

这是我发布的客户端 1 curl(香草安装):

- 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
Run Code Online (Sandbox Code Playgroud)

这是我发布的客户端 2 curl(香草安装):

- 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
Run Code Online (Sandbox Code Playgroud)

要关闭 keepalive,我尝试使用-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都没有任何区别,并且我的两个客户端中的任何一个都始终使用 keepalive。所以我想目标服务器配置也在其中发挥了一些作用。

编辑:更复杂的是,如果我从客户端 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
Run Code Online (Sandbox Code Playgroud)

这些可以在这里找到:

小智 5

--no-keepalive 选项仅对 TCP keepalive 数据包有用,如 curl 网站上的此存档线程中所述:https : //curl.haxx.se/mail/archive-2013-04/0037.html

听起来您需要专门禁用 HTTP keepalive 数据包,这将在您的服务器上使用 keepalive_timeout 0 完成;正如在这个 stackoverflow 线程/sf/ask/1744696621/ 中提到的。

对不起,如果格式关闭,这是我的第一篇文章:)

希望有帮助!

  • 您的格式很好... 欢迎来到该网站 :) (2认同)

小智 -3

您可以使用选项 --no-keepalive。查看更多信息,请参见 mancurl

--no-keepalive 禁用 TCP 连接上的 keepalive 消息,默认情况下,curl 会启用它们。

请注意,这是记录的否定选项名称。因此,您可以使用 --keepalive 来强制保持活动。