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容器化应用
- 高可用:配置负载均衡和故障转移