背景
我们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的解释