问题描述
现象:生产环境50并发压测出现0.01%的错误率,全部为502/Bad Gateway
原因分析
1.通过观察nginx error log发现产生502的原因为"upstream prematurely closed connection while reading response header from upstream",也就是请求期间上游服务器关闭连接导致。
2.分析发现线上nginx upstream配置了keepalive参数,但没有配置proxy_http_version和proxy_set_header Connection,nginx与上游服务器间的连接为短链接。上游服务器处理完请求后会主动关闭连接,但因为nginx upstream设置了keepalive,nginx在收到reponse后仍然会尝试复用此连接,而此时连接已被上游服务器关闭,导致请求失败,出现上述报错。
解决方案
问题解决方式有2种,均已验证生效:
1.仍然使用短链接,去掉upstream中的keepalive参数,保证nginx不再尝试复用,否则在请求密集的时候有概率出现502;
2.使用长连接,加上proxy_http_version 1.1和proxy_set_header Connection "" 这两个配置项,保证服务端在请求处理完成后不主动关闭连接。
为避免出现大量TIME_WAIT,提高资源复用率,目前使用第二种长连接的方式。