我正在使用用 Python 3.5 编码的 websocket 服务器。这是提供我的网站实时信息所必需的。
我使用的“服务器”库称为tornado(4.3 版),它处理 websocket 连接和 http 请求。为了向后兼容(如果浏览器还不支持 websocket),我使用 python 库sockjs-tornado(版本 1.0.3),它还为 websocket 连接添加了一些附加功能。
此连接使用协议 wss://,因此它被加密并为套接字连接加载证书。问题是当服务器运行了很长时间时我得到一个错误。
ERROR:tornado.application:Exception in callback (<socket.socket fd=18, family=AddressFamily.AF_INET, type=2049, proto=6, laddr=('***', 8443)>, <function wrap.<locals>.null_wrapper at 0x6fbeea4769d8>)
Traceback (most recent call last):
File "/home/website/python/tornado/ioloop.py", line 883, in start
handler_func(fd_obj, events)
File "/home/website/python/tornado/stack_context.py", line 275, in null_wrapper
return fn(*args, **kwargs)
File "/home/website/python/tornado/netutil.py", line 274, in accept_handler
callback(connection, address)
File "/home/website/python/tornado/tcpserver.py", line 239, in _handle_connection
do_handshake_on_connect=False)
File "/home/website/python/tornado/netutil.py", line 510, in ssl_wrap_socket
context = ssl_options_to_context(ssl_options)
File "/home/website/python/tornado/netutil.py", line 487, in ssl_options_to_context
context.load_cert_chain(ssl_options['certfile'], ssl_options.get('keyfile', None))
OSError: [Errno 24] Too many open files
我已经增加了 linux 服务器上打开文件的限制,但是如果 python 脚本在 24 小时后没有重新启动,那么如果连接了大约 300 个客户端,就会弹出这些错误。如果我在这段时间内重新启动脚本,一切都会再次正常运行,即使在每个人都重新连接之后也是如此。
我真的不知道该怎么做,因为龙卷风似乎没有正确关闭证书文件并在每个新连接上重新加载它们。