1. 登录 FTP 服务器
  2. 切换到正确的目录
  3. 下载网站文件
  4. 备份数据库 (通常通过 SSH 或其他方式)
  5. 整理和打包备份
  6. 设置定时任务,实现自动化

下面我将为你提供一个详细的、分步的指南,包含命令解释和最佳实践。

linux ftp备份网站
(图片来源网络,侵删)

场景假设

在开始之前,我们先做一些假设:

  • 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> 提示符,然后依次输入以下命令:

linux ftp备份网站
(图片来源网络,侵删)
# 输入用户名
backupuser
# 输入密码
yourpassword
# 切换到网站文件所在的目录
cd public_html
# 设置本地存放文件的路径 (非常重要!)
lcd /home/youruser/website_backups
# 开启二进制模式传输,避免文件损坏
binary
# 下载所有文件和文件夹
# -r 表示递归下载(即下载整个目录结构)
# -n 表示不提示用户输入,直接覆盖同名文件
mget -r -n *
# 下载完成后,退出 FTP
bye

使用脚本自动化 FTP(推荐)

为了实现自动化,我们将 ftp 命令写入一个脚本文件,这种方式更可靠,可以避免手动输入错误。

  1. 创建一个 FTP 脚本文件 ftp_script.txt

    nano ftp_script.txt
  2. 在文件中输入以下内容

    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)。

    linux ftp备份网站
    (图片来源网络,侵删)
  3. 执行脚本

    # 使用 -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 点自动执行备份。

  1. 打开 crontab 编辑器

    crontab -e
  2. 添加以下一行(请根据你的实际情况修改路径和脚本):

    # 每天凌晨 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:将所有输出(包括标准输出和错误输出)追加到日志文件中,方便排查问题。
  3. 创建备份脚本 backup_website.sh

    mkdir -p /home/youruser/scripts
    nano /home/youruser/scripts/backup_website.sh
  4. 在脚本中写入完整的备份逻辑

    #!/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
  5. 给脚本添加执行权限

    chmod +x /home/youruser/scripts/backup_website.sh

你的定时任务已经设置好了,每天凌晨 2 点,backup_website.sh 脚本会自动运行,完成所有备份工作,并将日志记录下来。


重要提示和最佳实践

  1. 强烈建议使用 SFTP/SSH:传统的 FTP 是不安全的,所有数据(包括密码)都是明文传输,如果你的服务器支持,强烈建议使用 SFTP(基于 SSH 的文件传输协议),它的使用方式与 FTP 类似,但更安全,只需将 ftp 命令换成 sftp,连接方式为 sftp backupuser@ftp.yourwebsite.com
  2. 使用 lftplftp 是一个功能更强大的命令行文件客户端,支持多线程、断点续传、镜像等高级功能,非常适合备份,它的 mirror 命令可以非常方便地实现整个目录的同步或备份。
  3. 数据库密码安全:不要在脚本中硬编码数据库密码,可以考虑使用 .my.cnf 配置文件,并设置其权限为 600,让 mysqldump 自动读取。
  4. 备份验证:定期验证你的备份文件是否可用,可以尝试解压一个旧的备份包,或者将数据库备份文件导入到一个测试数据库中。
  5. 异地备份:不要把所有备份都放在同一台机器上,将备份文件复制到另一台服务器、云存储(如 AWS S3, Google Cloud Storage)或者外部硬盘上,以防本地硬件故障导致备份全部丢失。
  6. 监控和告警:为备份任务设置监控,如果备份失败(FTP 连接不上、数据库密码错误),可以通过邮件等方式发送告警,以便及时处理。