Linux系统优化指南

📖 阅读时间:30分钟 🎯 难度:中级 👥 适合人群:系统管理员

本指南将帮助您优化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清理下载的软件包缓存,释放磁盘空间。

配置自动更新

对于生产环境,建议只自动安装安全更新:

  1. 安装自动更新工具: sudo apt install unattended-upgrades
  2. 编辑配置文件: sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
  3. 确保以下行未被注释(删除前面的//):
    "${distro_id}:${distro_codename}-security";
  4. 启用自动更新: 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硬盘,推荐使用 noopdeadline 调度器:

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配置前,请确保:
  • 已经配置好密钥登录
  • 新开一个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. 启用防火墙
⚠️ 启用前必须确保SSH端口已允许,否则会断开连接!
sudo ufw enable

输入y确认启用

5. 查看状态
sudo ufw status verbose
常用UFW命令
  • sudo ufw allow from 192.168.1.100 - 允许特定IP
  • sudo ufw delete allow 80 - 删除规则
  • sudo ufw status numbered - 显示规则编号
  • sudo ufw delete 3 - 删除第3条规则
  • sudo ufw disable - 暂时关闭防火墙
  • sudo ufw reset - 重置所有规则

Fail2ban防暴力破解

🚫 Fail2ban是什么?

Fail2ban是一个防止暴力破解的工具,它会监控日志文件,发现多次失败的登录尝试后,自动封禁IP地址。

就像一个智能保安,发现有人多次输错密码就把他拉黑一段时间。

安装配置Fail2ban

  1. 安装Fail2ban: sudo apt install fail2ban
  2. 创建本地配置: sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  3. 编辑配置文件: 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应用服务

  1. 创建服务文件: sudo nano /etc/systemd/system/myapp.service
  2. 添加服务配置:
    [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
  3. 重新加载systemd: sudo systemctl daemon-reload
  4. 启动服务: sudo systemctl start myapp
  5. 设置开机自启: sudo systemctl enable myapp
  6. 查看服务状态: 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)

特殊字符:

  • * - 任意值
  • , - 列举多个值
  • - - 范围
  • / - 步进值

恢复流程

恢复步骤

  1. 查找备份文件: ls -la /backup/
  2. 解压备份文件: tar -xzf backup_20240101_020000.tar.gz
  3. 恢复文件: tar -xzf files_etc.tar.gz -C /

    -C / 表示解压到根目录,保持原始路径

  4. 恢复数据库: gunzip < db_myapp.sql.gz | mysql -u root -p myapp
  5. 验证恢复结果:
    • 检查文件权限是否正确
    • 测试应用是否正常运行
    • 检查数据完整性
⚠️ 恢复前注意:
  • 先备份当前状态
  • 在测试环境验证备份可用性
  • 记录恢复过程
  • 准备回滚方案

优化总结

🎯 快速优化清单

  • ✓ 更新系统到最新版本
  • ✓ 调整内核参数
  • ✓ 启用BBR算法
  • ✓ 优化内存和Swap设置
  • ✓ 配置防火墙规则
  • ✓ 安装Fail2ban
  • ✓ 加固SSH安全
  • ✓ 禁用不需要的服务
  • ✓ 设置自动备份
  • ✓ 安装监控工具

⚠️ 注意事项

  • 修改配置前先备份原文件
  • 逐步测试优化效果
  • 保持SSH访问正常
  • 定期检查系统日志
  • 监控资源使用情况
  • 建立应急恢复方案
  • 记录所有修改操作
  • 测试备份的可恢复性

📈 性能指标

  • CPU使用率 < 80%
  • 内存使用率 < 85%
  • Swap使用 < 10%
  • 磁盘I/O等待 < 10%
  • 网络延迟稳定
  • 无异常日志
  • 服务响应时间正常
  • 备份定期执行

🚀 进阶建议

完成基础优化后,您可以考虑:

  • 性能监控:部署Prometheus + Grafana进行可视化监控
  • 日志分析:使用ELK Stack进行日志集中管理
  • 自动化运维:学习Ansible等自动化工具
  • 容器化:使用Docker容器化应用
  • 高可用:配置负载均衡和故障转移

优化完成!接下来...

您已经学会了Linux系统优化的基础知识,可以继续学习: