Flask 502 错误解决:upstream sent too big header and invalid request block size

前段时间用 Flask 制作的一个网站在进行较大量计算时频繁出现 502 错误,在本地调试却无法重现发现,我怀疑是服务器配置问题。现已查明原因,分别是 Nginx 配置和 uwsgi 配置造成的。

upstream sent too big header while reading response header from upstream

这个错误的可以在 Nginx log 中找到:

12017/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 配置,加入两行配置即可:

1uwsgi_buffers 16 16k;
2uwsgi_buffer_size 32k;

注意,如果你没有明确写入这两个参数,它们的默认值为:

1uwsgi_buffers 8 4k|8k; # 根据操作系统内存页大小
2uwsgi_buffer_size 4k|8k; # 根据操作系统内存页大小

具体配置的说明可以参考 uwsgi_buffersuwsgi_buffer_size

解决方案来自于这个回答: upstream sent too big header while reading response header from upstream ,该回答针对 fastcgi ,改为 uwsgi 即可。

如何配置 Nginx 可以参考我的文章《部署Flask + uWSGI + Nginx》 中的 配置 Nginx + uwsgi

invalid request block size

另一个 502 错误则是由 uwsgi 造成的。现象是 uwsgi 的 log 中出现了这样的提示:

1invalid request block size: 4363 (max 4096)...skip

将 uwsgi 配置文件中的 buffer-size 设置为较大的值即可,例如我设置为32KB:

1buffer-size = 32768

如何配置 Nginx 可以参考我的文章《部署Flask + uWSGI + Nginx》 中的 配置 uwsgi