在NGINX关闭管道后如何防止Werkzeug崩溃?

时间:2016-06-18 14:14:35

标签: python flask werkzeug

我在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错误,服务器保持活动状态。

1 个答案:

答案 0 :(得分:0)

据我可以从调试跟踪猜测而不读取源代码,你可能过早地关闭了套接字。

  

您的服务器进程已收到写入套接字的SIGPIPE。当您在另一个(客户端)端写入完全关闭的套接字时,通常会发生这种情况。当客户端程序没有等到收到服务器的所有数据并且只是关闭套接字(使用close函数)时,可能会发生这种情况。

     

在C程序中,您通常会尝试设置忽略SIGPIPE信号或为其设置虚拟信号处理程序。在这种情况下,写入已关闭的套接字时将返回一个简单的错误。在你的情况下,python似乎抛出一个异常,可以作为客户端的过早断开来处理。

How to prevent errno 32 broken pipe?