作者:mobiledu2502908767 | 来源:互联网 | 2023-07-24 14:41
最近项目开发中用到云服务器,部署了MySQL,开发团队总是反映MySQL过一会儿就断开连接了,必须手动重连才可以。反映越来越强烈,已经到了影响开发进度的高度了,必须解决!查了资料,这个可能和SSH超时
最近项目开发中用到云服务器,部署了MySQL,开发团队总是反映MySQL过一会儿就断开连接了,必须手动重连才可以。反映越来越强烈,已经到了影响开发进度的高度了,必须解决!
查了资料,这个可能和SSH超时自动断开是一样的,可以修改以下2个配置参数来解决。
方法一、用SSH登录到Linux的时候,由于默认的连接超时时间很短,经常需要短了后再连接,比较麻烦。可以修改下sshd的配置文件,然后重启sshd服务即可:
1、#vim /etc/ssh/sshd_config
搜索并修改:
#ClientAliveInterval 0改为ClientAliveInterval 30 (每30秒往客户端发送会话请求,保持连接)
#ClientAliveCountMax 3 (去掉注释即可,3表示重连3次失败后,重启SSH会话)
2、#/etc/init.d/sshd restart #重启sshd服务
方法二、可以编辑/etc/profile文件,在里面加上一句TMOUT=300之后重新登录就可以了.
HOSTNAME='/bin/hostname'
HISTIZE=30
TMOUT=300
# 将以上900修改为0就是设置不超时
source /etc/profile
# 让配置立即生效
顺便解释一下HISTSIZE是系统自动保存的历史命令条数,太多了没什么意义,所以我设置了30
方法三、不修改配置文件
在命令参数里ssh -o ServerAliveInterval=60 这样子只会在需要的连接中保持持久连接, 毕竟不是所有连接都要保持持久
=====================补充========================
keeping your ssh session alive through
pesky(讨厌的,麻烦的) NAT firewalls.NAT firewalls like to time out idle sessions to keep their state tables clean and their memory footprint low.
NAT防火墙喜欢对空闲的会话进行超时处理,以确保它们状态表的干净和内存的低占用率。
Some firewalls are nice, and let you idle for up to a day or so; some are gestapo and terminate your session after 5 minutes.
一些防火墙比较友好,允许你的空闲会话时间为一天甚至超过一天;另一些却如盖世太保,5分钟空闲就终止你的会话。
I finally got tired of my ssh sessions getting disconnected at places where I don't control the firewalls, and figured out how to stop it.
我最终疲于我的ssh连接会话被我不能控制的防火墙断开,并找出了阻止它的方案。
Turn out ssh has a nice inband keepalive mechanism, and even lets you set it on a per-destination basis.
结论是ssh内带有一个很好的保持会话存活机制,甚至允许你在每一台目标机器上设置。
Just create a ~/.ssh/config file with something like the following (* will match any host, if you wanted you could restrict this to particular destinations like *kehlet.cx):
只要用以下类似的内容创建一个 ~/.ssh/config文件(*号将匹配所有的主机,如果你想,你可以严格的设置它为特定的目标主机,像kehlet.cx):
----------------
Host *
ServerAliveInterval 240
----------------
That's how often, in seconds, ssh will send a keepalive request (at the application layer) to the other end if the connection's been otherwise idle. 4 minutes should be good :-).
这通常是以秒为单位,如果这个连接空闲,ssh将发送一个保持存活的请求(在应用层)给另一端。4分钟应该不错。
The Host line lets you pattern match your destinations. Minimal effort, no impact to your system (say, as you would have if you mucked with your system's default TCP keepalive settings), and it works like a charm.
Host行使你匹配你的目标主机。极小的努力,对你的系统毫无影响(即,如果你弄乱你的系统默认TCP保持存活时间设置的话,将影响你的系统),并且很有效。
解决方法中要用到的脚本和图
1、$TMOUT 系统环境变量
# 用以下命令判断是否是否设置了该参数
echo $TMOUT
# 如果输出空或0表示不超时,大于0的数字n表示n秒没有收入则超时
# 修改方法
vi /etc/profile
# ----------------------------
export TMOUT=900
# ----------------------------
# 将以上900修改为0就是设置不超时
source /etc/profile
# 让配置立即生效
2、sshd 服务配置
cd /etc/ssh
# 查看sshd_config中关于客户端活动状态的配置
grep ClientAlive sshd_config
# 默认配置如下
# ----------------------------
#ClientAliveInterval 0
#ClientAliveCountMax 3
# ----------------------------
# ClientAliveInterval指定了服务器端向客户端请求消息的时间间隔, 默认是0, 不发送。设置60表示每分钟发送一次, 然后客户端响应, 这样就保持长连接了。
# ClientAliveCountMax表示服务器发出请求后客户端没有响应的次数达到一定值, 就自动断开。正常情况下, 客户端不会不响应,使用默认值3即可。
# 备份原配置文件
cp sshd_config sshd_config.bak
# 启用客户端活动检查,每60秒检查一次,3次不活动断开连接
sed -i "s/#ClientAliveInterval 0/ClientAliveInterval 60/g" sshd_config
sed -i "s/#ClientAliveCountMax 3/ClientAliveCountMax 3/g" sshd_config
# 确认修改
grep ClientAlive sshd_config
# 比较配置文件差异
diff sshd_config sshd_config.bak
# 重新加载ssd配置,让配置生效
service sshd reload
修改配置截图: