相关推荐recommended
客户端Unexpected end of file from server 和 服务端nginx 408 的一种解决方法
作者:mmseoamin日期:2023-12-21

参考

https://www.jiweichengzhu.com/article/81044c11caf54753aeed94ef8fad1070

https://blog.csdn.net/chenz_yang/article/details/77238532

问题

终端设备(Debian系统、戴尔服务器)通过HTTPS向云端上报数据时,有的数据如设备心跳能上报,有的数据如服务器配置信息上报时报错:

Unexpected end of file from server

客户端Unexpected end of file from server 和 服务端nginx 408 的一种解决方法,在这里插入图片描述,第1张

“Unexpected end of file” implies that the remote server accepted and closed the connection without sending a response. It’s possible that the remote system is too busy to handle the request, or that there’s a network bug that randomly drops connections.

With the information available it’s impossible to say what’s going wrong. If you have access to the servers in question you can use packet sniffing tools to find what exactly is sent and received, and look at logs to of the server process to see if there are any error messages.

意思就是说“意外的文件结束”意味着远程服务器接受并关闭连接,而不发送响应。远程系统可能太忙,无法处理请求,或者有网络错误随机丢弃连接。

有了可用的信息,不可能说出了什么问题。如果您有权访问有问题的服务器,您可以使用数据包嗅探工具来查找发送和接收的内容,并查看服务器进程的日志,以查看是否有任何错误消息。

应该是云端服务器主动关闭了TCP连接。

再查看云端的日志,发现报了 nginx 408 错误。

并且只是个别终端设备在上报数据时会出现上述问题,即终端报Unexpected end of file from server,云端报nginx 408 。

分析

查资料,nginx 408与一下参数有关:

client_header_timeout

定义读取客户端请求请求头的超时,默认60s,如果客户端未在此时间内传输整个请求头,则请求将终止,并显示 408(请求超时)错误。‎

client_body_timeout

‎定义读取客户端请求正文的超时,默认60s,超时仅设置在两个连续读取操作之间的一段时间内,而不是为整个请求正文的传输设置,如果客户端未在此时间内传输任何内容,则请求将终止,并显示 408(请求超时)错误。‎

结合 “上述问题仅限于个别终端设备的个别接口”以及“nginx 408”的原因,初步认为:

部分终端设备在上报某些数据时可能出现了丢包

而使用ping检查终端与云端之间的网络,网络延迟并不大,而且仅仅是在上报某些数据时出现上述问题,怀疑可能是:

MTU设置不当导致终端到云端之间数据链路上的某个节点出现了丢包。

解决

终端设备网口的MTU是1500,修改为1200,问题就解决了。

附录

什么是MTU?

MTU: 最大传输单元,意思是网络上传输最大的数据包,mtu的单位是字节。

大部分的网络设备的mtu默认值是1500。如果本机的mtu值大于网关的mtu值,大的数据包就会被拆开来传送,这样会产生数据包的碎片,增加丢包率,降低网络速度。把mtu设置比网关小或者相同,可以减少丢包。设置合适的mtu值,可以减少部分网站打不开,上网速度慢等问题。一般情况,可以把路由器、交换机和服务器的mtu值统一设置。

查看服务器的mtu值

cat /sys/class/net/网口名称/mtu

或者

# ifconfig
ens18: flags=4163  mtu 1200

临时修改mtu值:(重启服务器后失效)

ifconfig  <网口名称> mtu 1200

永久生效

在NetworkManager的连接配置文件里配置mtu,在[ethernet]选项添加一行 mtu=1280:

客户端Unexpected end of file from server 和 服务端nginx 408 的一种解决方法,在这里插入图片描述,第2张