我们有一个运行 CentOS 6.5 的托管专用服务器,它是我们网站的生产服务器。我有一台本地服务器,它也被重新用作备份服务器,运行 CentOS 6.5,仅用于存储备份文件。两台服务器都安装了所有适当的更新。
在生产服务器上,我已安排所有备份脚本通过 cron 运行,以创建备份文件并将它们 rsync 到备份服务器。所有脚本都按时执行,但由于尝试联系备份服务器时出现 SSH 超时,rsync 失败。
这就是我遇到的问题。即使脚本超时,我也可以同时使用 PuTTY 和 WinSCP 通过 SSH 登录到备份服务器。只要我在备份服务器上重新启动 sshd 服务,生产服务器上的脚本就会顺利运行(通过命令行和 cron 都可以)。
这就像备份服务器决定在很长时间后停止监听生产服务器一样。
在询问之前,请提供一些额外的详细信息:
- 备份服务器防火墙允许来自生产服务器的所有连接
- 只要备份服务器上的 sshd 服务已重新启动(即不是脚本问题),脚本就可以在命令行和 cron 中正常工作
- SSH 使用公钥认证来验证连接
- 我在备份服务器的 SSH 日志中找不到任何错误。同样,它就像是停止监听生产服务器一样,尽管我可以从另一台机器连接。
我确实需要一些帮助来了解应该寻找什么。我可以设置一个脚本,在生产服务器运行脚本之前重新启动备份服务器上的 sshd 服务,但这感觉更像是黑客行为,而不是修复。任何帮助都将不胜感激。
编辑
请求示例脚本。这将备份数据库并将它们与整个网站目录一起 rsync:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# -----------------
# NIGHTLY BACKUP SCRIPT
# -----------------
# --Set log file and capture parameters
exec &> /path/logfile.log
#
# --Set Current Date Time
now=$(date +"%Y-%m-%d")
#
# --Backup Database 1
/usr/bin/mysqldump -u USER -pPASSWORD DATABASE1 | /bin/gzip > /path/database1-$now.sql.gz
#
# --Backup Database 2
/usr/bin/mysqldump -u USER -pPASSWORD DATABASE2 | /bin/gzip > /path/database2-$now.sql.gz
#
# --Sync Database Backups to Remote Server
/usr/bin/rsync -avz -e "ssh -v -p # -i /path/key" /path USER@IP:/path
#
# --Sync all Website Files to Remote Server
/usr/bin/rsync -avz --delete -e "ssh -v -p # -i /path/key" /path USER@IP:/path
编辑2
请求日志输出。以下是上述脚本中“将数据库备份同步到远程服务器”的 rsync 行的日志输出
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to IP [IP] port #.
debug1: connect to address IP port #: Connection timed out
ssh: connect to host IP port #: Connection timed out
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(600) [sender=3.0.6]
还要求我运行以下命令:nc -v IP PORT
但是,结果几乎与日志相同:
nc: connect to IP port # (tcp) failed: Connection timed out
在备份服务器上重新启动 sshd 服务并重新运行“nc”命令后,我得到以下信息:
Connection to IP # port [tcp/fpo-fns] succeeded!
SSH-2.0-OpenSSH_5.3
答案1
作为测试,我创建了一个脚本,每小时运行一次,并将网站目录从生产服务器 rsync 到备份服务器。我以为我至少会找出备份服务器停止允许来自生产服务器的连接的大致时间。相反,每小时脚本和所有其他脚本自昨天以来一直运行正常。
虽然我不认为这是一个真正的“修复”,但它至少似乎解决了这个问题,我不再需要通过在备份服务器上重新启动 sshd 服务然后在生产服务器上运行脚本来手动启动备份。如果有人知道为什么这会解决这个问题,请在评论中告诉我,因为我仍然想找出根本原因。