2015-01-27 11 views
5

Ho un'app Flask che funziona normalmente con Nginx + Gunicorn senza problemi. L'app è ancora in fase di sviluppo, quindi al momento c'è solo una richiesta all'ora.Nginx + Gunicorn + Flask -> 500 errori costanti dopo X ore di utilizzo

Il problema è che Gunicorn sembra improvvisamente bloccarsi sempre dopo circa 12-36 ore dall'ultimo riavvio. Quando questo accade, nginx può ancora servire file statici, ma tutto ciò di cui ha bisogno Gunicorn inizia a restituire 500 errori anche se un processo di Gunicorn è ancora in esecuzione sul server. Il problema è sempre risolto per le successive 12-36 ore riavviando Gunicorn per sudo supervisorctl restart xxx (non è necessario riavviare nginx). Il problema si è verificato circa 10 volte finora. Sarebbe possibile migliorare la registrazione in qualche modo o fare qualcos'altro?

Nginx conf (/ etc/nginx/sites-available/xxx_gunicorn):

server { 
     listen 80 default_server; 
     listen [::]:80 default_server ipv6only=on; 

     access_log /var/log/nginx/xxx-access.log; 

     server_name 127.0.0.1 www.xxx.yy; 

     location/{ 
       proxy_pass_header Server; 
       proxy_set_header Host $http_host; 
       proxy_redirect off; 
       proxy_set_header X-Forwarded-For $remote_addr; 
       proxy_set_header X-Scheme $scheme; 
       proxy_connect_timeout 10; 
       proxy_read_timeout 10; 
       proxy_pass http://127.0.0.1:8000/; 
     } 

     location /static { 
       alias /opt/xxx/static/; 
     } 
} 

supervisore conf per iniziare gunicorn (/etc/supervisor/conf.d/xxx.conf)

[program:xxx] 
command = gunicorn xxx:app -b localhost:8000 --debug --log-level debug --log-file /var/log/gunicorn.log --error-logfile /var/log/gunicorn.error.log --workers 2 --worker-connections 1000 --max-requests 100 --timeout 30 
directory = /opt/xxx 
user = ubuntu 
stdout_logfile = /var/log/gunicorn.log ; Where to write log messages 
autostart=true 
autorestart=true 
redirect_stderr=true 

xxx.py

... 
app = Flask(__name__) 
... 
if __name__ == '__main__': 
    app.debug=True 
    app.run() 

/var/log/gunicorn.error.log: non si registra nulla all'avvio dei 500 errori. Nessuna linea sospetta prima dei 500 errori.

/var/log/gunicorn.log: Nessuna linea sospetti.

/var/log/nginx/error.log: nessuna riga sospetta.

/var/log/nginx/xxx-access.log: i 500 errori sono visibili qui:

80.221.255.134 - - [27/Jan/2015:07:01:50 +0000] "GET/HTTP/1.1" 500 291 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36" 

risposta

1

Come so gunicorn non hanno l'opzione file di log, solo accesso -logfile e errori file di log:

http://gunicorn-docs.readthedocs.org/en/latest/settings.html#logging

Ma il login errori nella tua applicazione di flask devi configurare python logger al suo interno. Ad esempio, può essere fatto in questo modo:

from logging.handlers import WatchedFileHandler 

@app.before_first_request 
def setup_logging(): 
    """ 
    Setup logging 
    """ 
    handler = WatchedFileHandler("/var/log/your_flask_app.log") 
    app.logger.addHandler(handler) 
    app.logger.setLevel(logging.INFO) 
+0

Grazie. Ho cambiato il log-file in access-logfile, devo vedere che otterrà informazioni extra. Cos'è il LoggerWrapper? Non ho trovato dove importarlo. – Petri

+0

Probabilmente si desidera un file di errore, anziché un file di accesso. L'accesso ti darà quasi esattamente ciò che è in /var/log/nginx/xxx-access.log. – bbenne10

+0

Mi dispiace per LoggerWrapper, è la mia classe, non ne hai bisogno. Ho modificato la risposta. Puoi leggere ulteriori informazioni sull'accesso al pallone qui: http://flask.pocoo.org/docs/0.10/errorhandling/ –

Problemi correlati