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"
Grazie. Ho cambiato il log-file in access-logfile, devo vedere che otterrà informazioni extra. Cos'è il LoggerWrapper? Non ho trovato dove importarlo. – Petri
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
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/ –