Nginx + Gunicorn + Flask - >使用X小时后持续500错误

Pet*_*tri 5 python nginx flask

我有一个与Nginx + Gunicorn一起运行的Flask应用程序通常没有问题.该应用程序仍在开发中,因此目前每小时只有一个请求.

问题是,Gunicorn似乎在上次重启后大约12-36小时后突然崩溃.当发生这种情况时,nginx仍然可以提供静态文件,但是即使Gunicorn进程仍然在服务器上运行,任何需要Gunicorn的东西都会返回500错误.通过重新启动Gunicorn sudo supervisorctl restart xxx(不需要nginx重启),问题总是在接下来的12-36小时内得到修复.到目前为止,问题已经发生了大约10次.是否有可能以某种方式改进日志记录或做其他事情?

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/;
        }
}
Run Code Online (Sandbox Code Playgroud)

主管conf启动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
Run Code Online (Sandbox Code Playgroud)

xxx.py

...
app = Flask(__name__)
...
if __name__ == '__main__':
    app.debug=True
    app.run()
Run Code Online (Sandbox Code Playgroud)

/var/log/gunicorn.error.log:500错误开始时没有记录任何内容.在500错误之前也没有可疑的行.

/var/log/gunicorn.log:没有可疑的行.

/var/log/nginx/error.log:没有可疑的行.

/var/log/nginx/xxx-access.log:这里可以看到500个错误:

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"
Run Code Online (Sandbox Code Playgroud)

Eug*_*tov 4

据我所知,gunicorn 没有选项log-file,只有access-logfileerror-logfile

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

但是要在 Flask 应用程序中记录错误,您必须在其中设置 python 记录器。例如,可以这样做:

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)
Run Code Online (Sandbox Code Playgroud)