我有一个问题已经困扰了几天。
我有一个基于SSL的简单ThreadedHTTPServer,它可以为一天中出现的少量请求提供服务。
每随机10个左右的连接,服务器线程就会挂起(我有一个调度的线程与服务器线程并行运行,但是在服务器线程挂起时仍可以正常运行)。
当挂起时,尝试与openssl客户端连接时,我无法超越SSL握手的“客户端问候”。
openssl s_client -connect HOST:7813 -prexit
我尝试过的事情:
赞:
class ForeMan(BaseHTTPRequestHandler):
def setup(self):
self.request.settimeout(1) # no
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
def get_request(self): #no
...
sock.settimeout(1)
def server_bind(self):#no
....
self.socket.settimeout(1)
通过重写address_string()函数来禁用由BaseHTTPRequestHandler执行的DNS解析...如果由于某种原因DNS解析比较滞后但未解决SSL握手挂起问题,可能会有所帮助
我试图检查是否使用的是TLS版本,但使用--tlv1.x进行的卷发并没有导致挂起。它只是在某些浏览器客户端发出请求时才随机发生。
将HTTPServer的端口更改为443而不是7813。我已经搜索过高和低,但是在任何票证中都没有看到任何内容暗示这可能是一个问题。我想我唯一要注意的是,它强烈指示不应将python的http.server用于生产...
解决方案
以上方法均无效。目前,最简单的方法是不让Python负责处理SSL连接并将其委托给Nginx。