我有一个长轮询客户端,它们连接到 nginx 和上游到 kestrel dot net。客户端设置了 2 分钟后连接中断的 keepalive。在 nginx 方面,我听 0.0.0.0:xxx ssl so_keepalive= 5m:10:5; 所以大约6分钟
我将 eth 电缆从电缆中拉出,防止任何传输,并且客户端检测到连接中断,但我的上游服务器没有。上游服务器永远不会检测到这一点。
现在 nginx 没有检测到这个中断吗?然后不关闭与上游的连接?或者我做错了什么?
谢谢
通常,当您将网络电缆从网络设备中拉出时(模拟网络上的一些中断,因此会出现模糊的断开连接),底层套接字不会检测到断开连接(至少我们的单元不会),因此我们使用 keep alive 来断开连接并重新连接。
所有单位都使用每小时长轮询到 nginx 服务器。所以我的问题是:
如果该单元没有检测到电缆断开连接(可能还有 100 种网络上的其他情况),那么 nginx 也没有断开套接字并且该套接字保持打开状态?
保持开放多久?
我们是否应该在 nginx 端也使用 tcp keep alive 对客户端?如何?
Chrome 的 keep-alive 数据包似乎阻止 Apache 响应来自其他客户端的所有请求。它们既不会出现在访问日志中,也不会出现在 mod_status 中,并且浏览器会一直等待答案。无论在 Apache 中启用还是禁用保持活动,都会发生这种情况。
这只发生在客户端在另一个网络上时,这似乎与 Chrome 功能有关,以保持连接在 NAT 网关/防火墙后面。从服务器机器上的浏览器,我总是可以访问 Apache 上的页面,即使第二个网络上的客户端被阻止。
在此 Wireshark 屏幕上,您可以看到当请求被 Chrome 阻止时服务器上发生的情况的示例:
当我关闭 Chrome 实例时,Apache 会继续回答之前收到的请求,这就是它们出现在访问日志中的时间。
当我在 Chrome 中刷新页面时,有时其他请求也会得到答复。
这是 Apache 错误还是配置错误?或者它可能是由网络配置引起的?
服务器:
我有两个詹金斯实例。我希望第一个实例的作业在第二个实例调用作业,等到它结束并执行一些操作(使用作业@ 2nd 产生的工件)
我想出了这个解决方案 - 通过 SSH 使用 Jenkins CLI 命令
ssh -p 2222 second-jenkins build second-job -s -v <further options>
但是此会话在 10 分钟后断开并显示消息:
收到与 192.168.147.102 的断开连接:2:用户空闲已在 600000 毫秒后超时。
我发现ssh 客户端选项名为ServerAliveInterval
ssh -o ServerAliveInterval=30 -p 2222 second-jenkins build second-job -s -v <...>
此选项的文档说
ServerAliveInterval
以秒为单位设置超时间隔,如果没有从服务器接收到数据,ssh(1) 将通过加密通道发送消息以请求服务器响应。默认为0,表示这些消息不会发送到服务器。此选项仅适用于协议版本 2。
这有效,但仅当服务器在每 10 分钟内至少安静 30 秒时才有效。当然,我可以使用 1 秒而不是 30 秒,但它不适用于具有连续控制台输出的作业(例如 maven 构建)。
即使对于繁重的控制台输出作业,是否有保持连接活跃的解决方案?
这样后续的请求仍然可以使用当前的连接。
最近在 $WORK 安装了一个新的 (NAT) 防火墙设备。从那以后,我遇到了很多网络超时和中断,特别是对于需要服务器思考一下而没有响应的操作(svn update、rsync 等)。VPN 上的入站 SSH 会话也经常超时。
这清楚地表明我需要调整相关服务器上的 TCP(和 ssh)保活时间,以减少这些错误。
但是我应该使用什么合适的值?
假设我在防火墙的两侧都有可以建立连接的机器,有没有办法测量这个防火墙的 TCP 连接时间限制可能是多少?
理论上,我会以逐渐增加的间隔发送一个数据包,直到连接丢失。任何可能有帮助的工具(免费或开源最好,但我愿意接受其他建议)?
该设备不在我的控制之下,所以我不能只获得价值,尽管我试图询问它目前是什么以及是否可以增加它。
我正在使用 IIS(在 Windows 2003 上)并在我的默认网站中放置了一个 dummy.html。该文件为空。
我正在使用wfuzz 多次访问此文件(wfuzz 执行 HTTP 请求),使用以下命令:
wfuzz.exe -c -z range -r 0-5000 "http://localhost/dummy.html"
我运行了 5 个并行 wfuzz 几分钟,然后 IIS 停止响应。发生这种情况时,我无法再在端口 80 上远程登录 localhost。如果我停止 wfuzz 客户端并等待一分钟,我可以再次远程登录端口 80。
如果我选择了在 IIS 中启用 HTTP Keep-Alives ,我只会看到这个问题。如果我禁用此选项,问题似乎就消失了。我可以运行 15 wfuzz 几分钟,并且仍然能够在端口 80 上 telnet localhost 没有任何问题。
IIS 被配置为使用无限数量的连接。
那么,为什么启用了Enable HTTP Keep-Alives后 IIS 会在一分钟后停止响应呢?
起初我以为问题是处于 TIME_WAIT 状态的套接字数量过多,但我不明白如果这是原因,为什么取消选择Enable HTTP Keep-Alives会解决问题。如果我的客户端在每个请求之间断开连接,我认为此设置不会对 IIS 行为产生任何影响。
我正在尝试找到一种快速重新启动 Apache 以应用配置更改的方法。目标是:
Apache有一个优雅的重启命令,满足了第一个目标,重启命令是即时的,现有的请求不受影响。但是,重新启动不是原子的。如果存在与处于 Keep-Alive 状态的服务器的现有连接,则它们发送的所有以下请求都由具有旧配置的旧进程处理。
在我的例子中,Apache 服务器位于负载均衡器后面,它可以通过单个连接发送数百个请求。因此,重启后,需要很长时间才能将新配置应用于所有新请求。
有什么方法可以解决这个问题,例如让 Apache 在完成当前请求后关闭任何现有的 Keep-Alive 连接到旧进程?
我有一个场景,TOADSoft客户端与 Oracle 服务器的长时间空闲会话似乎被拆除,因为它们在中间状态完整防火墙上超时。
这些会话可能会空闲几个小时!
全局增加防火墙的超时时间是不可接受的
,当然,它不支持特定流的更长超时时间。
我已经为 PuTTY 空闲连接解决了这个问题;
它允许可配置的 keep-alive。
但是,我还没有在 TOAD 软件中发现任何此类支持。
在系统范围的配置上查找了一下,我想出了这个关于配置系统范围的 Keep-Alives的 Microsoft TechNet 详细信息,其中涉及使用KeepAliveTime和相关的注册表变量。
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\KeepAliveTime
这似乎是使用系统范围 keep-alive 的 Linux 系统范围配置。
但是,这需要程序使用setsockopt()
并请求保持活动(对吗?)。
请记住,即使在内核中配置了 keepalive 支持,它也不是 Linux 中的默认行为。程序必须使用 setsockopt 接口为其套接字请求保持活动控制。实现keepalive的程序相对较少......