python - 非标准端口的 Python HTTPServer SSL 握手挂起
问题描述
我有一个问题,我已经挣扎了几天了。
我有一个基于 SSL 的简单 ThreadedHTTPServer,它为一天中的少量请求提供服务。
每个随机 10 个左右的连接,服务器线程都会挂起(我有一个与服务器线程并行运行的计划线程,但在服务器线程挂起时继续正常运行)。
当它挂起时,在尝试与 openssl 客户端连接时,我无法比 SSL 握手的 Client Hello 更进一步。
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。我搜索了高低,但我在任何票证中都没有看到暗示这可能是一个问题。我想我唯一注意到的是,它强烈表明 http.server for python 不应该用于生产......
解析度
以上都没有奏效。目前最简单的方法是不让 Python 负责处理 SSL 连接并将其委托给 Nginx。
解决方案
推荐阅读
- swift - tableView.setContentOffset(_, animated:) 在 beginUpdates() 之后不起作用
- python - Python网页抓取(request.get)无法获取目标网页
- python - 尽管在一个范围内迭代,但字符串索引超出范围
- python - Pandas - 如果匹配条件和在其他列中定义的时间范围,则为行分配值
- c - 为什么此代码击败 rint() 以及如何保护它免受 -ffast-math 和朋友的影响?
- excel - 在 VBA 中选择和格式化边框
- javascript - Mongoose findOneAndUpdate 不适用于 Stripe 的所有其他功能,但没有副作用
- angular - Angular 中的单元测试 not.toBe(true) 与 toBeFalsy()
- css - 关于 CSS 向左移动图标
- swift - 背景颜色渐变不覆盖整个视图 Xcode