- 登录 FTP 服务器
- 切换到正确的目录
- 下载网站文件
- 备份数据库 (通常通过 SSH 或其他方式)
- 整理和打包备份
- 设置定时任务,实现自动化
下面我将为你提供一个详细的、分步的指南,包含命令解释和最佳实践。

场景假设
在开始之前,我们先做一些假设:
- FTP 服务器信息:
- 主机名:
ftp.yourwebsite.com - 用户名:
backupuser - 密码:
yourpassword
- 主机名:
- 本地备份目录:
/home/youruser/website_backups - 网站在 FTP 服务器上的根目录:
/public_html(这是最常见的,有时也可能是/htdocs或/www) - 数据库名:
mywebsite_db - 数据库用户:
db_user - 数据库密码:
db_password
第 1 步:准备工作
在开始备份之前,最好在本地创建一个专门的目录来存放备份文件,这样方便管理。
# 创建一个用于存放备份的目录 mkdir -p /home/youruser/website_backups # 进入该目录 cd /home/youruser/website_backups
第 2 步:备份网站文件 (使用 ftp)
ftp 命令是交互式的,我们可以通过脚本来自动化这个过程,这里我们使用 ftp 的脚本模式。
交互式 FTP(适合手动操作)
ftp ftp.yourwebsite.com
登录后,你会看到 ftp> 提示符,然后依次输入以下命令:

# 输入用户名 backupuser # 输入密码 yourpassword # 切换到网站文件所在的目录 cd public_html # 设置本地存放文件的路径 (非常重要!) lcd /home/youruser/website_backups # 开启二进制模式传输,避免文件损坏 binary # 下载所有文件和文件夹 # -r 表示递归下载(即下载整个目录结构) # -n 表示不提示用户输入,直接覆盖同名文件 mget -r -n * # 下载完成后,退出 FTP bye
使用脚本自动化 FTP(推荐)
为了实现自动化,我们将 ftp 命令写入一个脚本文件,这种方式更可靠,可以避免手动输入错误。
-
创建一个 FTP 脚本文件
ftp_script.txt:nano ftp_script.txt
-
在文件中输入以下内容:
open ftp.yourwebsite.com backupuser yourpassword cd public_html lcd /home/youruser/website_backups binary mget -r -n * bye
安全提示:将密码明文写在脚本中是不安全的,在生产环境中,建议使用更安全的认证方式,如 SFTP/SSH 密钥认证,如果必须用 FTP,请确保该脚本的权限是私有的 (
chmod 600 ftp_script.txt)。
(图片来源网络,侵删) -
执行脚本:
# 使用 -b (batch mode) 选项来读取脚本文件 ftp -b ftp_script.txt
执行完毕后,你的 /home/youruser/website_backups 目录下就会有网站的所有文件了。
第 3 步:备份数据库
网站文件只是网站的一部分,数据库(如 MySQL, MariaDB)同样至关重要,数据库备份不能通过 FTP 完成,通常需要通过 SSH 连接到服务器执行命令,或者如果数据库在本地,则直接在本地执行。
情况 A:你可以通过 SSH 登录网站服务器
这是最简单的情况,SSH 登录后,使用 mysqldump 命令。
# SSH 登录到你的网站服务器 ssh your_server_user@your_server_ip # 执行数据库导出 # -u 用户名 # -p 密码 (执行后会提示输入,更安全) # --databases 指定要备份的数据库 # -f 输出文件名 mysqldump -u db_user -p --databases mywebsite_db > /home/your_server_user/mywebsite_db_backup_$(date +%Y%m%d).sql # 然后你可以将这个 SQL 文件通过 scp 下载到本地 scp /home/your_server_user/mywebsite_db_backup_$(date +%Y%m%d).sql yourlocaluser@yourlocalip:/home/youruser/website_backups/
情况 B:你无法 SSH 登录,但可以本地访问数据库
如果你的数据库和你的 Linux 备份机器在同一台服务器上,或者你可以从这台机器直接访问数据库端口。
# 在你的 Linux 备份机器上直接执行 mysqldump -u db_user -p mywebsite_db > /home/youruser/website_backups/mywebsite_db_backup_$(date +%Y%m%d).sql
执行后,系统会提示你输入数据库密码,备份文件会直接生成在本地备份目录中。
第 4 步:整理和打包备份
为了节省磁盘空间并方便管理,最好将当天的备份打包成一个压缩文件。
# 进入备份目录 cd /home/youruser/website_backups # 创建一个包含日期的文件夹,用于存放当天的备份 mkdir -p backup_$(date +%Y%m%d) # 将下载的网站文件移动到新文件夹 (假设文件都在当前目录) mv * backup_$(date +%Y%m%d)/ 2>/dev/null || true # 2>/dev/null 避免因没有文件而报错 # 将数据库备份文件也移动进去 mv mywebsite_db_backup_*.sql backup_$(date +%Y%m%d)/ # 打包并压缩整个备份文件夹 tar -czf website_backup_$(date +%Y%m%d).tar.gz backup_$(date +%Y%m%d) # (可选)删除未压缩的文件夹,以节省空间 rm -rf backup_$(date +%Y%m%d) # 列出文件,确认打包成功 ls -lh
现在你会得到一个类似 website_backup_20251027.tar.gz 的文件,这就是你完整的网站备份。
第 5 步:设置定时任务 (Cron) 实现自动化
手动备份很麻烦,我们可以使用 cron 来设置一个定时任务,比如每天凌晨 2 点自动执行备份。
-
打开 crontab 编辑器:
crontab -e
-
添加以下一行(请根据你的实际情况修改路径和脚本):
# 每天凌晨 2 点执行网站备份 0 2 * * * /home/youruser/scripts/backup_website.sh >> /home/youruser/scripts/backup.log 2>&1
0 2 * * *:表示每天 2:00 AM。/home/youruser/scripts/backup_website.sh:这是一个你将要创建的备份脚本的完整路径。>> /home/youruser/scripts/backup.log 2>&1:将所有输出(包括标准输出和错误输出)追加到日志文件中,方便排查问题。
-
创建备份脚本
backup_website.sh:mkdir -p /home/youruser/scripts nano /home/youruser/scripts/backup_website.sh
-
在脚本中写入完整的备份逻辑:
#!/bin/bash # --- 配置信息 --- FTP_SERVER="ftp.yourwebsite.com" FTP_USER="backupuser" FTP_PASS="yourpassword" FTP_REMOTE_DIR="/public_html" LOCAL_BACKUP_ROOT="/home/youruser/website_backups" DB_USER="db_user" DB_PASS="db_password" # 注意:生产环境请使用更安全的方式传递密码 DB_NAME="mywebsite_db" # --- 创建备份目录 --- TODAY=$(date +%Y%m%d) BACKUP_DIR="${LOCAL_BACKUP_ROOT}/backup_${TODAY}" mkdir -p "${BACKUP_DIR}" # --- 1. 备份网站文件 --- # 使用 lftp 替代 ftp,功能更强大,推荐 # 如果没有 lftp, 可以用下面的 ftp 脚本方法 # lftp -u ${FTP_USER},${FTP_PASS} ${FTP_SERVER} -e "mirror -R ${BACKUP_DIR} ${FTP_REMOTE_DIR} ; bye" # 注意:mirror -R 是上传,我们这里是下载,所以是 mirror ${FTP_REMOTE_DIR} ${BACKUP_DIR} # ftp 命令,创建 ftp_script.txt 内容如下,然后执行: # open ${FTP_SERVER} # ${FTP_USER} # ${FTP_PASS} # cd ${FTP_REMOTE_DIR} # lcd "${BACKUP_DIR}" # binary # mget -r -n * # bye # 执行脚本 # ftp -b /path/to/ftp_script.txt # 为了简单,我们这里用 ftp 命令和 heredoc ftp -n <<EOF open ${FTP_SERVER} user ${FTP_USER} ${FTP_PASS} cd ${FTP_REMOTE_DIR} lcd "${BACKUP_DIR}" binary mget -r -n * bye EOF # --- 2. 备份数据库 --- mysqldump -u ${DB_USER} -p${DB_PASS} ${DB_NAME} > "${BACKUP_DIR}/${DB_NAME}_${TODAY}.sql" # --- 3. 打包备份 --- cd "${LOCAL_BACKUP_ROOT}" tar -czf "website_backup_${TODAY}.tar.gz" "backup_${TODAY}" rm -rf "${BACKUP_DIR}" echo "Backup completed on $(date)" >> "${LOCAL_BACKUP_ROOT}/backup.log" # --- 4. (可选)清理旧备份,只保留最近30天的 --- find "${LOCAL_BACKUP_ROOT}" -name "website_backup_*.tar.gz" -mtime +30 -delete -
给脚本添加执行权限:
chmod +x /home/youruser/scripts/backup_website.sh
你的定时任务已经设置好了,每天凌晨 2 点,backup_website.sh 脚本会自动运行,完成所有备份工作,并将日志记录下来。
重要提示和最佳实践
- 强烈建议使用 SFTP/SSH:传统的 FTP 是不安全的,所有数据(包括密码)都是明文传输,如果你的服务器支持,强烈建议使用 SFTP(基于 SSH 的文件传输协议),它的使用方式与 FTP 类似,但更安全,只需将
ftp命令换成sftp,连接方式为sftp backupuser@ftp.yourwebsite.com。 - 使用
lftp:lftp是一个功能更强大的命令行文件客户端,支持多线程、断点续传、镜像等高级功能,非常适合备份,它的mirror命令可以非常方便地实现整个目录的同步或备份。 - 数据库密码安全:不要在脚本中硬编码数据库密码,可以考虑使用
.my.cnf配置文件,并设置其权限为600,让mysqldump自动读取。 - 备份验证:定期验证你的备份文件是否可用,可以尝试解压一个旧的备份包,或者将数据库备份文件导入到一个测试数据库中。
- 异地备份:不要把所有备份都放在同一台机器上,将备份文件复制到另一台服务器、云存储(如 AWS S3, Google Cloud Storage)或者外部硬盘上,以防本地硬件故障导致备份全部丢失。
- 监控和告警:为备份任务设置监控,如果备份失败(FTP 连接不上、数据库密码错误),可以通过邮件等方式发送告警,以便及时处理。
