nginx 内存膨胀的一个bug

我描述一下这个 bug 。
nginx, 用作代理,proxy next upstream 里配置了 404 就next ,然后过了一段时间就发现,一些 worker 占用的内存竟然达到 几百m,通常只是几十m 而已。一不小心占满了内存,用上了 swap (有些机器把 swap 关掉的话,就直接卡死,ping 不通了),load 就上去了,如果不能及时把这个 worker kill 了,那也完蛋了。

我说说这个 bug 的触发条件吧
nginx 里配置了
proxy_next_upstream error timeout http_404;
http_404 是指,后端返回 404 的话,就把请求往下一个后端发。

upstream 的配置分以下几种情况:
upstream {
server 192.168.51.1 ;
server 192.168.51.2 ;
}
这种情况下,如果 51.1 和 51.2 都404,那么nginx 直接返回给用户 404 了。

upstream {
server 192.168.51.1 ;
server 192.168.51.2 backup ;
}
请求会卡死,负责处理这个请求的 worker 占用的内存会慢慢增大,也就是我说的那个情况了。即使这个请求取消了,这个 worker 占用的内存仍然会膨胀。
backup ,只是为了 51.1 在挂的时候,可以顶上,但想不到竟然触发了这个 bug 。。。
我测试了 0.6.39 ,0.7.65 , 0.8.32 ,这个 bug 都会存在。

upstream {
server 192.168.51.1 ;
}
如果只配置了一个后端,其实也是很快返回404 的,不会卡死。

———————————
结论:
如果配置了 proxy_next_upstream http_404,千万别配置两个后端,其中一个后端是 backup 的。

Submit a Comment