nginx reload 导致的NoHttpResponseException

664 阅读1分钟

背景

我们java用的httpClient,在读取到响应头的keepalive相关时,保持长连接 我们的服务经常会发送http请求的报错

org.apache.http.NoHttpResponseException: example.com:80 failed to respond

询问运维后,可能是nginx的reload导致的

复现nginx reload导致的问题

web服务

@RequestMapping("/ping")
public String ping() {
    return "pong";
}

nginx配置

        location /api/ {
            proxy_pass http://127.0.0.1:8080/;
            proxy_set_header Host $proxy_host; # 修改转发请求头,让8080端口的应用可以受到真实的请求
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

测试代码


for (int j = 0; j < 10000; j++) {

    try {
        String response = HttpClientHelper.GetString("http://hadoop101/api/ping");
        System.out.println(response);
        TimeUnit.MILLISECONDS.sleep(10);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
           

在运行期间,调用期间,我们执行./nginx -s reload命令,百分百复现问题

查找相关文档

stackoverflow关于nginx reload的问题 github中关于nginx reload的解释 image.png

询问运维关于reload的时机以及次数

image.png