[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]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 快速返回   返回列表 阅读657次
我的情况:
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”。
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved