nginx 502 bad gateway

项目页面上点一点,偶尔会出502报错,因为开发不怎么影响,之前一直没细查,今天测试开了issue出来,就抽空查了一下


结论

    gunicorn同步模式启动的时候,可指定worker的timeout时间,默认是30s,根据官方文档和作者的解释,如果一个worker持续繁忙超过timeout时间,就会被kill掉,然后有新的子进程起来,但是当时触发了worker timeout的请求就502了。

参考

http://docs.gunicorn.org/en/stable/settings.html#timeout

https://github.com/benoitc/gunicorn/issues/1801#issuecomment-398661674

过程

1. nginx

    既然nginx 502,先查nginx的log

nginx error log
nginx access log

    时间对上以后,看的出来,access 502的时候,error log里也报错了,上游服务器关闭了连接,看来应该是后台服务的问题。

2. gunicorn

    后台是用gunicorn启动的,查看gunicorn进程的log

worker timeout

    继续查worker timeout是什么问题,而且这个log level是critical,官方文档:gunicorn timeout参数 ,找到了一个github上的issue,里面有owner的comment:timeout的生效方式,为什么level是critical,合起来解释了一下这个timeout时间的作用。当worker持续工作超过timeout时间后,就会被kill掉,新的子进程会起来,同步模式下建议设置大一点,异步模式没什么影响。

其他

    还查了一下我们自己服务的log,发现这个时间点,没有收到请求,所以worker timeout直接导致触发timeout的那个请求被502了。

    因为我们是同步启动的,先把timeout改成300了,观察一下。

    还有个gevent和gunicorn和sqlalchemy共同使用的坑没填。

你可能感兴趣的:(nginx 502 bad gateway)