Linux系统优化指南
本指南将帮助您优化Linux VPS的性能,提升系统稳定性和安全性。通过合理的配置和调优,让您的服务器运行更高效、更安全。
系统更新与维护
保持系统最新
🎯 为什么要更新系统?
- 安全补丁:修复已知的安全漏洞
- 性能改进:优化系统运行效率
- 新功能:获得最新的功能特性
- 稳定性:修复bug,提高系统稳定性
1. 更新软件包列表
sudo apt update 获取最新的软件包信息
这个命令会连接到Ubuntu/Debian的软件源服务器,下载最新的软件包列表,但不会实际安装任何更新。
2. 升级已安装软件
sudo apt upgrade -y 升级所有可更新的软件包
-y 参数表示自动确认,不需要手动输入yes。这个命令会升级所有已安装的软件包到最新版本。
3. 系统版本升级
sudo apt dist-upgrade -y 升级系统核心组件,处理依赖关系
与upgrade不同,dist-upgrade会智能处理依赖关系的改变,可能会安装新软件包或删除冲突的软件包。
4. 清理无用软件包
sudo apt autoremove -y sudo apt autoclean 删除不再需要的依赖包和缓存
autoremove删除不再需要的依赖包,autoclean清理下载的软件包缓存,释放磁盘空间。
配置自动更新
对于生产环境,建议只自动安装安全更新:
- 安装自动更新工具:
sudo apt install unattended-upgrades - 编辑配置文件:
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades - 确保以下行未被注释(删除前面的//):
"${distro_id}:${distro_codename}-security"; - 启用自动更新:
sudo dpkg-reconfigure unattended-upgrades选择"Yes"启用自动更新
💡 小白提示
什么时候更新?
- 安全更新:立即安装(自动)
- 功能更新:定期手动更新(每月一次)
- 大版本更新:充分测试后再更新
更新前注意事项:
- 先备份重要数据
- 在维护窗口期进行
- 准备回滚方案
性能调优
内核参数优化
编辑 /etc/sysctl.conf 文件,添加以下优化参数:
📝 编辑文件的方法
使用nano编辑器(新手推荐):
sudo nano /etc/sysctl.conf 编辑器快捷键:
- Ctrl + O:保存文件
- Ctrl + X:退出编辑器
- Ctrl + K:剪切一行
- Ctrl + U:粘贴
| 参数 | 建议值 | 说明 |
|---|---|---|
vm.swappiness | 10 | 减少swap使用,提高性能 |
net.core.somaxconn | 65535 | 增加系统同时发起的最大连接数 |
net.ipv4.tcp_max_syn_backlog | 65535 | 增加半连接队列长度 |
net.ipv4.tcp_fin_timeout | 30 | 减少TIME_WAIT超时时间 |
net.ipv4.tcp_keepalive_time | 1200 | 探测间隔时间 |
net.ipv4.tcp_max_tw_buckets | 5000 | 限制TIME_WAIT数量 |
🔍 参数详解(小白必看)
vm.swappiness = 10
作用:控制系统使用虚拟内存(swap)的倾向
原理:数值越低,系统越倾向于使用物理内存而不是swap
为什么设为10:VPS通常内存有限,过多使用swap会严重影响性能
net.core.somaxconn = 65535
作用:设置系统同时处理的最大连接数
原理:当有大量用户同时访问时,这个值决定了能接受多少连接
适用场景:网站流量较大时必须调整
net.ipv4.tcp_fin_timeout = 30
作用:设置TCP连接关闭后的等待时间
原理:连接关闭后不会立即释放,而是等待一段时间
为什么调整:减少等待时间可以更快释放资源
应用配置
sudo sysctl -p 立即应用新的内核参数
验证是否生效:
sysctl vm.swappiness 应该显示:vm.swappiness = 10
I/O 调度器优化
💡 什么是I/O调度器?
I/O调度器负责决定磁盘读写请求的执行顺序,就像交通调度员管理车流一样。
不同的调度器适合不同的场景:
- noop:先进先出,适合SSD
- deadline:设置截止时间,平衡性能
- cfq:完全公平队列,适合HDD
查看当前调度器
cat /sys/block/sda/queue/scheduler 输出示例:[noop] deadline cfq(方括号表示当前使用的)
SSD优化
对于SSD硬盘,推荐使用 noop 或 deadline 调度器:
echo noop > /sys/block/sda/queue/scheduler 永久设置
在 /etc/default/grub 中添加:
GRUB_CMDLINE_LINUX_DEFAULT="quiet elevator=noop"
然后更新GRUB:
sudo update-grub sudo reboot 需要重启生效
CPU性能优化
设置CPU调频策略
查看可用的调频策略:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 设置为性能模式:
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 调频模式说明
- performance:最高性能,CPU始终运行在最高频率(推荐生产环境)
- powersave:节能模式,降低CPU频率(适合低负载)
- ondemand:按需调整,平衡性能和功耗(默认)
- conservative:保守模式,缓慢调整频率(稳定但响应慢)
⚡ 性能模式适用场景
- 高并发网站
- 数据库服务器
- 游戏服务器
- 实时应用
内存优化
Swap配置优化
📚 Swap是什么?
Swap(交换空间)是硬盘上的一块区域,当物理内存不足时,系统会把不常用的数据移到Swap中。
就像你的桌子(内存)放不下时,把不常用的东西放到抽屉(Swap)里。
注意:过度使用Swap会严重影响性能,因为硬盘速度远低于内存。
调整Swappiness
Swappiness控制系统使用swap的倾向(0-100):
查看当前值:
cat /proc/sys/vm/swappiness 默认值通常是60,对VPS来说太高了。
设置建议值(对于内存充足的服务器):
sudo sysctl vm.swappiness=10 永久生效,在 /etc/sysctl.conf 添加:
vm.swappiness=10
不同场景的建议值
- 内存充足(4GB+):设置为10
- 内存一般(2-4GB):设置为30
- 内存紧张(<2GB):保持60
- 数据库服务器:设置为1-5
缓存优化
VFS缓存压力
控制内核回收目录和inode缓存的倾向:
sudo sysctl vm.vfs_cache_pressure=50 默认值100,降低到50可以让系统保留更多缓存,提高文件访问速度。
脏页比例
控制脏数据刷写到磁盘的时机:
# 后台开始写入的脏页比例 vm.dirty_background_ratio = 5 # 强制写入的脏页比例 vm.dirty_ratio = 10
脏页是指被修改但还没写入磁盘的内存页。降低这些值可以更频繁地写入磁盘,减少数据丢失风险。
内存分析工具
free命令
free -h 查看内存使用概况
输出解释:
- total:总内存
- used:已使用
- free:空闲
- available:可用(包括缓存)
vmstat命令
vmstat 1 5 每秒显示一次,共5次
重点关注:
- si/so:swap输入/输出,应该接近0
- bi/bo:块设备I/O
htop命令
sudo apt install htop htop 交互式进程查看器
优点:彩色界面,支持鼠标,更直观
查看内存详情
cat /proc/meminfo 详细的内存信息
网络优化
TCP/IP栈优化
优化TCP参数
在 /etc/sysctl.conf 中添加:
# TCP优化 # 接收缓冲区 net.core.rmem_default = 262144 net.core.rmem_max = 16777216 # 发送缓冲区 net.core.wmem_default = 262144 net.core.wmem_max = 16777216 # 网络设备队列 net.core.netdev_max_backlog = 65536 net.core.optmem_max = 65536 # TCP内存 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 # TCP连接优化 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_max_syn_backlog = 65536 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.tcp_synack_retries = 2 # 启用BBR拥塞控制算法 net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr
参数说明
- rmem/wmem:接收/发送缓冲区大小,影响传输速度
- tcp_tw_reuse:允许重用TIME_WAIT状态的连接
- tcp_syncookies:防止SYN泛洪攻击
启用BBR算法
🤔 什么是BBR?
BBR (Bottleneck Bandwidth and Round-trip propagation time) 是Google开发的TCP拥塞控制算法。
通俗解释:就像高速公路的智能交通系统,能够:
- 自动检测网络拥堵情况
- 智能调整数据发送速度
- 减少延迟,提高传输效率
- 特别适合跨国网络连接
效果:可以提升网络速度20%-50%,特别是在网络条件不好的情况下
1. 检查内核版本
uname -r 需要4.9以上版本支持BBR
如果版本低于4.9:
Ubuntu/Debian系统升级内核:
sudo apt update && sudo apt upgrade sudo apt install linux-generic-hwe-20.04 升级后需要重启系统
2. 加载BBR模块
sudo modprobe tcp_bbr 加载BBR内核模块
echo "tcp_bbr" | sudo tee -a /etc/modules 设置开机自动加载
3. 启用BBR
编辑 /etc/sysctl.conf 文件,添加:
# 启用BBR net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr
应用配置:
sudo sysctl -p 4. 验证BBR状态
检查是否启用成功:
sysctl net.ipv4.tcp_congestion_control 应显示:net.ipv4.tcp_congestion_control = bbr
lsmod | grep bbr 应显示:tcp_bbr 相关信息
✅ 如果上述命令都显示正确,恭喜您!BBR已成功启用。
您可能会感受到:
- 网站加载速度更快
- 下载速度提升
- SSH连接更流畅
网络安全优化
防止DDoS攻击
# 防止SYN泛洪攻击 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 # 防止IP欺骗 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # 禁止ICMP重定向 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 # 禁止源路由 net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 # 忽略ICMP ping请求(可选) net.ipv4.icmp_echo_ignore_all = 1
🛡️ 安全参数说明
- tcp_syncookies:防止SYN flood攻击,当SYN队列满时启用cookies验证
- rp_filter:反向路径过滤,防止IP地址欺骗
- accept_redirects:禁止接受ICMP重定向,防止路由欺骗
- icmp_echo_ignore_all:忽略ping请求,隐藏服务器
安全加固
系统安全检查清单
SSH安全加固
编辑SSH配置
修改 /etc/ssh/sshd_config:
# 禁用root登录 PermitRootLogin no # 禁用密码认证(确保已配置密钥登录) PasswordAuthentication no # 只允许特定用户 AllowUsers yourusername # 修改默认端口(建议改为10000-65535之间) Port 2222 # 限制登录尝试 MaxAuthTries 3 # 禁用空密码 PermitEmptyPasswords no # 启用密钥认证 PubkeyAuthentication yes # 禁用X11转发 X11Forwarding no # 设置超时 ClientAliveInterval 300 ClientAliveCountMax 2 # 限制并发连接 MaxStartups 10:30:100
测试配置是否正确:
sudo sshd -t 如果没有输出,说明配置正确
重启SSH服务:
sudo systemctl restart sshd - 已经配置好密钥登录
- 新开一个SSH窗口测试,不要关闭当前窗口
- 记住修改后的端口号
防火墙配置
使用UFW(简单防火墙)
🔥 UFW是什么?
UFW (Uncomplicated Firewall) 是Ubuntu的简化防火墙工具,让防火墙配置变得简单。
把它想象成你家的门卫,决定谁可以进来(入站规则)和谁可以出去(出站规则)。
1. 安装UFW
sudo apt install ufw 2. 设置默认策略
sudo ufw default deny incoming sudo ufw default allow outgoing 拒绝所有入站连接,允许所有出站连接
3. 允许必要端口
sudo ufw allow 22/tcp # SSH默认端口 sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS 如果修改了SSH端口,记得允许新端口:
sudo ufw allow 2222/tcp # 新的SSH端口 4. 启用防火墙
sudo ufw enable 输入y确认启用
5. 查看状态
sudo ufw status verbose 常用UFW命令
sudo ufw allow from 192.168.1.100- 允许特定IPsudo ufw delete allow 80- 删除规则sudo ufw status numbered- 显示规则编号sudo ufw delete 3- 删除第3条规则sudo ufw disable- 暂时关闭防火墙sudo ufw reset- 重置所有规则
Fail2ban防暴力破解
🚫 Fail2ban是什么?
Fail2ban是一个防止暴力破解的工具,它会监控日志文件,发现多次失败的登录尝试后,自动封禁IP地址。
就像一个智能保安,发现有人多次输错密码就把他拉黑一段时间。
安装配置Fail2ban
- 安装Fail2ban:
sudo apt install fail2ban - 创建本地配置:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local - 编辑配置文件:
sudo nano /etc/fail2ban/jail.local
基础配置示例
[DEFAULT] # 封禁时间(秒) bantime = 3600 # 检测时间窗口 findtime = 600 # 最大重试次数 maxretry = 5 # 忽略的IP(你自己的IP) ignoreip = 127.0.0.1/8 ::1 YOUR_IP_HERE [sshd] enabled = true port = ssh logpath = /var/log/auth.log maxretry = 3 [nginx-http-auth] enabled = true port = http,https logpath = /var/log/nginx/error.log [nginx-noscript] enabled = true port = http,https logpath = /var/log/nginx/access.log maxretry = 2
参数说明
- bantime:封禁时间,3600秒=1小时
- findtime:在600秒内
- maxretry:如果失败3次就封禁
- ignoreip:永不封禁的IP(加上你自己的IP避免把自己锁外面)
常用命令
sudo systemctl start fail2ban 启动服务
sudo systemctl enable fail2ban 开机自启
sudo fail2ban-client status 查看状态
sudo fail2ban-client status sshd 查看SSH防护状态
sudo fail2ban-client set sshd unbanip IP 解封IP地址
sudo tail -f /var/log/fail2ban.log 查看日志
服务管理
Systemd服务管理
📚 Systemd是什么?
Systemd是Linux的系统和服务管理器,负责启动、停止和管理系统服务。
把它想象成一个管家,负责管理家里所有的电器(服务)的开关。
常用systemctl命令
| 命令 | 说明 | 示例 |
|---|---|---|
systemctl status service | 查看服务状态 | systemctl status nginx |
systemctl start service | 启动服务 | systemctl start nginx |
systemctl stop service | 停止服务 | systemctl stop nginx |
systemctl restart service | 重启服务 | systemctl restart nginx |
systemctl enable service | 开机自启 | systemctl enable nginx |
systemctl disable service | 禁用开机自启 | systemctl disable nginx |
systemctl list-units --type=service | 列出所有服务 | - |
systemctl is-active service | 检查是否运行 | systemctl is-active nginx |
systemctl is-enabled service | 检查是否开机自启 | systemctl is-enabled nginx |
服务优化建议
🚫 禁用不需要的服务
查看所有运行的服务:
systemctl list-units --type=service --state=running 常见可以禁用的服务:
- bluetooth.service - 蓝牙(VPS不需要)
- cups.service - 打印服务(VPS不需要)
- avahi-daemon.service - mDNS服务(通常不需要)
禁用服务:
sudo systemctl stop bluetooth sudo systemctl disable bluetooth ⏱️ 设置服务超时
编辑服务文件,添加超时设置:
[Service] TimeoutStartSec=30 TimeoutStopSec=30
防止服务启动或停止时卡住
🔄 配置服务重启策略
自动重启崩溃的服务:
[Service] Restart=on-failure RestartSec=5s StartLimitBurst=3 StartLimitInterval=60s
说明:失败时重启,5秒后重试,60秒内最多重试3次
创建自定义服务
示例:创建一个Python应用服务
- 创建服务文件:
sudo nano /etc/systemd/system/myapp.service - 添加服务配置:
[Unit] Description=My Python Application After=network.target [Service] Type=simple User=myuser Group=myuser WorkingDirectory=/home/myuser/myapp Environment="PATH=/home/myuser/myapp/venv/bin" ExecStart=/home/myuser/myapp/venv/bin/python app.py Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target
- 重新加载systemd:
sudo systemctl daemon-reload - 启动服务:
sudo systemctl start myapp - 设置开机自启:
sudo systemctl enable myapp - 查看服务状态:
sudo systemctl status myapp
💡 服务文件说明
- [Unit]:服务描述和依赖关系
- [Service]:服务运行参数
- [Install]:安装信息,决定何时启动
- Type=simple:服务类型,simple表示主进程
- Restart=on-failure:失败时重启
- WantedBy:定义启动目标
监控工具
系统监控工具
htop - 增强版top
安装:
sudo apt install htop htop 特点:
- 彩色界面,更直观
- 支持鼠标操作
- 可以显示进程树(F5键)
- 更丰富的快捷键(F1查看帮助)
常用快捷键:
- F3:搜索进程
- F4:过滤进程
- F5:树状显示
- F6:排序方式
- F9:杀死进程
iotop - I/O监控
安装:
sudo apt install iotop 使用:
sudo iotop -o 只显示有I/O操作的进程
功能:监控哪些进程在进行磁盘读写,适合排查磁盘性能问题
nethogs - 网络流量监控
安装:
sudo apt install nethogs 使用:
sudo nethogs 按进程显示网络使用情况
功能:查看哪个进程在消耗网络带宽
glances - 综合监控工具
安装:
sudo apt install glances 使用:
glances 启动监控界面
特点:
- 综合显示CPU、内存、网络、磁盘信息
- 支持Web界面:
glances -w - 可导出数据到文件
- 支持远程监控
监控脚本示例
系统资源监控脚本
创建一个简单的监控脚本 monitor.sh:
#!/bin/bash
# 系统监控脚本
echo "==================================="
echo " 系统监控报告"
echo "时间: $(date)"
echo "==================================="
echo ""
# 系统信息
echo "【系统信息】"
echo "主机名: $(hostname)"
echo "系统版本: $(lsb_release -d | cut -f2)"
echo "内核版本: $(uname -r)"
echo "运行时间: $(uptime -p)"
echo ""
# CPU使用率
echo "【CPU使用率】"
top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print "CPU使用率: " 100 - $1"%"}'
echo "负载平均值: $(uptime | awk -F'load average:' '{print $2}')"
echo ""
# 内存使用
echo "【内存使用】"
free -h | grep Mem | awk '{print "总计: " $2 " | 已用: " $3 " | 可用: " $4 " | 使用率: " ($3/$2)*100"%"}'
free -h | grep Swap | awk '{print "Swap总计: " $2 " | 已用: " $3}'
echo ""
# 磁盘使用
echo "【磁盘使用】"
df -h | grep -E '^/dev/' | awk '{print $1 ": 总计 " $2 " | 已用 " $3 " | 可用 " $4 " | 使用率 " $5}'
echo ""
# 网络连接
echo "【网络连接】"
echo "已建立的连接数: $(ss -tun | grep ESTAB | wc -l)"
echo "监听的端口: $(ss -tuln | grep LISTEN | wc -l)"
echo ""
# 进程信息
echo "【进程信息】"
echo "总进程数: $(ps aux | wc -l)"
echo "运行中的进程: $(ps aux | grep -v grep | grep -c R)"
echo ""
# TOP 5 CPU消耗进程
echo "【CPU占用TOP5】"
ps aux | sort -nrk 3,3 | head -5 | awk '{print $11 " - CPU: " $3"%"}'
echo ""
# TOP 5 内存消耗进程
echo "【内存占用TOP5】"
ps aux | sort -nrk 4,4 | head -5 | awk '{print $11 " - MEM: " $4"%"}'
echo ""
# 检查重要服务状态
echo "【服务状态】"
services=("nginx" "mysql" "ssh")
for service in "${services[@]}"; do
if systemctl is-active --quiet $service; then
echo "$service: 运行中 ✓"
else
echo "$service: 已停止 ✗"
fi
done 保存脚本并添加执行权限:
chmod +x monitor.sh ./monitor.sh 设置定时执行(每小时):
crontab -e 添加:
0 * * * * /path/to/monitor.sh >> /var/log/monitor.log
日志监控
重要日志文件
/var/log/syslog
系统日志,记录系统活动
tail -f /var/log/syslog /var/log/auth.log
认证日志,记录登录尝试
grep "Failed" /var/log/auth.log /var/log/kern.log
内核日志
tail -n 50 /var/log/kern.log /var/log/nginx/
Nginx日志目录
tail -f /var/log/nginx/access.log 使用journalctl查看日志
journalctl -u nginx.service 查看nginx服务日志
journalctl -f 实时查看日志(类似tail -f)
journalctl --since "1 hour ago" 查看最近一小时的日志
journalctl -p err 只显示错误级别的日志
journalctl --disk-usage 查看日志占用的磁盘空间
💡 日志管理建议
- 定期清理旧日志:
journalctl --vacuum-time=30d - 限制日志大小:
journalctl --vacuum-size=500M - 配置日志轮转:编辑
/etc/logrotate.conf
备份策略
备份最佳实践
3-2-1原则
- 3份数据副本:原始数据 + 2份备份
- 2种不同介质:本地硬盘 + 云存储
- 1份异地备份:防止物理灾害
🎯 备份什么?
- 系统配置:/etc/ 目录
- 网站数据:/var/www/ 或网站目录
- 数据库:MySQL/PostgreSQL数据
- 用户数据:/home/ 目录
- 日志文件:/var/log/(选择性)
备份工具推荐
rsync - 增量备份
基础备份命令:
rsync -avz --delete /source/ /backup/ 参数说明:
- -a:归档模式,保留权限和时间戳
- -v:显示详细信息
- -z:压缩传输
- --delete:删除目标中源不存在的文件
远程备份:
rsync -avz -e ssh /local/ user@remote:/backup/ tar - 归档备份
创建压缩备份:
tar -czf backup-$(date +%Y%m%d).tar.gz /data/ 排除特定文件:
tar --exclude='*.log' --exclude='cache/*' -czf backup.tar.gz /data/ 查看归档内容:
tar -tzf backup.tar.gz mysqldump - 数据库备份
备份单个数据库:
mysqldump -u root -p database_name > backup.sql 备份所有数据库:
mysqldump -u root -p --all-databases > all_backup.sql 压缩备份:
mysqldump -u root -p database | gzip > backup.sql.gz 自动备份脚本
完整备份脚本示例
创建备份脚本 backup.sh:
#!/bin/bash
# 自动备份脚本
# ===== 配置部分 =====
# 备份目录
BACKUP_DIR="/backup"
# 需要备份的目录
SOURCE_DIRS=("/etc" "/var/www" "/home")
# MySQL配置
DB_USER="root"
DB_PASS="your_password"
# 备份保留天数
RETENTION_DAYS=7
# 日期格式
DATE=$(date +%Y%m%d_%H%M%S)
# 日志文件
LOG_FILE="/var/log/backup.log"
# ===== 函数定义 =====
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
# ===== 开始备份 =====
log "===== 开始备份 ====="
# 创建备份目录
BACKUP_PATH="$BACKUP_DIR/$DATE"
mkdir -p $BACKUP_PATH
# 备份文件
log "备份文件..."
for dir in "${SOURCE_DIRS[@]}"; do
if [ -d "$dir" ]; then
dir_name=$(basename $dir)
log "备份 $dir..."
tar -czf $BACKUP_PATH/files_${dir_name}.tar.gz $dir 2>>$LOG_FILE
if [ $? -eq 0 ]; then
log "✓ $dir 备份成功"
else
log "✗ $dir 备份失败"
fi
fi
done
# 备份MySQL数据库
log "备份数据库..."
# 获取所有数据库列表
databases=$(mysql -u$DB_USER -p$DB_PASS -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")
for db in $databases; do
log "备份数据库 $db..."
mysqldump -u$DB_USER -p$DB_PASS $db | gzip > $BACKUP_PATH/db_${db}.sql.gz 2>>$LOG_FILE
if [ $? -eq 0 ]; then
log "✓ 数据库 $db 备份成功"
else
log "✗ 数据库 $db 备份失败"
fi
done
# 创建备份信息文件
echo "备份时间: $DATE" > $BACKUP_PATH/backup_info.txt
echo "备份内容:" >> $BACKUP_PATH/backup_info.txt
ls -lh $BACKUP_PATH >> $BACKUP_PATH/backup_info.txt
# 压缩整个备份目录
log "压缩备份文件..."
cd $BACKUP_DIR
tar -czf backup_$DATE.tar.gz $DATE/
rm -rf $DATE/
# 计算备份大小
BACKUP_SIZE=$(du -h backup_$DATE.tar.gz | cut -f1)
log "备份完成,文件大小: $BACKUP_SIZE"
# 删除旧备份
log "清理旧备份(保留 $RETENTION_DAYS 天)..."
find $BACKUP_DIR -name "backup_*.tar.gz" -type f -mtime +$RETENTION_DAYS -delete
deleted_count=$(find $BACKUP_DIR -name "backup_*.tar.gz" -type f -mtime +$RETENTION_DAYS | wc -l)
log "删除了 $deleted_count 个旧备份"
# 同步到远程服务器(可选)
# REMOTE_SERVER="user@remote-server:/remote/backup/"
# if [ ! -z "$REMOTE_SERVER" ]; then
# log "同步到远程服务器..."
# rsync -avz $BACKUP_DIR/backup_$DATE.tar.gz $REMOTE_SERVER
# if [ $? -eq 0 ]; then
# log "✓ 远程同步成功"
# else
# log "✗ 远程同步失败"
# fi
# fi
log "===== 备份任务完成 ====="
log "" 设置脚本权限:
chmod +x backup.sh 设置定时备份
编辑crontab:
crontab -e 添加定时任务:
# 每天凌晨2点执行备份 0 2 * * * /path/to/backup.sh # 每周日凌晨3点执行完整备份 0 3 * * 0 /path/to/full-backup.sh # 每6小时执行增量备份 0 */6 * * * /path/to/incremental-backup.sh
💡 Cron时间格式说明
分 时 日 月 周 ┬ ┬ ┬ ┬ ┬ │ │ │ │ └─ 星期几 (0-7,0和7都表示周日) │ │ │ └──── 月份 (1-12) │ │ └─────── 日期 (1-31) │ └────────── 小时 (0-23) └───────────── 分钟 (0-59)
特殊字符:
- * - 任意值
- , - 列举多个值
- - - 范围
- / - 步进值
恢复流程
恢复步骤
- 查找备份文件:
ls -la /backup/ - 解压备份文件:
tar -xzf backup_20240101_020000.tar.gz - 恢复文件:
tar -xzf files_etc.tar.gz -C /-C / 表示解压到根目录,保持原始路径
- 恢复数据库:
gunzip < db_myapp.sql.gz | mysql -u root -p myapp - 验证恢复结果:
- 检查文件权限是否正确
- 测试应用是否正常运行
- 检查数据完整性
- 先备份当前状态
- 在测试环境验证备份可用性
- 记录恢复过程
- 准备回滚方案
优化总结
🎯 快速优化清单
- ✓ 更新系统到最新版本
- ✓ 调整内核参数
- ✓ 启用BBR算法
- ✓ 优化内存和Swap设置
- ✓ 配置防火墙规则
- ✓ 安装Fail2ban
- ✓ 加固SSH安全
- ✓ 禁用不需要的服务
- ✓ 设置自动备份
- ✓ 安装监控工具
⚠️ 注意事项
- 修改配置前先备份原文件
- 逐步测试优化效果
- 保持SSH访问正常
- 定期检查系统日志
- 监控资源使用情况
- 建立应急恢复方案
- 记录所有修改操作
- 测试备份的可恢复性
📈 性能指标
- CPU使用率 < 80%
- 内存使用率 < 85%
- Swap使用 < 10%
- 磁盘I/O等待 < 10%
- 网络延迟稳定
- 无异常日志
- 服务响应时间正常
- 备份定期执行
🚀 进阶建议
完成基础优化后,您可以考虑:
- 性能监控:部署Prometheus + Grafana进行可视化监控
- 日志分析:使用ELK Stack进行日志集中管理
- 自动化运维:学习Ansible等自动化工具
- 容器化:使用Docker容器化应用
- 高可用:配置负载均衡和故障转移