Ubuntu Server 随机连接中断问题排查及保活脚本实现咨询
Hey,我来帮你捋捋这个问题!从你描述的情况来看,20分钟无活动就断连、ping一下就恢复,而且同镜像的新服务器都有这问题、老服务器没事,基本可以排除硬件原因,大概率是网络会话超时搞的鬼——不管是虚拟主机的防火墙、路由器还是服务商的NAT设备,都会把长时间没流量的会话给清掉,ping产生的流量刚好能重新激活会话。
我分两部分给你说:先讲从根源解决问题的排查方案,再给你要的保活脚本方案,优先推荐前者,毕竟脚本是临时 workaround,从根源解决更靠谱。
一、先排查并调整系统层面的TCP/SSH保活参数
这是最优雅的解决方式,利用协议本身的机制保持会话,不用额外发ping流量。
1. 调整Linux系统TCP全局保活参数
Linux默认的TCP保活探测包要等2小时才发,远超过你遇到的20分钟超时,所以得把时间改短:
- 先看当前的TCP保活设置:
sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes - 临时调整(重启服务器会失效,先测试用):
sysctl -w net.ipv4.tcp_keepalive_time=1200 # 20分钟=1200秒,刚好在超时前发第一个探测包 sysctl -w net.ipv4.tcp_keepalive_intvl=60 # 每隔60秒发一次探测包 sysctl -w net.ipv4.tcp_keepalive_probes=5 # 连续发5次没回应才断开 - 永久生效:编辑
/etc/sysctl.conf,把下面三行加进去,然后执行sysctl -p让设置立刻生效:net.ipv4.tcp_keepalive_time=1200 net.ipv4.tcp_keepalive_intvl=60 net.ipv4.tcp_keepalive_probes=5
2. 调整SSH服务的保活设置
SSH连接冻结也可能是SSH服务本身的参数太保守,改一下sshd的配置:
- 编辑
/etc/ssh/sshd_config,找到或添加下面两行:ClientAliveInterval 600 # 每10分钟给客户端发一次心跳包 ClientAliveCountMax 3 # 连续3次没收到回应就断开连接 - 重启SSH服务生效:
systemctl restart sshd
3. 容器网络的额外检查
如果你的WebApp用Docker之类的容器部署,要是用了NAT模式,记得同步调整容器内部的TCP保活参数(和上面的系统参数调整方法一样),或者检查宿主机的容器网络配置有没有会话超时限制。
二、临时保活脚本方案(如果暂时没法调整系统参数的话)
要是你先想要个临时的保活脚本,我给你写个简单的,用systemd管理,开机自启还能自动重启:
1. 写保活脚本
创建/usr/local/bin/keepalive.sh,内容如下:
#!/bin/bash # 每隔15分钟ping3次谷歌,产生少量网络流量防止会话超时 while true; do # 把输出丢到/dev/null,避免占日志 ping -c 3 google.com > /dev/null 2>&1 sleep 900 # 900秒=15分钟,比20分钟提前,刚好卡超时前激活会话 done
2. 给脚本加执行权限
chmod +x /usr/local/bin/keepalive.sh
3. 配置systemd服务让脚本后台运行
创建/etc/systemd/system/keepalive.service,内容:
[Unit] Description=Network Keepalive Script After=network.target [Service] Type=simple ExecStart=/usr/local/bin/keepalive.sh Restart=always # 脚本意外退出自动重启 User=root [Install] WantedBy=multi-user.target
4. 启动并设置开机自启
systemctl daemon-reload # 重新加载systemd配置 systemctl start keepalive.service # 启动服务 systemctl enable keepalive.service # 设置开机自启
最后提个小建议
优先试试调整TCP和SSH的保活参数,这是从协议层面解决问题,比ping脚本更高效也更规范。如果调整后还是有问题,建议联系你的虚拟主机提供商,问问他们的网络设备是不是有20分钟的会话超时限制——毕竟老服务器没事,新服务器用同镜像就出问题,大概率是新服务器的网络配置模板有差异。
备注:内容来源于stack exchange,提问作者billh-c




