Ruby 中的套接字超时

Socket timeout in Ruby

我有以下代码,基本上使用 SSL 在端口 443 上侦听(从此处的另一个问题复制): How can I get info on an already closed SSL connection that caused an error?

#!/usr/bin/env ruby

require "socket"
require "openssl"

cert_path = Dir["/etc/letsencrypt/live/example.com/fullchain.pem"].first
key_path = Dir["/etc/letsencrypt/live/example.com/privkey.pem"].first
chain_path = Dir["/etc/letsencrypt/live/example.com/chain.pem"].first
context = OpenSSL::SSL::SSLContext.new
context.cert = OpenSSL::X509::Certificate.new( File.read( cert_path ))
context.key = OpenSSL::PKey::RSA.new( File.read( key_path ))
context.extra_chain_cert = [ OpenSSL::X509::Certificate.new( File.read( chain_path )) ]

port = 443
t = TCPServer.new( port )
s = OpenSSL::SSL::SSLServer.new( t, context )

begin
    r = s.accept
rescue
    # get client ip here
    p r.methods.sort
end

客户端通过 post 请求向服务器发送信息,代码在这里运行超过 35 分钟,然后有关操作的结果被发送回客户端。这个电话是一个阻塞电话,我需要这样。

问题是,如果代码运行超过 30 分钟,则服务器代码无法发回信息。如果在 30 分钟以下,则可以没有任何问题。操作系统是 Linux (Ubuntu 18 x64),我一直用 netstat 检查套接字,它们一直在那里,直到程序结束,状态为 ESTABLISHED,这里没有可疑的东西。

我假设它必须对某种系统超时值进行处理。在 post 调用中,我将所有超时设置为 HTTP 对象(打开、读取、keep_alive、继续、写入、ssl),仍然没有成功,结果没有返回给客户端.

关于什么设置可能导致这个问题,你能给我一些提示吗?谢谢。


编辑:

我已经在没有 SSL 层的情况下测试了我的代码,没有超时问题。我还测试了上面Contex对象的超时和ssl_timeout属性,没有任何结果。还在寻找一个设置来避免SSL层超时导致的问题。


编辑:

我在客户端使用 Python3 而不是 Ruby (2.6) 通过 SSL 测试了调用,同样的问题发生了。服务器端有 Ruby。因此,要么是 OpenSSL 的 Ruby 实现,要么是 OpenSSL 本身。


编辑:

新进展:我注意到在同一台主机上通过 SSL 启动程序没有问题,所以我认为我的托管服务提供商可能会对较长的连接设置一些限制。


编辑:

已解决。我从来没有这么想过,但我的 ISP 与我的较长连接的时间限制问题有关。

我已经测试过,我的 ISP 与我的较长连接的时间限制问题有关。