前段时间用 Flask 制作的一个网站在进行较大量计算时频繁出现 502 错误,在本地调试却无法重现发现,也并没有在服务器上看到 flask 提供的故障 log。
我怀疑是 Nginx 的错误,看了一下 Nginx 日志果然发现问题:
2017/01/06 16:42:17 [error] 15273#0: *1087067 upstream sent too big header while reading response header from upstream, client: xxx.xx.xxx.98, server: xxx.bbb.com, request: "GET /kpi/sheets/calc/?team_id=client&ks_date=2016-12&typ=all HTTP/1.1", upstream: "uwsgi://127.0.0.1:5000", host: "xxx.bbb.com", referrer: "http://xxx.bbb.com/kpi/sheets/client/2016-12/"
这是一个缓存设置的问题,打开 nginx 配置,加入两行配置即可:
uwsgi_buffers 16 16k; uwsgi_buffer_size 32k;
注意,如果你没有明确写入这两个参数,它们的默认值为:
uwsgi_buffers 8 4k|8k; # 根据操作系统内存页大小 uwsgi_buffer_size 4k|8k; # 根据操作系统内存页大小
具体配置的说明可以参考 uwsgi_buffers 和 uwsgi_buffer_size 。
解决方案来自于这个回答: upstream sent too big header while reading response header from upstream ,该回答针对 fastcgi ,改为 uwsgi 即可。
如何配置 Nginx 可以参考我的文章《部署Flask + uWSGI + Nginx》 中的配置 Nginx + uwsgi 。