[备忘]nginx的502错误:recv() failed (104: Connection reset by peer) while reading response header from ups |
上一篇:[备忘]SoftEther vpn连接不上的问题 下一篇:[备忘]soapconnection的call设置timeout |
添加日期:2020/2/13 12:13:37 |
快速返回 返回列表 |
阅读3849次 |
我的情况: nginx的upstream的keepalive的timeout是300秒, tomcat这边没设置,默认是连接超时的时间20秒, 我的理解:tomcat这边超时了,断开连接,nginx还发送数据过来,然后服务器直接回复rst, nginx这边显示connection reset. 解决方法,在tomcat里增加keepAliveTimeout="400000" maxKeepAliveRequests="1000" 让tomcat这边时间长。貌似好了吧,我再观察。 ---------------------------------------
(0) 通过下面的数据包可以看到,TCP连接在空闲了20s之后, 有tomcat发起了断开,但是这是nginx正好发送了一个请求过去, tomcat没有回应这个请求, 而是通过RST异常结束了这个连接。 这样就解释了tomcat为什么没有日志的情况。
(1) 前面说到出现“Connection reset”的原因是服务器关闭了Connection[调用了Socket.close()方法]。 大家可能有疑问了:服务器关闭了Connection为什么会返回“RST” 而不是返回“FIN”标志。 原因在于Socket.close()方法的语义和TCP的“FIN”标志语义不一样: 发送TCP的“FIN”标志表示我不再发送数据了, 而Socket.close()表示我不在发送也不接受数据了。 问题就出在“我不接受数据” 上,如果此时客户端还往服务器发送数据, 服务器内核接收到数据,但是发现此时Socket已经close了, 则会返回“RST”标志给客户端。 当然,此时客户端就会提示:“Connection reset”。 详细说明可以参考oracle的有关文档: http://docs.oracle.com/javase/1.5.0/docs/guide/net/articles/connection_release.html。
(2) 比较常见的错误“Connection reset by peer”,该错误和“Connection reset”是有区别的:
服务器返回了“RST”时,如果此时客户端正在从Socket套接字的输出流中读数据则会提示Connection reset”;
服务器返回了“RST”时,如果此时客户端正在往Socket套接字的输入流中写数据则会提示“Connection reset by peer”。
|
|