我们有一个运行 CentOS 6.5 的托管专用服务器,它是我们网站的生产服务器。我有一个本地服务器,它也被重新用作 CentOS 6.5 的备份服务器,在这里只是为了存储备份文件。两台服务器都安装了所有适当的更新。
在生产服务器上,我将所有备份脚本都安排为通过 cron 运行,以创建备份文件并将它们同步到备份服务器。这些脚本都按时执行,但 rsync 在尝试联系备份服务器时由于 SSH 超时而失败。
这就是我卡住的地方。即使脚本超时,我也可以同时使用 PuTTY 和 WinSCP 通过 SSH 登录到备份服务器。一旦我在备份服务器上重新启动 sshd 服务,生产服务器上的脚本就会顺利运行(通过命令行和 cron)。
就像备份服务器在这么长时间后决定退出侦听生产服务器一样。
在被问及之前的一些额外细节:
- 备份服务器防火墙允许来自生产服务器的所有连接
- 只要备份服务器上的 sshd 服务已重新启动(即不是脚本问题),脚本就可以在命令行和 cron 中正常工作
- SSH 使用公钥认证来验证连接
- 我在备份服务器的 SSH 日志中找不到任何错误。同样,即使我可以从单独的机器连接,它也只是停止侦听生产服务器。
我真的需要一些帮助来寻找什么。我可以在生产服务器运行脚本之前设置一个脚本来重新启动备份服务器上的 sshd 服务,但这感觉太像黑客而不是修复。任何帮助将不胜感激。
编辑
请求的示例脚本。这会备份数据库并将它们与整个网站目录的 rsync 一起 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
作为测试,我创建了一个每小时运行的脚本,并将网站目录从生产服务器同步到备份服务器。我想我至少会找出备份服务器停止允许来自生产服务器的连接的大致时间。相反,从昨天开始,每小时脚本和所有其他脚本都没有问题地运行。
虽然我不认为这是一个实际的“修复”,但它至少似乎解决了这个问题,我不再需要通过重新启动备份服务器上的 sshd 服务然后在生产服务器上运行脚本来手动启动备份。如果有人对为什么这会解决问题有任何见解,请在评论中告诉我,因为我仍然想找出根本原因。