我在NGINX后面运行了一个Werkzeug服务器。当客户端在等待Werkzeug服务器响应时断开连接时,NGINX将管道关闭到Werkzeug。当python程序将响应写入Werkzeug时,会发生以下异常并且Werkzeug崩溃:
追踪(最近的呼叫最后):
文件" server.py",第81行,在 app.run(host = args.host,port = args.port,debug = False)
文件" /usr/local/lib/python2.7/dist-packages/flask/app.py" ;,第843行,在运行中
run_simple(host,port,self,** options)
文件" /usr/local/lib/python2.7/dist-packages/werkzeug/serving.py",第694行,在run_simple中 内()
文件" /usr/local/lib/python2.7/dist-packages/werkzeug/serving.py" ;,第659行,内部
srv.serve_forever()
文件" /usr/local/lib/python2.7/dist-packages/werkzeug/serving.py",第499行,在serve_forever中 HTTPServer.serve_forever(个体经营)
文件" /usr/lib/python2.7/SocketServer.py",第238行,在serve_forever中 self._handle_request_noblock()
文件" /usr/lib/python2.7/SocketServer.py",第297行,在_handle_request_noblock中 self.handle_error(request,client_address)
文件" /usr/lib/python2.7/SocketServer.py",第295行,在_handle_request_noblock中 self.process_request(request,client_address)
文件" /usr/lib/python2.7/SocketServer.py",第321行,在process_request中
self.finish_request(request,client_address)
文件" /usr/lib/python2.7/SocketServer.py",第334行,在finish_request中 self.RequestHandlerClass(request,client_address,self)
文件" /usr/lib/python2.7/SocketServer.py",第651行, init
self.finish()
文件" /usr/lib/python2.7/SocketServer.py" ;,第710行,在完成中
self.wfile.close()
文件" /usr/lib/python2.7/socket.py" ;,第279行,关闭
self.flush()
文件" /usr/lib/python2.7/socket.py" ;,第303行,在冲洗中
self._sock.sendall(查看[write_offset:write_offset + BUFFER_SIZE])
socket.error:[Errno 32]管道破损
是否有一些配置选项我没有丢失以防止崩溃?通常会捕获所有异常并返回500错误,服务器保持活动状态。
答案 0 :(得分:0)
据我可以从调试跟踪猜测而不读取源代码,你可能过早地关闭了套接字。
您的服务器进程已收到写入套接字的SIGPIPE。当您在另一个(客户端)端写入完全关闭的套接字时,通常会发生这种情况。当客户端程序没有等到收到服务器的所有数据并且只是关闭套接字(使用close函数)时,可能会发生这种情况。
在C程序中,您通常会尝试设置忽略SIGPIPE信号或为其设置虚拟信号处理程序。在这种情况下,写入已关闭的套接字时将返回一个简单的错误。在你的情况下,python似乎抛出一个异常,可以作为客户端的过早断开来处理。