You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu Server 随机连接中断问题排查及保活脚本实现咨询

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

火山引擎 最新活动