2016-06-18 11 views
0

Ich habe einen Werkzeug Server hinter NGINX laufen. Wenn ein Client die Verbindung unterbricht, während er darauf wartet, dass der Werkzeug-Server antwortet, schließt NGINX die Pipe an Werkzeug. Wenn das Python-Programm die Antwort auf Werkzeug schreibt, tritt die folgende Ausnahme und Werkzeug stürzt:Wie verhindere ich, dass Werkzeug abstürzt, nachdem NGINX das Rohr geschlossen hat?

Traceback (most recent call last):
File "server.py", line 81, in
app.run(host=args.host, port=args.port, debug=False)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 843, in run
run_simple(host, port, self, **options)
File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 694, in run_simple
inner()
File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 659, in inner
srv.serve_forever()
File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 499, in serve_forever
HTTPServer.serve_forever(self)
File "/usr/lib/python2.7/SocketServer.py", line 238, in serve_forever
self._handle_request_noblock()
File "/usr/lib/python2.7/SocketServer.py", line 297, in _handle_request_noblock
self.handle_error(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock
self.process_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 321, in process_request
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.7/SocketServer.py", line 651, in init
self.finish()
File "/usr/lib/python2.7/SocketServer.py", line 710, in finish
self.wfile.close()
File "/usr/lib/python2.7/socket.py", line 279, in close
self.flush()
File "/usr/lib/python2.7/socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
socket.error: [Errno 32] Broken pipe

Gibt es eine Konfigurationsoption ich vermisst habe, damit er nicht abstürzt? Normalerweise werden alle Ausnahmen abgefangen und ein Fehler von 500 zurückgegeben, wobei der Server am Leben bleibt.

Antwort

0

Soweit ich aus dem Debug-Trace erraten und ohne den Quellcode zu lesen, schließen Sie wahrscheinlich den Sockel vorzeitig.

Your server process has received a SIGPIPE writing to a socket. This usually happens when you write to a socket fully closed on the other (client) side. This might be happening when a client program doesn't wait till all the data from the server is received and simply closes a socket (using close function).

In a C program you would normally try setting to ignore SIGPIPE signal or setting a dummy signal handler for it. In this case a simple error will be returned when writing to a closed socket. In your case a python seems to throw an exception that can be handled as a premature disconnect of the client.

How to prevent errno 32 broken pipe?

+0

Nginx schließt die Buchse, wenn der Client die Verbindung trennt. Wenn python die Antwort schreibt, tritt der Fehler auf, und werkzeug fängt ihn nicht ab. – Alexandre