Ubuntu 24.04 LTS 服务器版完整教程

IT 技术 106 阅读 更新于 2026-09-25 17:39

从安装到生产环境部署的超详细指南 · 2026年7月版

1. 系统安装

1.1 获取镜像

从官网下载 Ubuntu 24.04 LTS Server 版 ISO 镜像:

https://ubuntu.com/download/server

推荐选择最小化安装镜像(约100MB),按需选择:

  • ubuntu-24.04-live-server-amd64.iso — 标准服务器版
  • ubuntu-24.04-minimal-amd64.iso — 最小化版(推荐服务器使用)

💡 LTS(Long Term Support)版本支持5年标准安全更新,ESM(Extended Security Maintenance)可扩展至10年(2034年)。

1.2 验证镜像完整性

# 下载SHA256校验文件
wget https://releases.ubuntu.com/24.04/SHA256SUMS

# 验证镜像完整性
sha256sum -c SHA256SUMS --ignore-missing

# 或手动对比
sha256sum ubuntu-24.04-live-server-amd64.iso

1.3 制作启动介质

使用以下工具将 ISO 写入 U 盘或光盘:

# Linux/macOS 使用 dd 命令(注意替换 sdX)
sudo dd if=ubuntu-24.04-live-server-amd64.iso of=/dev/sdX bs=4M status=progress && sync

# 或使用 Ventoy(推荐,支持多镜像)
# https://www.ventoy.net

# Windows使用 Rufus
# https://rufus.ie

# macOS使用 balenaEtcher
# https://etcher.balena.io

1.4 BIOS/UEFI设置

  • 进入BIOS/UEFI(开机按F2/F12/Del)
  • 设置UEFI模式启动(推荐)或Legacy BIOS模式
  • 启用VT-x/AMD-V(虚拟化支持)
  • 启用IOMMU(用于设备直通)
  • 关闭Secure Boot(如有兼容问题)
  • 设置U盘为第一启动设备
  • 配置RAID模式(AHCI推荐,避免RAID模式下的兼容问题)

1.5 安装过程

  1. 从 U 盘启动,选择 Try or Install Ubuntu Server
  2. 选择语言:推荐 English(服务器环境)
  3. 选择键盘布局
  4. 选择安装类型:Ubuntu Server(标准)或 Ubuntu Server (minimized)
  5. 配置网络:自动 DHCP 或手动静态 IP
  6. 配置代理(如在内网环境)
  7. 配置镜像源:选择国内源加速下载
  8. 选择安装类型:Use an entire disk 或 Custom storage layout
  9. 选择是否使用LVM(推荐生产环境使用LVM)
  10. 确认磁盘分区方案
  11. 设置 Profile:Full Name、Server Name、Username、Password
  12. 选择安装 OpenSSH Server(强烈建议勾选)
  13. 选择 Featured Server Snaps(可选)
  14. 等待安装完成,重启系统

1.6 推荐分区方案(服务器)

分区大小类型说明
/boot/efi512MBEFI/FAT32UEFI启动分区
/boot1-2GBext4启动文件(如不用LVM管理boot)
swap内存×1~2swap交换分区(大内存可用文件替代)
/30-50GBext4/xfs根分区
/var50-100GB+xfs日志与数据(高IO分区)
/tmp10-20GBext4临时文件(可挂载为tmpfs)
/home剩余ext4用户数据
/data按需xfs/ext4业务数据独立分区

💡 数据库服务器建议将 /var/lib/mysql 或 /var/lib/postgresql 单独挂载为独立分区,使用XFS文件系统获得更好性能。

1.7 LVM分区方案(推荐生产环境)

# LVM分区规划示例
# 物理磁盘: /dev/sda 500GB

# PV (Physical Volume)
/dev/sda3 → PV (整个磁盘的剩余空间)

# VG (Volume Group)
vg_system → 包含所有LV

# LV (Logical Volume)
lv_root   50GB  /        ext4
lv_var    100GB /var     xfs
lv_home   50GB  /home    ext4
lv_tmp    20GB  /tmp     ext4
lv_swap   16GB  swap     swap
lv_data   剩余  /data    xfs

✅ LVM优势:动态扩容、快照备份、灵活管理,生产环境强烈推荐。

1.8 RAID配置

# 软件RAID配置(使用mdadm)
sudo apt install mdadm

# RAID 0(条带化,高性能无冗余)
sudo mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sda /dev/sdb

# RAID 1(镜像,高可靠)
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda /dev/sdb

# RAID 5(条带+奇偶校验,至少3块盘)
sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sda /dev/sdb /dev/sdc

# RAID 10(镜像+条带,高性能高可靠)
sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd

# 查看RAID状态
cat /proc/mdstat
sudo mdadm --detail /dev/md0

# 保存RAID配置
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u

2. 首次启动配置

2.1 更新系统

# 更新软件源列表
sudo apt update

# 查看可升级的包
apt list --upgradable

# 升级所有已安装的软件包
sudo apt upgrade -y

# 完整升级(处理依赖变更)
sudo apt full-upgrade -y

# 升级发行版(如有大版本更新)
sudo apt dist-upgrade -y

# 清理不需要的包和缓存
sudo apt autoremove -y
sudo apt autoclean
sudo apt clean

# 检查是否需要重启(内核更新后)
[ -f /var/run/reboot-required ] && echo "需要重启" && sudo reboot

2.2 设置时区与时间

# 查看当前时区
timedatectl

# 列出所有可用时区
timedatectl list-timezones | grep Asia

# 设置为上海时区
sudo timedatectl set-timezone Asia/Shanghai

# 启用NTP时间同步
sudo timedatectl set-ntp true

# 查看时间同步状态
timedatectl status
chronyc tracking    # 如果使用chrony

# 手动同步时间(紧急使用)
sudo chronyc makestep
# 或
sudo ntpdate pool.ntp.org

2.3 设置主机名

# 查看当前主机名
hostnamectl

# 修改主机名(立即生效)
sudo hostnamectl set-hostname myserver

# 更新hosts文件
sudo nano /etc/hosts
# 确保包含:
# 127.0.0.1 localhost
# 127.0.1.1 myserver
# ::1 localhost ip6-localhost ip6-loopback

2.4 配置语言环境

# 查看当前语言
locale

# 生成UTF-8语言支持
sudo locale-gen en_US.UTF-8
sudo locale-gen zh_CN.UTF-8  # 如需中文支持

# 设置系统默认语言
sudo update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8

# 查看可用locale
locale -a

2.5 MOTD(登录提示信息)

# 自定义登录提示
sudo nano /etc/update-motd.d/99-custom
#!/bin/bash
echo "================================="
echo "  Welcome to $(hostname)"
echo "  System: $(lsb_release -ds)"
echo "  Kernel: $(uname -r)"
echo "  Uptime: $(uptime -p)"
echo "================================="

sudo chmod +x /etc/update-motd.d/99-custom

# 禁用不需要的MOTD模块
sudo chmod -x /etc/update-motd.d/10-help-text
sudo chmod -x /etc/update-motd.d/50-motd-news

2.6 系统信息查看

# 全面系统信息
neofetch           # 需安装: sudo apt install neofetch
screenfetch        # 需安装: sudo apt install screenfetch

# 硬件信息
sudo lshw -short
sudo hwinfo --short
sudo dmidecode -t system
sudo lspci -v
lsusb -v
cat /proc/cpuinfo
cat /proc/meminfo

3. 用户与权限管理

3.1 创建普通用户

# 创建用户并自动创建home目录,设置shell为bash
sudo adduser --create-home --shell /bin/bash username

# 为用户设置sudo权限
sudo usermod -aG sudo username

# 或使用useradd(更底层控制)
sudo useradd -m -s /bin/bash -c "Full Name" -G sudo,developers username
sudo passwd username

# 设置用户过期日期
sudo usermod -e 2026-12-31 username

# 锁定/解锁用户账户
sudo usermod -L username   # 锁定
sudo usermod -U username   # 解锁

3.2 sudo权限配置

# 使用visudo编辑sudoers(安全编辑方式,防止语法错误)
sudo visudo

# 或编辑独立配置文件(推荐)
sudo visudo -f /etc/sudoers.d/developers
# sudoers配置示例:

# 允许用户无需密码执行sudo(慎用)
username ALL=(ALL) NOPASSWD:ALL

# 限制用户只能执行特定命令
username ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx

# 限制用户只能以特定身份执行命令
deploy ALL=(www-data) NOPASSWD: /usr/bin/systemctl restart php-fpm

# 用户组权限
%developers ALL=(ALL) NOPASSWD: /usr/bin/docker, /usr/bin/docker-compose

# 禁止用户执行特定命令
username ALL=(ALL) ALL, !/usr/bin/passwd root, !/usr/sbin/visudo

3.3 删除用户

# 删除用户但保留home目录
sudo userdel username

# 删除用户并删除home目录和邮件队列
sudo userdel -r username

# 使用deluser(更安全的Ubuntu方式)
sudo deluser --remove-home username
sudo deluser --remove-all-files username

3.4 用户组管理

# 创建组(指定GID)
sudo groupadd -g 2000 developers
sudo groupadd -r system_group   # 系统组(GID < 1000)

# 将用户添加到组(-a表示追加,不可省略)
sudo usermod -aG groupname username

# 设置用户主组
sudo usermod -g new_primary_group username

# 从组中移除用户
sudo gpasswd -d username groupname

# 设置组管理员
sudo gpasswd -A admin_user groupname

# 删除组
sudo groupdel groupname

# 查看用户所属组
groups username
id username

# 查看组成员
getent group groupname
grep groupname /etc/group

3.5 密码策略

# 安装密码质量检查工具
sudo apt install libpam-pwquality

# 编辑密码策略
sudo nano /etc/security/pwquality.conf
# minlen = 14          最小长度
# dcredit = -2         至少2个数字
# ucredit = -1         至少1个大写字母
# lcredit = -2         至少2个小写字母
# ocredit = -1         至少1个特殊字符
# maxrepeat = 3        最多连续相同字符数
# maxclassrepeat = 4   同一类别最多连续字符数
# difok = 4            新密码至少与旧密码不同字符数

# 设置密码过期策略
sudo chage -M 90 username    # 90天后过期
sudo chage -W 7 username     # 提前7天警告
sudo chage -I 30 username    # 30天不活动后禁用
sudo chage -m 1 username     # 最少1天才能修改

# 查看密码信息
sudo chage -l username

# 强制用户下次登录修改密码
sudo chage -d 0 username

# 查看登录失败记录
sudo faillog -a
sudo lastb

3.6 特殊用户和系统账户

# 创建系统账户(无home目录,不可登录)
sudo useradd -r -s /usr/sbin/nologin -d /nonexistent service_account

# 常见系统账户
# www-data    Web服务器
# mysql       MySQL数据库
# postgres    PostgreSQL数据库
# nobody      无特权用户
# daemon      系统守护进程
# syslog      日志服务

# 查看系统账户(UID < 1000)
awk -F: '$3 < 1000 {print $1, $3}' /etc/passwd

4. 软件包管理

4.1 APT基础操作

# 更新包索引
sudo apt update

# 升级所有包
sudo apt upgrade -y

# 完整升级
sudo apt full-upgrade -y

# 安装软件包
sudo apt install package_name

# 安装指定版本
sudo apt install package_name=1.2.3-4

# 重新安装软件包
sudo apt reinstall package_name

# 卸载软件包(保留配置)
sudo apt remove package_name

# 完全卸载(删除配置)
sudo apt purge package_name

# 搜索软件包
apt search keyword

# 查看包信息
apt show package_name

# 查看包依赖
apt depends package_name
apt rdepends package_name  # 反向依赖(谁依赖它)

# 查看包包含的文件
dpkg -L package_name

# 查找文件属于哪个包
dpkg -S /usr/bin/command
apt-file search filename  # 需安装apt-file

# 列出已安装的包
apt list --installed
dpkg --get-selections

# 清理缓存
sudo apt clean
sudo apt autoclean
sudo apt autoremove --purge

# 固定包版本(防止升级)
sudo apt-mark hold package_name
sudo apt-mark unhold package_name
apt-mark showhold

4.2 配置国内镜像源

# Ubuntu 24.04 使用新格式的源配置
# 查看当前源配置
ls /etc/apt/sources.list.d/
cat /etc/apt/sources.list.d/ubuntu.sources

# 备份原始配置
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
# 阿里云源(/etc/apt/sources.list.d/ubuntu.sources)
Types: deb
URIs: http://mirrors.aliyun.com/ubuntu/
Suites: noble noble-updates noble-security noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# 或使用传统格式(/etc/apt/sources.list)
deb http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse
# 更新索引
sudo apt update

# 其他推荐镜像源:
# 清华源: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
# 中科大源: https://mirrors.ustc.edu.cn/ubuntu/
# 华为源: https://repo.huaweicloud.com/ubuntu/

4.3 添加第三方PPA仓库

# 添加PPA(需要software-properties-common)
sudo apt install software-properties-common
sudo add-apt-repository ppa:user/ppa-name

# 手动添加仓库
sudo nano /etc/apt/sources.list.d/custom.list
# deb [signed-by=/usr/share/keyrings/custom.gpg] http://repo.example.com/ubuntu noble main

# 导入GPG密钥
curl -fsSL https://repo.example.com/key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/custom.gpg

# 删除PPA
sudo add-apt-repository --remove ppa:user/ppa-name
# 或使用ppa-purge
sudo apt install ppa-purge
sudo ppa-purge ppa:user/ppa-name

4.4 dpkg底层操作

# 安装本地deb包
sudo dpkg -i package.deb

# 修复依赖问题
sudo apt --fix-broken install

# 查看包状态
dpkg -s package_name

# 列出包文件
dpkg -L package_name

# 列出所有已安装包
dpkg -l | grep package

# 重新配置包
sudo dpkg-reconfigure package_name

# 强制安装(不推荐)
sudo dpkg --force-all -i package.deb

4.5 Snap包管理

# Ubuntu 24.04 默认包含snap

# 安装snap包
sudo snap install package_name
sudo snap install package_name --channel=latest/stable

# 列出已安装的snap
snap list

# 查看snap信息
snap info package_name

# 更新snap
sudo snap refresh package_name
sudo snap refresh   # 更新所有

# 卸载snap
sudo snap remove package_name
sudo snap remove --purge package_name  # 清除所有数据

# 搜索snap
snap find keyword

# 查看snap服务
snap services

# 管理snap配置
snap get package_name
snap set package_name key=value

4.6 Flatpak管理

# 安装Flatpak
sudo apt install flatpak

# 添加Flathub仓库
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

# 安装应用
flatpak install flathub com.example.App

# 运行应用
flatpak run com.example.App

# 列出已安装
flatpak list

# 更新
flatpak update

# 卸载
flatpak uninstall com.example.App

4.7 从源码编译安装

# 安装编译工具
sudo apt install build-essential cmake autoconf automake libtool pkg-config

# 下载源码
wget https://example.com/software-1.0.tar.gz
# 或使用git
git clone https://github.com/user/software.git

# 解压
tar -xzf software-1.0.tar.gz
cd software-1.0

# 查看编译选项
./configure --help

# 配置(指定安装路径)
./configure --prefix=/opt/software --sysconfdir=/etc --enable-feature

# 编译(使用多核加速)
make -j$(nproc)

# 安装
sudo make install

# 或创建deb包(推荐)
sudo apt install checkinstall
sudo checkinstall  # 交互式创建deb包

5. 网络配置

5.1 查看网络信息

# 查看网络接口
ip addr
ip -br addr    # 简洁格式
ip link show

# 查看路由表
ip route
ip route show table main
ip -6 route    # IPv6路由

# 查看ARP表
ip neigh

# 查看DNS
cat /etc/resolv.conf
resolvectl status
resolvectl query example.com

# 测试连通性
ping -c 4 8.8.8.8
ping -c 4 baidu.com
mtr baidu.com          # 综合路径测试(需安装mtr)
tracepath baidu.com    # UDP traceroute

# 查看端口占用
ss -tuln
ss -tulnp              # 显示进程(需root)
netstat -tuln          # 需安装 net-tools

# 查看网络统计
ip -s link
ss -s                  # 统计摘要

5.2 配置静态IP (Netplan)

Ubuntu 24.04 使用 Netplan 管理网络(基于YAML):

# 查看当前网络配置
ls /etc/netplan/
cat /etc/netplan/*.yaml

# 确认网卡名称
ip link show

# 编辑配置
sudo nano /etc/netplan/01-netcfg.yaml
# 单网卡静态IP配置
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
        - 2001:db8::100/64    # IPv6地址(可选)
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
          - 114.114.114.114
        search:
          - local.domain
# 应用配置
sudo netplan apply

# 调试模式(显示详细信息)
sudo netplan --debug apply
sudo netplan --debug generate

5.3 配置双网卡/多IP

network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
        - 192.168.1.101/24    # 第二个IP
      routes:
        - to: default
          via: 192.168.1.1
    ens34:
      dhcp4: no
      addresses:
        - 10.0.0.100/24
      # 第二个网卡不设默认路由,用于内网通信

5.4 配置网桥 (用于虚拟化)

network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
  bridges:
    br0:
      interfaces:
        - ens33
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 114.114.114.114]
      parameters:
        stp: true
        forward-delay: 4

5.5 DNS配置

# 方法1: 通过systemd-resolved(推荐)
sudo nano /etc/systemd/resolved.conf
[Resolve]
DNS=8.8.8.8 114.114.114.114
FallbackDNS=8.8.4.4 223.5.5.5
DNSSEC=allow-downgrade
DNSOverTLS=opportunistic
Cache=yes

sudo systemctl restart systemd-resolved

# 方法2: 使用resolvectl临时设置
sudo resolvectl dns ens33 8.8.8.8 114.114.114.114
sudo resolvectl domain ens33 local.domain

# 验证DNS
resolvectl status
dig example.com
nslookup example.com

5.6 主机名解析

# 编辑hosts文件
sudo nano /etc/hosts
# 127.0.0.1 localhost
# 127.0.1.1 myserver
# 192.168.1.100 server1.local server1
# 192.168.1.101 server2.local server2
# 192.168.1.102 db.local db

# 配置nsswitch解析顺序
cat /etc/nsswitch.conf
# hosts: files dns

5.7 网络诊断工具

# 安装诊断工具
sudo apt install tcpdump nmap mtr iperf3 nethogs iftop

# 抓包分析
sudo tcpdump -i ens33 -nn port 80 -c 100
sudo tcpdump -i ens33 -w capture.pcap

# 端口扫描
nmap -sV 192.168.1.1
nmap -p 1-65535 localhost

# 带宽测试
iperf3 -s          # 服务端
iperf3 -c 192.168.1.100   # 客户端

# 实时流量监控
sudo nethogs ens33    # 按进程显示
sudo iftop -i ens33   # 按连接显示

# Wireshark命令行版
tshark -i ens33 -f "port 80" -c 100

6. SSH远程管理

6.1 安装SSH服务

# 安装OpenSSH服务端
sudo apt install openssh-server

# 启动并设置开机自启
sudo systemctl enable --now ssh

# 查看状态
sudo systemctl status ssh

# 查看SSH版本
ssh -V
sshd -V

6.2 SSH安全配置

# 备份配置文件
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 创建独立配置片段(推荐)
sudo mkdir -p /etc/ssh/sshd_config.d
sudo nano /etc/ssh/sshd_config.d/security.conf
# 推荐的安全配置:
# 网络设置
Port 2222
AddressFamily inet
ListenAddress 0.0.0.0
Protocol 2

# 认证设置
PermitRootLogin no
PermitEmptyPasswords no
MaxAuthTries 3
MaxSessions 5
LoginGraceTime 30
AuthenticationMethods publickey

# 仅允许特定用户/组
AllowUsers admin deploy
AllowGroups sshusers

# 禁用密码认证(密钥配置好后)
PasswordAuthentication no
ChallengeResponseAuthentication no

# 密钥认证
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 禁用不需要的功能
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no

# 日志
LogLevel VERBOSE
SyslogFacility AUTH

# 连接保活
ClientAliveInterval 300
ClientAliveCountMax 2

# 禁用不安全算法
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256,diffie-hellman-group16-sha512
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
# 验证配置语法
sudo sshd -t

# 重启SSH服务
sudo systemctl restart ssh

# 注意:重启前请确保有一个活动的SSH连接用于测试!

6.3 SSH密钥认证

# 在客户端生成密钥对(推荐Ed25519算法)
ssh-keygen -t ed25519 -C "admin@company.com" -f ~/.ssh/id_ed25519

# 或使用RSA 4096位
ssh-keygen -t rsa -b 4096 -C "admin@company.com"

# 将公钥复制到服务器
ssh-copy-id -p 2222 username@server_ip

# 或手动复制
cat ~/.ssh/id_ed25519.pub | ssh -p 2222 username@server_ip \
  "mkdir -p ~/.ssh && chmod 700 ~/.ssh && \
   cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

# 测试密钥登录
ssh -p 2222 -i ~/.ssh/id_ed25519 username@server_ip

# 设置密钥密码短语(额外安全层)
ssh-keygen -p -f ~/.ssh/id_ed25519

6.4 SSH客户端配置

# 编辑客户端配置(本地电脑 ~/.ssh/config)
nano ~/.ssh/config
# SSH客户端配置示例
Host myserver
    HostName 192.168.1.100
    User admin
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60
    ServerAliveCountMax 3
    Compression yes
    ForwardAgent no
    AddKeysToAgent yes
    ConnectTimeout 10

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    HashKnownHosts yes
    IdentitiesOnly yes
    VisualHostKey yes

6.5 SSH端口转发

# 本地端口转发(将远程服务映射到本地)
ssh -L 3306:localhost:3306 -p 2222 user@server
# 本地3306 → 服务器localhost:3306

# 远程端口转发(将本地服务暴露到远程)
ssh -R 8080:localhost:3000 -p 2222 user@server
# 服务器8080 → 本地localhost:3000

# 动态端口转发(SOCKS代理)
ssh -D 1080 -p 2222 user@server
# 本地1080端口作为SOCKS5代理

# SSH隧道配置
Host tunnel
    HostName 192.168.1.100
    User admin
    Port 2222
    LocalForward 3306 127.0.0.1:3306
    LocalForward 6379 127.0.0.1:6379

6.6 SSH安全加固

# 安装Fail2ban防止暴力破解
sudo apt install fail2ban

# 配置SSH防护
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = iptables-multiport
backend = systemd

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = %(sshd_log)s
maxretry = 3
bantime = 3600
# 启动fail2ban
sudo systemctl enable --now fail2ban

# 查看状态
sudo fail2ban-client status
sudo fail2ban-client status sshd

# 手动封禁/解封IP
sudo fail2ban-client set sshd banip 192.168.1.50
sudo fail2ban-client set sshd unbanip 192.168.1.50

6.7 SSH证书认证(高级)

# 生成CA密钥
ssh-keygen -t ed25519 -f ca_key -C "SSH CA"

# 签发用户证书(有效期1周)
ssh-keygen -s ca_key -I user_cert -n admin,deploy -V +1w user_key.pub

# 签发主机证书
ssh-keygen -s ca_key -I server_cert -h -n server.example.com -V +52w ssh_host_ed25519_key.pub

# 配置服务器信任CA
echo "@cert-authority *.example.com $(cat ca_key.pub)" >> /etc/ssh/ssh_known_hosts

# 客户端使用证书登录
ssh -i user_key-cert.pub -p 2222 admin@server.example.com

7. 防火墙与安全

7.1 UFW防火墙

# 启用UFW(默认禁用)
sudo ufw enable

# 默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 允许SSH(自定义端口)
sudo ufw allow 2222/tcp comment 'SSH'

# 允许HTTP/HTTPS
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# 允许特定IP访问
sudo ufw allow from 192.168.1.0/24

# 允许特定IP访问特定端口
sudo ufw allow from 10.0.0.5 to any port 3306 proto tcp
sudo ufw allow from 10.0.0.5 to any port 5432 proto tcp

# 限速(防暴力破解)
sudo ufw limit 2222/tcp

# 拒绝特定IP
sudo ufw deny from 203.0.113.50

# 删除规则
sudo ufw delete allow 80/tcp
sudo ufw delete 3  # 按编号删除

# 查看状态
sudo ufw status
sudo ufw status numbered
sudo ufw status verbose

# 查看日志
sudo less /var/log/ufw.log
sudo ufw logging on    # 开启日志
sudo ufw logging low   # 日志级别: off/low/medium/high/full

# 重置所有规则
sudo ufw reset

# 禁用UFW
sudo ufw disable

7.2 iptables/nftables高级配置

# Ubuntu 24.04 默认使用nftables后端
# 安装nftables
sudo apt install nftables

# 查看当前规则
sudo nft list ruleset

# 创建规则文件
sudo nano /etc/nftables.conf
#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;

        # 允许回环
        iif lo accept

        # 允许已建立的连接
        ct state established,related accept

        # 丢弃无效连接
        ct state invalid drop

        # 允许SSH
        tcp dport 2222 accept

        # 允许HTTP/HTTPS
        tcp dport { 80, 443 } accept

        # 允许ICMP ping
        icmp type echo-request limit rate 5/second accept

        # 限速SSH(防暴力破解)
        tcp dport 2222 ct state new limit rate 3/minute accept

        # 日志记录被拒绝的包
        counter log prefix "NFT-DROP: " drop
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}
# 加载规则
sudo nft -f /etc/nftables.conf

# 持久化规则
sudo systemctl enable nftables

7.3 内核安全参数

# 编辑内核参数
sudo nano /etc/sysctl.d/99-security.conf
# 防止IP欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.log_martians = 1

# 禁止ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

# 禁止源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# SYN Flood防护
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5

# 防止TCP时间等待攻击
net.ipv4.tcp_rfc1337 = 1

# 启用反向路径过滤
net.ipv4.conf.all.arp_filter = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1

# 禁用IPv6(如不需要)
# net.ipv6.conf.all.disable_ipv6 = 1
# net.ipv6.conf.default.disable_ipv6 = 1

# 内核随机数熵
kernel.randomize_va_space = 2

# 限制内核日志
kernel.printk = 4 4 1 7

# 防止内核模块自动加载(需要时手动加载)
# kernel.modules_disabled = 1
# 应用参数
sudo sysctl --system
# 或
sudo sysctl -p /etc/sysctl.d/99-security.conf

# 验证参数
sysctl net.ipv4.tcp_syncookies

8. 服务管理 (systemd)

8.1 systemctl基础命令

# 启动/停止/重启服务
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx      # 重载配置(不中断服务)

# 设置开机自启
sudo systemctl enable nginx
sudo systemctl disable nginx
sudo systemctl is-enabled nginx

# 查看服务状态
sudo systemctl status nginx
sudo systemctl show nginx        # 详细信息

# 列出所有服务
systemctl list-units --type=service --state=running
systemctl list-units --type=service --all

# 列出失败的服务
systemctl --failed

# 服务依赖
systemctl list-dependencies nginx
systemctl list-dependencies --reverse nginx

8.2 journalctl日志查看

# 查看服务日志
journalctl -u nginx
journalctl -u nginx --since today
journalctl -u nginx --since "2026-07-01" --until "2026-07-18"
journalctl -u nginx -n 100        # 最近100行
journalctl -u nginx -f            # 实时跟踪

# 按优先级过滤
journalctl -p err                 # 错误及以上
journalctl -p warning             # 警告及以上
# 级别: emerg(0) alert(1) crit(2) err(3) warning(4) notice(5) info(6) debug(7)

# 查看系统日志
journalctl -b                     # 本次启动
journalctl -b -1                  # 上次启动
journalctl -k                     # 内核日志

# 日志维护
journalctl --disk-usage           # 查看占用空间
sudo journalctl --vacuum-size=500M    # 限制大小
sudo journalctl --vacuum-time=7d      # 保留7天
sudo journalctl --rotate              # 立即轮转

8.3 创建自定义服务

# 创建服务文件
sudo nano /etc/systemd/system/myapp.service
[Unit]
Description=My Application Service
Documentation=https://docs.myapp.com
After=network.target network-online.target
Wants=network-online.target
Requires=postgresql.service
ConditionPathExists=/opt/myapp

[Service]
Type=simple
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStartPre=/opt/myapp/check_config.sh
ExecStart=/opt/myapp/start.sh
ExecStartPost=/opt/myapp/notify.sh
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/opt/myapp/stop.sh

# 重启策略
Restart=on-failure
RestartSec=5
RestartPreventExitStatus=1
StartLimitBurst=3
StartLimitIntervalSec=60

# 环境变量
Environment=NODE_ENV=production
Environment=PORT=3000
EnvironmentFile=/etc/myapp/env.conf

# 标准输出
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp

# 安全加固
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/myapp/data /var/log/myapp
PrivateTmp=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictRealtime=true
RestrictNamespaces=true

# 资源限制
LimitNOFILE=65536
LimitNPROC=4096
MemoryMax=512M
CPUQuota=80%
TasksMax=500

# 超时
TimeoutStartSec=30
TimeoutStopSec=30

[Install]
WantedBy=multi-user.target
# 重新加载systemd配置
sudo systemctl daemon-reload

# 启动服务
sudo systemctl enable --now myapp

# 查看服务状态
sudo systemctl status myapp

8.4 Systemd Timer(替代Cron)

# 创建服务文件 /etc/systemd/system/backup.service
[Unit]
Description=Daily Backup Service

[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
User=root

# 创建定时器 /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily at 2AM

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
# 启用定时器
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer

# 查看定时器
systemctl list-timers
systemctl list-timers --all

8.5 Systemd高级功能

# 服务模板(多个实例)
# 文件: myapp@.service
[Service]
ExecStart=/opt/myapp/start.sh %i

# 启动实例
sudo systemctl start myapp@instance1
sudo systemctl start myapp@instance2

# Socket激活(按需启动服务)
# myapp.socket
[Unit]
Description=MyApp Socket

[Socket]
ListenStream=3000
Accept=false

[Install]
WantedBy=sockets.target

# 路径监控(文件变化时触发服务)
# watch.path
[Path]
PathChanged=/opt/myapp/config.yml

[Install]
WantedBy=multi-user.target

9. Web服务器搭建

9.1 Nginx安装与配置

# 安装Nginx(推荐使用官方仓库获取最新版本)
# 添加Nginx官方仓库
curl -fsSL https://nginx.org/keys/nginx_signing.key | \
  sudo gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
  http://nginx.org/packages/ubuntu noble nginx" | \
  sudo tee /etc/apt/sources.list.d/nginx.list

sudo apt update
sudo apt install nginx

# 或使用Ubuntu仓库
sudo apt install nginx

# 启动并设置开机自启
sudo systemctl enable --now nginx

# 查看版本和编译参数
nginx -V

# 测试配置文件
sudo nginx -t

# 重新加载配置
sudo systemctl reload nginx

9.2 Nginx虚拟主机配置

# 创建网站目录
sudo mkdir -p /var/www/example.com/{html,logs,ssl}
sudo chown -R $USER:$USER /var/www/example.com
sudo chmod -R 755 /var/www/example.com

# 创建测试页面
cat > /var/www/example.com/html/index.html << 'EOF'


Example
Hello from example.com

EOF

# 创建虚拟主机配置
sudo nano /etc/nginx/sites-available/example.com
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /var/www/example.com/html;
    index index.html index.htm index.php;

    # 日志
    access_log /var/www/example.com/logs/access.log;
    error_log /var/www/example.com/logs/error.log warn;

    # Gzip压缩
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript
               text/xml application/xml application/xml+rss text/javascript
               image/svg+xml;
    gzip_min_length 1000;

    # 安全头
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Content-Security-Policy "default-src 'self'" always;
    add_header Permissions-Policy "geolocation=(), microphone=()" always;

    # 禁止访问隐藏文件
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    location / {
        try_files $uri $uri/ /index.html;
    }

    # 静态文件缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|woff|ttf|svg)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    # 错误页面
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}
# 启用站点
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

# 移除默认站点(可选)
sudo rm /etc/nginx/sites-enabled/default

# 测试并重载
sudo nginx -t
sudo systemctl reload nginx

9.3 HTTPS/SSL配置 (Let's Encrypt)

# 安装Certbot
sudo apt install certbot python3-certbot-nginx

# 自动获取并配置SSL证书
sudo certbot --nginx -d example.com -d www.example.com

# 使用webroot验证方式
sudo certbot certonly --webroot -w /var/www/example.com/html -d example.com

# 使用DNS验证(适用于通配符证书)
sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com"

# 自动续期测试
sudo certbot renew --dry-run

# 手动续期
sudo certbot renew

# 查看证书信息
sudo certbot certificates

# 删除证书
sudo certbot delete --cert-name example.com

9.4 HTTPS完整配置

# SSL优化的Nginx配置
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com;

    # SSL证书
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # SSL优化
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # HSTS
    add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    # 其余配置同HTTP...
    root /var/www/example.com/html;
    index index.html;
}

# HTTP重定向到HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

9.5 Nginx反向代理

# 负载均衡配置
upstream backend {
    # 负载均衡算法
    # round-robin(默认)
    # least_conn;
    # ip_hash;
    # hash $request_uri consistent;

    server 127.0.0.1:3000 weight=3 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:3001 weight=2 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:3002 backup;  # 备用服务器
    keepalive 32;
}

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;

        # 头部传递
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket支持
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';

        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        # 缓冲区
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;

        # 错误处理
        proxy_next_upstream error timeout http_500 http_502 http_503;
        proxy_next_upstream_tries 3;
    }

    # 健康检查(Nginx Plus或开源替代)
    location /health {
        proxy_pass http://backend;
        proxy_next_upstream error timeout http_500;
    }
}

9.6 Nginx性能优化

# 编辑主配置
sudo nano /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log warn;

events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # 日志格式
    log_format main '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    '$request_time $upstream_response_time';

    access_log /var/log/nginx/access.log main;

    # 性能优化
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    keepalive_requests 1000;
    types_hash_max_size 2048;
    server_tokens off;

    # 客户端限制
    client_max_body_size 64M;
    client_body_buffer_size 16k;
    client_header_buffer_size 4k;
    large_client_header_buffers 4 16k;
    client_body_timeout 12;
    client_header_timeout 12;

    # 代理优化
    proxy_connect_timeout 60;
    proxy_send_timeout 60;
    proxy_read_timeout 60;

    # 文件缓存
    open_file_cache max=10000 inactive=60s;
    open_file_cache_valid 60s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;

    # Rate Limiting
    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

10. 数据库服务器

10.1 MySQL 8.0 安装与配置

# 安装MySQL 8.0
sudo apt install mysql-server

# 安全初始化
sudo mysql_secure_installation
# 设置root密码
# 移除匿名用户
# 禁止root远程登录
# 移除测试数据库
# 重新加载权限表

# 启动并设置开机自启
sudo systemctl enable --now mysql

# 查看状态
sudo systemctl status mysql

10.2 MySQL用户和数据库管理

# 登录MySQL
sudo mysql -u root -p

# 创建数据库
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 创建用户(本地和远程)
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
CREATE USER 'myapp_user'@'10.0.0.%' IDENTIFIED BY 'StrongPassword123!';

# 授权
GRANT ALL PRIVILEGES ON myapp_db.* TO 'myapp_user'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'myapp_user'@'10.0.0.%';

# 刷新权限
FLUSH PRIVILEGES;

# 查看用户权限
SHOW GRANTS FOR 'myapp_user'@'localhost';

# 查看所有用户
SELECT user, host FROM mysql.user;

# 查看所有数据库
SHOW DATABASES;

# 查看数据库大小
SELECT table_schema AS 'Database',
       ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
GROUP BY table_schema;

10.3 MySQL性能优化

# 编辑配置文件
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# 基础设置
bind-address = 127.0.0.1
port = 3306
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock

# 连接数
max_connections = 500
max_connect_errors = 100000
wait_timeout = 600
interactive_timeout = 600

# InnoDB优化(最重要的性能参数)
innodb_buffer_pool_size = 4G           # 物理内存的50-70%
innodb_buffer_pool_instances = 4       # buffer_pool_size > 1G时设置
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2     # 1=最安全 2=性能 0=最快
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_io_capacity = 2000              # SSD可设更高
innodb_io_capacity_max = 4000
innodb_read_io_threads = 8
innodb_write_io_threads = 8

# 查询优化
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 4M

# 线程池
thread_cache_size = 64
table_open_cache = 4000
table_definition_cache = 2000

# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

# 二进制日志(用于复制和恢复)
server-id = 1
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
binlog_expire_logs_seconds = 604800
max_binlog_size = 256M

# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

10.4 MySQL复制(主从)

# 主库配置(my.cnf)
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
sync_binlog = 1

# 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplicationPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

# 查看主库状态
SHOW MASTER STATUS;
# 记录File和Position

# 从库配置(my.cnf)
[mysqld]
server-id = 2
relay_log = /var/log/mysql/relay-bin
read_only = 1

# 从库配置复制
CHANGE MASTER TO
  MASTER_HOST='192.168.1.100',
  MASTER_USER='repl',
  MASTER_PASSWORD='ReplicationPass123!',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154;

START SLAVE;
SHOW SLAVE STATUS\G

10.5 PostgreSQL

# 安装PostgreSQL
sudo apt install postgresql postgresql-contrib

# 启动服务
sudo systemctl enable --now postgresql

# 切换用户
sudo -i -u postgres

# 进入数据库
psql

# 常用操作
CREATE DATABASE mydb;
CREATE USER myuser WITH ENCRYPTED PASSWORD 'mypassword';
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
ALTER USER myuser WITH SUPERUSER;

# 查看数据库列表
\l
# 查看表
\dt
# 查看表结构
\d tablename
# 退出
\q
# PostgreSQL性能优化 (/etc/postgresql/16/main/postgresql.conf)
# 内存设置
shared_buffers = 2GB           # 物理内存的25%
effective_cache_size = 6GB     # 物理内存的75%
work_mem = 64MB
maintenance_work_mem = 512MB

# WAL设置
wal_buffers = 64MB
min_wal_size = 1GB
max_wal_size = 4GB
checkpoint_completion_target = 0.9

# 查询优化
random_page_cost = 1.1         # SSD设置
effective_io_concurrency = 200 # SSD设置
max_worker_processes = 8
max_parallel_workers = 8
max_parallel_workers_per_gather = 4

10.6 Redis缓存

# 安装Redis
sudo apt install redis-server

# 编辑配置
sudo nano /etc/redis/redis.conf
# 网络设置
bind 127.0.0.1 -::1
port 6379
protected-mode yes

# 认证
requirepass YourStrongPasswordHere

# 内存管理
maxmemory 2gb
maxmemory-policy allkeys-lru

# 持久化 - RDB快照
save 900 1
save 300 10
save 60 10000

# 持久化 - AOF(推荐生产环境)
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 性能
tcp-backlog 511
tcp-keepalive 300
hz 10

# 日志
loglevel notice
logfile /var/log/redis/redis-server.log
# 重启服务
sudo systemctl restart redis-server

# 连接Redis
redis-cli -a YourStrongPasswordHere

# 常用命令
> PING
> SET key value
> GET key
> INFO memory
> INFO server
> DBSIZE
> FLUSHDB        # 清空当前数据库
> CONFIG GET maxmemory

10.7 数据库备份与恢复

# MySQL备份
# 备份单个数据库
mysqldump -u root -p myapp_db > backup_$(date +%Y%m%d).sql

# 备份所有数据库
mysqldump -u root -p --all-databases > all_backup_$(date +%Y%m%d).sql

# 带压缩的备份
mysqldump -u root -p --all-databases --single-transaction --routines --triggers \
  | gzip > /backup/mysql_$(date +%Y%m%d_%H%M%S).sql.gz

# 恢复
mysql -u root -p myapp_db < backup_20260718.sql
gunzip < backup.sql.gz | mysql -u root -p myapp_db

# PostgreSQL备份
pg_dump -U postgres mydb > backup.sql
pg_dumpall -U postgres > all_backup.sql
pg_restore -U postgres -d mydb backup.dump

# Redis备份
# 复制RDB文件
cp /var/lib/redis/dump.rdb /backup/redis_$(date +%Y%m%d).rdb

# Redis自动备份脚本
redis-cli -a password BGSAVE
cp /var/lib/redis/dump.rdb /backup/redis_$(date +%Y%m%d).rdb

11. 容器化部署 (Docker)

11.1 安装Docker

# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc 2>/dev/null

# 安装依赖
sudo apt install ca-certificates curl gnupg lsb-release

# 添加Docker官方GPG密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

# 将用户加入docker组(免sudo)
sudo usermod -aG docker $USER
# 需重新登录生效

# 验证安装
docker --version
docker compose version
docker run hello-world

11.2 Docker配置优化

# 编辑Docker守护进程配置
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
{
  "storage-driver": "overlay2",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "5"
  },
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 65535,
      "Soft": 65535
    }
  },
  "dns": ["8.8.8.8", "114.114.114.114"],
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me"
  ],
  "live-restore": true,
  "default-address-pools": [
    {"base": "172.30.0.0/16", "size": 24}
  ],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
# 重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

11.3 Docker Compose

# 创建项目目录
mkdir ~/myapp && cd ~/myapp

# 创建docker-compose.yml
nano docker-compose.yml
services:
  web:
    image: nginx:1.25-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/ssl:/etc/nginx/ssl:ro
      - ./html:/usr/share/nginx/html:ro
    depends_on:
      - app
    restart: unless-stopped
    networks:
      - frontend

  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_PORT=3306
      - DB_NAME=myapp
      - REDIS_HOST=redis
    volumes:
      - ./app:/app
      - app_data:/app/data
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 1G
        reservations:
          cpus: '1'
          memory: 512M
    networks:
      - frontend
      - backend

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
      MYSQL_DATABASE: myapp
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}
    volumes:
      - db_data:/var/lib/mysql
      - ./db/init:/docker-entrypoint-initdb.d
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped
    networks:
      - backend

  redis:
    image: redis:7-alpine
    command: redis-server --requirepass ${REDIS_PASS} --maxmemory 256mb
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped
    networks:
      - backend

volumes:
  db_data:
  redis_data:
  app_data:

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true
# 创建环境变量文件
nano .env
DB_ROOT_PASS=SuperSecureRootPass123!
DB_USER=myapp_user
DB_PASS=SecurePass456!
REDIS_PASS=RedisPass789!
# 启动服务
docker compose up -d

# 查看日志
docker compose logs -f app
docker compose logs --tail=100

# 停止服务
docker compose down

# 重新构建并启动
docker compose up -d --build

# 查看资源使用
docker compose top
docker stats

11.4 Dockerfile最佳实践

# 多阶段构建 Node.js 应用
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && \
    npm cache clean --force
COPY . .
RUN npm run build

# Stage 2: Production
FROM node:20-alpine AS production
LABEL maintainer="admin@example.com"
LABEL version="1.0"

RUN addgroup -g 1001 -S appgroup && \
    adduser -S appuser -u 1001 -G appgroup

WORKDIR /app
COPY --from=builder --chown=appuser:appgroup /app/dist ./dist
COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:appgroup /app/package.json ./

EXPOSE 3000
USER appuser

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1

CMD ["node", "dist/index.js"]

11.5 Docker网络管理

# 查看网络
docker network ls
docker network inspect bridge

# 创建自定义网络
docker network create --driver bridge --subnet 172.20.0.0/16 mynet
docker network create --driver overlay myoverlay   # Swarm模式

# 连接容器到网络
docker network connect mynet container1

# 删除网络
docker network rm mynet
docker network prune   # 清理未使用的网络

11.6 Docker Swarm集群

# 初始化Swarm
docker swarm init --advertise-addr 192.168.1.100

# 加入集群(在其他节点执行)
docker swarm join --token SWMTKN-xxx 192.168.1.100:2377

# 部署stack
docker stack deploy -c docker-compose.yml myapp

# 查看服务
docker service ls
docker service ps myapp_web
docker service logs myapp_web

# 扩缩容
docker service scale myapp_web=5

# 更新服务
docker service update --image nginx:1.26 myapp_web

11.7 Docker安全

# 以非root用户运行容器
# 在Dockerfile中指定
USER appuser

# 只读文件系统
docker run --read-only --tmpfs /tmp myimage

# 限制能力
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE myimage

# 资源限制
docker run --memory=512m --cpus=1 --pids-limit=100 myimage

# 安全扫描
docker scout cves myimage:latest
# 或使用trivy
sudo apt install trivy
trivy image myimage:latest

12. 文件共享服务

12.1 Samba文件共享

# 安装Samba
sudo apt install samba samba-common-bin

# 创建共享目录
sudo mkdir -p /srv/samba/{public,secure}
sudo chown nobody:nogroup /srv/samba/public
sudo chmod 777 /srv/samba/public
sudo chown root:sambashare /srv/samba/secure
sudo chmod 2770 /srv/samba/secure

# 编辑配置
sudo nano /etc/samba/smb.conf
[global]
    workgroup = WORKGROUP
    server string = Samba Server
    server role = standalone server
    log file = /var/log/samba/log.%m
    max log size = 1000
    dns proxy = no

    # 安全设置
    min protocol = SMB2
    client min protocol = SMB2

[public]
    path = /srv/samba/public
    browseable = yes
    read only = yes
    guest ok = yes
    create mask = 0644
    directory mask = 0755

[secure]
    path = /srv/samba/secure
    browseable = yes
    read only = no
    guest ok = no
    valid users = user1 user2 @developers
    create mask = 0660
    directory mask = 0770
    force group = sambashare
# 设置Samba密码
sudo smbpasswd -a user1
sudo smbpasswd -e user1   # 启用用户

# 测试配置
testparm

# 重启服务
sudo systemctl restart smbd nmbd

# 防火墙放行
sudo ufw allow samba

# 查看Samba状态
sudo smbstatus

12.2 NFS网络文件系统

# NFS服务端配置
sudo apt install nfs-kernel-server

# 创建共享目录
sudo mkdir -p /srv/nfs/{share,data}
sudo chown nobody:nogroup /srv/nfs/share
sudo chmod 755 /srv/nfs/share
sudo chown www-data:www-data /srv/nfs/data
sudo chmod 755 /srv/nfs/data

# 配置导出
sudo nano /etc/exports
# /srv/nfs/share 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
# /srv/nfs/data 192.168.1.0/24(rw,sync,no_subtree_check,all_squash,anonuid=33,anongid=33)
# /srv/nfs/share 10.0.0.5(rw,sync,no_subtree_check)

# 应用配置
sudo exportfs -arv
sudo systemctl restart nfs-kernel-server

# 查看导出
sudo exportfs -v
# NFS客户端挂载
sudo apt install nfs-common

# 手动挂载
sudo mount -t nfs -o rw,sync,hard,intr 192.168.1.100:/srv/nfs/share /mnt/nfs

# 开机自动挂载(/etc/fstab)
# 192.168.1.100:/srv/nfs/share /mnt/nfs nfs defaults,hard,intr,timeo=600,retrans=2 0 0

# NFSv4挂载
# 192.168.1.100:/share /mnt/nfs nfs4 defaults,sec=sys 0 0

12.3 FTP服务器 (vsftpd)

# 安装vsftpd
sudo apt install vsftpd

# 备份并编辑配置
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
sudo nano /etc/vsftpd.conf
# 基本设置
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES
allow_writeable_chroot=YES

# 被动模式
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30100

# 用户限制
user_sub_token=$USER
local_root=/home/$USER/ftp

# SSL/TLS(推荐)
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
# 创建FTP用户
sudo useradd -m -s /usr/sbin/nologin ftpuser
sudo passwd ftpuser
sudo mkdir -p /home/ftpuser/ftp/upload
sudo chown -R ftpuser:ftpuser /home/ftpuser/ftp
sudo chmod 755 /home/ftpuser/ftp
sudo chmod 775 /home/ftpuser/ftp/upload

# 允许nologin用户使用FTP
echo "/usr/sbin/nologin" | sudo tee -a /etc/shells

# 重启服务
sudo systemctl restart vsftpd

# 防火墙
sudo ufw allow 21/tcp
sudo ufw allow 30000:30100/tcp

13. 定时任务与自动化

13.1 Cron定时任务

# 编辑当前用户的crontab
crontab -e

# 查看当前用户的定时任务
crontab -l

# 编辑系统crontab
sudo nano /etc/crontab
# Cron格式: 分(0-59) 时(0-23) 日(1-31) 月(1-12) 周(0-7) 命令
# * = 任意值, */n = 每n次, n-m = 范围, n,m = 列表

# 每天凌晨2点执行备份
0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

# 每小时执行一次
0 * * * * /opt/scripts/check_health.sh

# 每5分钟
*/5 * * * * /opt/scripts/monitor.sh

# 每周一上午9点
0 9 * * 1 /opt/scripts/weekly_report.sh

# 每月1号和15号零点
0 0 1,15 * * /opt/scripts/monthly_task.sh

# 工作日(周一到周五)早上8点
0 8 * * 1-5 /opt/scripts/weekday_task.sh

# 每季度第一天
0 0 1 */3 * /opt/scripts/quarterly_task.sh

# 系统级crontab需要指定用户
# /etc/crontab 格式: 分 时 日 月 周 用户 命令
30 2 * * * root /opt/scripts/cleanup.sh

13.2 Systemd Timer(推荐替代Cron)

# 创建服务文件 /etc/systemd/system/backup.service
[Unit]
Description=Daily Backup
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
StandardOutput=journal
StandardError=journal

# 创建定时器 /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily at 2AM

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
# 启用定时器
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer

# 查看定时器状态
systemctl list-timers --all
journalctl -u backup.service

13.3 Anacron(不固定时间开机)

# Anacron适合不常开机的机器
sudo apt install anacron

# 配置(/etc/anacrontab)
# 格式: 周期(天) 延迟(分钟) 任务ID 命令
1    5    cron.daily    run-parts --report /etc/cron.daily
7    10   cron.weekly   run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly

13.4 任务调度最佳实践

#!/bin/bash
# 定时任务模板脚本 /opt/scripts/task.sh

# 严格模式
set -euo pipefail

# 日志文件
LOGFILE="/var/log/mytask.log"
LOCKFILE="/tmp/mytask.lock"

# 防止重复执行
if [ -f "$LOCKFILE" ]; then
    echo "$(date): Task already running" >> "$LOGFILE"
    exit 1
fi
trap 'rm -f $LOCKFILE' EXIT
touch "$LOCKFILE"

# 记录开始时间
echo "$(date): Task started" >> "$LOGFILE"

# 执行任务
/opt/scripts/actual_task.sh 2>&1 | tee -a "$LOGFILE"

# 检查退出码
if [ $? -eq 0 ]; then
    echo "$(date): Task completed successfully" >> "$LOGFILE"
else
    echo "$(date): Task failed with exit code $?" >> "$LOGFILE"
    # 发送告警
    echo "Task failed on $(hostname)" | mail -s "Alert" admin@example.com
fi

14. 系统监控与日志

14.1 系统资源监控

# 安装监控工具
sudo apt install htop iotop iftop nload sysstat dstat nmon glances

# CPU和内存监控
htop                  # 交互式进程查看(推荐)
top                   # 基础进程查看
btop                  # 现代化监控工具(sudo snap install btop)
glances               # 综合监控(支持Web界面)

# 系统资源概览
vmstat 1 10           # 每秒刷新,共10次
mpstat -P ALL 1 5     # CPU使用率(每个核心)
sar -u 1 5            # CPU统计

# 磁盘IO监控
iostat -xz 1 5        # 磁盘IO详情
iotop -o              # 仅显示有IO的进程
dstat -d              # 磁盘统计

# 网络监控
iftop -i ens33        # 实时流量
nload ens33           # 带宽监控
ss -tuln              # 端口监听
watch -n 1 ss -s      # 实时连接统计
nethogs ens33         # 按进程显示网络使用

# 综合监控
dstat -cdngy          # CPU、磁盘、网络、系统综合
nmon                  # 交互式综合监控

14.2 日志管理

# 主要日志文件位置
/var/log/syslog           # 系统日志
/var/log/auth.log         # 认证日志(SSH等)
/var/log/kern.log         # 内核日志
/var/log/dpkg.log         # 包管理日志
/var/log/apt/             # APT日志
/var/log/nginx/           # Nginx日志
/var/log/mysql/           # MySQL日志
/var/log/redis/           # Redis日志
/var/log/ufw.log          # 防火墙日志

# 实时查看日志
tail -f /var/log/syslog
tail -f /var/log/auth.log | grep -i "ssh\|login\|fail"
multitail /var/log/syslog /var/log/auth.log  # 多文件同时查看

# 日志搜索
grep "error" /var/log/syslog
grep -r "failed" /var/log/
journalctl -g "error"    # 正则搜索

14.3 日志轮转

# 创建自定义日志轮转配置
sudo nano /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data www-data
    sharedscripts
    postrotate
        systemctl reload myapp > /dev/null 2>&1 || true
    endscript
}

# Nginx日志轮转
/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}
# 手动执行轮转
sudo logrotate -f /etc/logrotate.d/myapp

# 测试配置(不实际执行)
sudo logrotate -d /etc/logrotate.d/myapp

14.4 磁盘空间管理

# 查看磁盘使用
df -h
df -i                    # 查看inode使用率

# 查看目录大小
du -sh /var/log/*
du -sh /* | sort -rh | head -20
du -sh /var/lib/docker   # Docker占用
docker system df         # Docker详细占用

# 查找大文件
sudo find / -type f -size +100M -exec ls -lh {} \;
sudo find / -type f -size +1G -printf '%s %p\n' | sort -rn | head -20

# 查找并清理旧文件
find /var/log -name "*.gz" -mtime +30 -delete
find /tmp -type f -mtime +7 -delete

# 清理系统缓存
sudo apt clean
sudo apt autoclean
sudo apt autoremove

# 清理journal日志
sudo journalctl --vacuum-size=500M
sudo journalctl --vacuum-time=7d

# 清理Docker
docker system prune -a --volumes  # 清理所有未使用的

14.5 实时监控脚本

#!/bin/bash
# /opt/scripts/system_monitor.sh
# 系统健康检查脚本

echo "=== System Health Report ==="
echo "Time: $(date)"
echo "Hostname: $(hostname)"
echo ""

echo "--- Uptime & Load ---"
uptime

echo ""
echo "--- Memory ---"
free -h

echo ""
echo "--- Disk Usage ---"
df -h | grep -vE '^Filesystem|tmpfs|cdrom'

echo ""
echo "--- Top CPU Processes ---"
ps aux --sort=-%cpu | head -6

echo ""
echo "--- Top Memory Processes ---"
ps aux --sort=-%mem | head -6

echo ""
echo "--- Network Connections ---"
ss -s

echo ""
echo "--- Failed Services ---"
systemctl --failed --no-pager

echo ""
echo "--- Recent Auth Failures ---"
grep "Failed" /var/log/auth.log | tail -5

echo ""
echo "=== End Report ==="

15. 备份与灾难恢复

15.1 rsync增量备份

# 本地备份
rsync -avh --progress /source/ /backup/

# 远程备份(通过SSH)
rsync -avh --progress -e "ssh -p 2222" /source/ user@remote:/backup/

# 排除特定文件
rsync -avh --exclude='*.tmp' --exclude='.cache' --exclude='node_modules' \
  /source/ /backup/

# 使用排除文件
rsync -avh --exclude-from=/opt/scripts/rsync_exclude.txt /source/ /backup/

# 删除目标中源已删除的文件(镜像同步)
rsync -avh --delete /source/ /backup/

# 仅模拟不执行(dry-run)
rsync -avhn --delete /source/ /backup/

# 限制带宽
rsync -avh --bwlimit=10000 /source/ /backup/  # 10MB/s

# 增量备份(基于link-dest)
rsync -avh --delete --link-dest=/backup/latest /source/ /backup/$(date +%Y%m%d)
ln -sfn /backup/$(date +%Y%m%d) /backup/latest

15.2 完整系统备份

# 使用tar备份整个系统
sudo tar -czf /backup/system_$(date +%Y%m%d).tar.gz \
  --exclude=/proc \
  --exclude=/sys \
  --exclude=/dev \
  --exclude=/run \
  --exclude=/tmp \
  --exclude=/mnt \
  --exclude=/media \
  --exclude=/backup \
  --exclude=/lost+found \
  --exclude=/var/cache/apt \
  --exclude=/var/tmp \
  --exclude=/swapfile \
  /

# 恢复系统备份
cd /
sudo tar -xzf /backup/system_20260718.tar.gz
sudo grub-install /dev/sda
sudo update-grub

15.3 高级备份工具 (Borg Backup)

# 安装Borg
sudo apt install borgbackup

# 初始化仓库
borg init --encryption=repokey /backup/borg-repo
# 或远程仓库
borg init --encryption=repokey user@remote:/backup/borg-repo

# 创建备份
borg create --stats --progress \
  /backup/borg-repo::backup-{now:%Y-%m-%d_%H:%M} \
  /etc /home /var/www /opt \
  --exclude='*.tmp' \
  --exclude='/var/cache' \
  --exclude='/tmp'

# 列出备份
borg list /backup/borg-repo

# 查看备份内容
borg list /backup/borg-repo::backup-2026-07-18_02:00

# 恢复备份
borg extract /backup/borg-repo::backup-2026-07-18_02:00

# 清理旧备份(保留策略)
borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 \
  --stats /backup/borg-repo

# 验证备份完整性
borg check --verify-data /backup/borg-repo

15.4 自动化备份脚本

#!/bin/bash
# /opt/scripts/full_backup.sh

set -euo pipefail

BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
RETENTION_DAYS=7
REMOTE_USER="backup"
REMOTE_HOST="backup-server"
REMOTE_DIR="/backup/server1"
LOGFILE="/var/log/backup.log"

log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOGFILE"
}

log "===== Backup Started ====="
mkdir -p $BACKUP_DIR

# 1. 数据库备份
log "Backing up databases..."
mysqldump -u root -p$DB_PASS --all-databases --single-transaction \
  --routines --triggers --events | gzip > \
  $BACKUP_DIR/db_all_$DATE.sql.gz

# 2. 配置文件备份
log "Backing up configuration files..."
tar -czf $BACKUP_DIR/config_$DATE.tar.gz \
  /etc/nginx /etc/mysql /etc/ssh /etc/systemd \
  /etc/netplan /etc/fail2ban /etc/docker 2>/dev/null

# 3. 网站文件备份
log "Backing up web files..."
tar -czf $BACKUP_DIR/www_$DATE.tar.gz /var/www

# 4. 应用数据备份
log "Backing up application data..."
rsync -az --delete /opt/myapp/data/ $BACKUP_DIR/myapp_data/

# 5. 清理旧备份
log "Cleaning old backups..."
find $BACKUP_DIR -name "*.gz" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete

# 6. 同步到远程
log "Syncing to remote..."
rsync -az --delete -e "ssh -p 2222" \
  $BACKUP_DIR/ $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/

# 7. 验证备份
log "Verifying backups..."
if [ -f "$BACKUP_DIR/db_all_$DATE.sql.gz" ]; then
    gunzip -t $BACKUP_DIR/db_all_$DATE.sql.gz
    log "Database backup verified OK"
fi

log "===== Backup Completed Successfully ====="
log "Backup size: $(du -sh $BACKUP_DIR | cut -f1)"

16. 性能优化

16.1 内核参数优化

# /etc/sysctl.d/99-performance.conf 服务器性能优化

# 网络优化 - 高并发场景
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.core.optmem_max = 65535
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

# TCP优化
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_tw_buckets = 131072
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_slow_start_after_idle = 0

# IP优化
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.conf.all.arp_notify = 1

# 文件系统
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 8192

16.2 文件描述符限制

# 编辑limits配置
sudo nano /etc/security/limits.d/99-nofile.conf
# 文件描述符限制
*    soft    nofile    1048576
*    hard    nofile    1048576
root soft    nofile    1048576
root hard    nofile    1048576

# 进程数限制
*    soft    nproc     65535
*    hard    nproc     65535

# 内存锁定(用于数据库等需要锁定内存的应用)
*    soft    memlock   unlimited
*    hard    memlock   unlimited

# 核心转储
*    soft    core      0
*    hard    core      0
# 确保PAM模块加载
sudo nano /etc/pam.d/common-session
# session required pam_limits.so

# systemd服务也需要设置
# 在服务的[Service]段添加:
# LimitNOFILE=1048576
# LimitNPROC=65535

# 验证
ulimit -n
ulimit -u

16.3 CPU调度优化

# 查看当前CPU调度策略
cat /sys/block/sda/queue/scheduler

# 设置为deadline(适合数据库服务器)
echo deadline | sudo tee /sys/block/sda/queue/scheduler

# 或设置为none(NVMe SSD推荐)
echo none | sudo tee /sys/block/sda/queue/scheduler

# 持久化(GRUB参数)
sudo nano /etc/default/grub
# GRUB_CMDLINE_LINUX="elevator=deadline"
sudo update-grub

# CPU频率策略
sudo apt install cpufrequtils
echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils
sudo systemctl restart cpufrequtils

16.4 Swap优化

# 调整swappiness(降低swap使用倾向)
# 0 = 尽量不用swap, 100 = 积极使用swap
sudo sysctl vm.swappiness=10
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.d/99-performance.conf

# 调整vfs_cache_pressure(降低inode/dentry缓存回收)
sudo sysctl vm.vfs_cache_pressure=50
echo "vm.vfs_cache_pressure=50" | sudo tee -a /etc/sysctl.d/99-performance.conf

# 调整dirty pages(减少磁盘写入频率)
sudo sysctl vm.dirty_ratio=10
sudo sysctl vm.dirty_background_ratio=5
echo "vm.dirty_ratio=10" | sudo tee -a /etc/sysctl.d/99-performance.conf
echo "vm.dirty_background_ratio=5" | sudo tee -a /etc/sysctl.d/99-performance.conf

# 创建swap文件(如没有swap分区)
sudo fallocate -l 4G /swapfile
# 或使用dd
# sudo dd if=/dev/zero of=/swapfile bs=1G count=4
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

16.5 IO调度与存储优化

# 查看当前IO调度器
cat /sys/block/sda/queue/scheduler

# SSD优化:使用none/mq-deadline
echo mq-deadline | sudo tee /sys/block/nvme0n1/queue/scheduler

# 禁用SSD的旋转延迟计算
echo 0 | sudo tee /sys/block/nvme0n1/queue/rotational

# 优化队列深度
echo 1024 | sudo tee /sys/block/nvme0n1/queue/nr_requests

# 启用TRIM(SSD优化)
sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer

# 手动TRIM
sudo fstrim -v /

16.6 网络性能优化 (TCP BBR)

# 启用BBR拥塞控制算法(内核4.9+)
# 确认内核版本
uname -r

# 加载BBR模块
sudo modprobe tcp_bbr

# 启用BBR
echo "net.ipv4.tcp_congestion_control = bbr" | sudo tee -a /etc/sysctl.d/99-performance.conf
echo "net.core.default_qdisc = fq" | sudo tee -a /etc/sysctl.d/99-performance.conf
sudo sysctl --system

# 验证BBR已启用
sysctl net.ipv4.tcp_congestion_control
lsmod | grep bbr

17. 安全加固

17.1 安全审计工具

# Lynis - 系统安全审计
sudo apt install lynis
sudo lynis audit system                    # 完整审计
sudo lynis audit system --quick           # 快速审计
sudo lynis audit system --profile custom.prf  # 使用自定义配置

# 查看审计报告
cat /var/log/lynis.log
cat /var/log/lynis-report.dat

# Rootkit检测 - rkhunter
sudo apt install rkhunter
sudo rkhunter --update
sudo rkhunter --propupd                   # 更新属性数据库
sudo rkhunter --check --skip-keypress     # 检查

# chkrootkit
sudo apt install chkrootkit
sudo chkrootkit

# ClamAV - 病毒扫描
sudo apt install clamav clamav-daemon
sudo freshclam                            # 更新病毒库
sudo clamscan -r /var/www                 # 扫描目录
sudo clamscan --infected --remove -r /home

17.2 AppArmor配置

# 查看AppArmor状态
sudo aa-status

# 查看所有配置文件
ls /etc/apparmor.d/

# 查看某个程序的AppArmor状态
sudo aa-status /usr/sbin/nginx

# 设置为强制模式(执行策略)
sudo aa-enforce /etc/apparmor.d/usr.sbin.mysqld

# 设置为投诉模式(仅记录不阻止)
sudo aa-complain /etc/apparmor.d/usr.sbin.mysqld

# 禁用配置文件
sudo aa-disable /etc/apparmor.d/usr.sbin.mysqld

# 重新加载所有配置
sudo systemctl reload apparmor

# 查看审计日志中的AppArmor拒绝
sudo grep DENIED /var/log/syslog
sudo dmesg | grep -i apparmor

# 创建自定义配置文件
sudo nano /etc/apparmor.d/local/usr.sbin.myapp
# 添加自定义规则后:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.myapp

17.3 自动安全更新

# 安装unattended-upgrades
sudo apt install unattended-upgrades apt-listchanges

# 启用自动更新
sudo dpkg-reconfigure -plow unattended-upgrades

# 编辑配置
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
// 自动安装安全更新
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}";
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESMApps:${distro_codename}-apps-security";
    "${distro_id}:${distro_codename}-updates";
};

// 黑名单(不自动更新的包)
Unattended-Upgrade::Package-Blacklist {
    "nodejs";
    "docker-ce";
};

// 自动清理
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";

// 自动重启(如有内核更新)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-WithUsers "false";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";

// 邮件通知
Unattended-Upgrade::Mail "admin@example.com";
Unattended-Upgrade::MailReport "always";

17.4 入侵检测 (AIDE)

# 安装AIDE
sudo apt install aide aide-common

# 初始化数据库(首次使用,耗时较长)
sudo aideinit
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

# 检查系统完整性
sudo aide --check

# 更新数据库(在系统变更合法后)
sudo aide --update
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

# 配置定时检查
sudo nano /etc/cron.daily/aide
# 确保存在自动检查任务

# 自定义检查规则
sudo nano /etc/aide/aide.conf
# 添加自定义目录:
# /opt/myapp p+i+u+g+sha512

17.5 文件完整性监控

# Tripwire(企业级文件完整性监控)
sudo apt install tripwire
sudo tripwire-setup-keyfiles    # 设置密钥
sudo tripwire --init            # 初始化数据库
sudo tripwire --check           # 检查
sudo tripwire --update          # 更新策略

# OSSEC/Wazuh(开源HIDS)
# 适合大规模部署
# https://documentation.wazuh.com/

17.6 SSH密钥管理

# 定期轮换SSH密钥
# 1. 生成新密钥
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_2026 -C "admin@$(date +%Y)"

# 2. 将新公钥添加到服务器
ssh-copy-id -i ~/.ssh/id_ed25519_2026.pub -p 2222 user@server

# 3. 测试新密钥
ssh -i ~/.ssh/id_ed25519_2026 -p 2222 user@server

# 4. 移除旧密钥
ssh -p 2222 user@server "sed -i '/old_key_comment/d' ~/.ssh/authorized_keys"

# 5. 删除旧密钥文件
rm ~/.ssh/id_ed25519

# 查看authorized_keys中的密钥
ssh -p 2222 user@server "cat ~/.ssh/authorized_keys"

17.7 USB和外部设备安全

# 禁用USB存储
echo "blacklist usb-storage" | sudo tee /etc/modprobe.d/blacklist-usb.conf
sudo update-initramfs -u

# 或使用udev规则限制
sudo nano /etc/udev/rules.d/99-usb-restrict.rules
# 禁止USB存储设备
# ACTION=="add", SUBSYSTEM=="usb", ENV{ID_USB_INTERFACES}=="*:0806*:", RUN+="/bin/sh -c 'echo 0 > /sys$DEVPATH/authorized'"

# 禁止USB设备自动挂载
sudo systemctl disable udisks2

18. 故障排查

18.1 启动故障

# 查看启动日志
journalctl -b -1        # 上次启动日志
journalctl -b -p err    # 本次启动错误
journalctl -b -p emerg  # 紧急错误
systemd-analyze         # 启动时间分析
systemd-analyze blame   # 各服务启动耗时
systemd-analyze critical-chain  # 关键启动链

# 检查GRUB
sudo update-grub
sudo grub-install /dev/sda
sudo grub-mkconfig -o /boot/grub/grub.cfg

# 单用户模式/救援模式
# 重启时按e编辑GRUB,在linux行末添加:
# systemd.unit=rescue.target
# 或
# init=/bin/bash rw
# 然后Ctrl+X启动

# 从Live CD修复
# 1. 从Ubuntu Live CD启动
# 2. 挂载原系统
sudo mount /dev/sda3 /mnt
sudo mount /dev/sda1 /mnt/boot
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
# 3. chroot
sudo chroot /mnt
# 4. 修复
grub-install /dev/sda
update-grub
exit

18.2 网络故障排查

# 无法联网检查步骤
# 1. 测试本地回环
ping -c 4 127.0.0.1

# 2. 检查网卡状态
ip addr
ip link show
# 确认网卡是否UP,是否有IP

# 3. 检查路由
ip route
# 确认有默认网关

# 4. 测试网关连通
ping -c 4 192.168.1.1

# 5. 测试外网连通(IP方式)
ping -c 4 8.8.8.8

# 6. 测试DNS
ping -c 4 baidu.com
nslookup baidu.com
dig baidu.com
dig baidu.com @8.8.8.8

# 7. 查看DNS配置
cat /etc/resolv.conf
resolvectl status

# 重置网络
sudo netplan --debug apply
sudo systemctl restart systemd-networkd
sudo systemctl restart systemd-resolved

# 检查防火墙
sudo ufw status
sudo iptables -L -n
sudo nft list ruleset

18.3 服务故障排查

# 服务无法启动
sudo systemctl status service_name
journalctl -u service_name --since "1 hour ago" -n 100

# 检查配置文件语法
sudo nginx -t          # Nginx
sudo sshd -t           # SSH
sudo named-checkconf   # BIND DNS

# 端口被占用
sudo ss -tulnp | grep :80
sudo lsof -i :80
# 找到占用进程后
sudo kill -9 PID

# 权限问题
ls -la /path/to/file
namei -l /path/to/file    # 显示完整路径权限链
stat /path/to/file

# 磁盘满导致问题
df -h
df -i    # inode满也会导致无法创建文件
sudo du -sh /var/log/* | sort -rh | head -10

# OOM(内存不足)被kill
dmesg | grep -i "oom\|killed"
journalctl -k | grep -i oom

18.4 性能问题排查

# CPU占用高
top                      # 按1查看各核心
htop
mpstat -P ALL 1
pidstat -u 1 5           # 按进程查看CPU
# 找到高CPU进程后
strace -p PID            # 跟踪系统调用
perf top                 # 性能分析(需安装linux-tools)

# 内存不足
free -h
vmstat 1
cat /proc/meminfo
# 查看内存占用最大的进程
ps aux --sort=-%mem | head -10

# 磁盘IO高
iostat -xz 1
iotop -o
# 查看IO最大的进程
pidstat -d 1

# 负载高但CPU不高
# 可能是IO等待(iowait)
# 用iostat查看await和%util
# await > 10ms 说明IO延迟高
# %util > 80% 说明磁盘接近饱和

# 网络延迟
ping -c 100 8.8.8.8 | tail -1
mtr -r -c 100 8.8.8.8   # 报告模式
tcptraceroute 8.8.8.8 443

18.5 磁盘故障排查

# SMART磁盘健康检查
sudo apt install smartmontools
sudo smartctl -a /dev/sda           # 全部信息
sudo smartctl -H /dev/sda           # 快速健康检查
sudo smartctl -t short /dev/sda     # 短测试
sudo smartctl -t long /dev/sda      # 长测试
sudo smartctl -l selftest /dev/sda  # 测试结果

# 文件系统检查(必须umount)
sudo fsck /dev/sda3
sudo fsck.ext4 -f /dev/sda3        # 强制检查
sudo xfs_repair /dev/sda3          # XFS修复

# 查看磁盘错误
dmesg | grep -i "ext4\|xfs\|error\|corrupt"

# 坏块检测
sudo badblocks -v /dev/sda > bad_blocks.txt

19. 系统更新与维护

19.1 定期维护清单

任务频率命令/操作
系统更新每周sudo apt update && sudo apt upgrade
安全审计每月sudo lynis audit system
Rootkit扫描每周sudo rkhunter --check
日志清理每月journalctl --vacuum-time=30d
磁盘检查每周df -h && du -sh /var/*
备份验证每月恢复测试
密码更换90天passwd username
SSL证书续期80天certbot renew
SSH密钥轮换180天生成新密钥对
用户账户审查每月检查无用账户
性能基线比较每周对比监控指标
SMART检查每月smartctl -H /dev/sda

19.2 自动化维护脚本

#!/bin/bash
# /opt/scripts/maintenance.sh
set -euo pipefail

REPORT="/var/log/maintenance_$(date +%Y%m%d).log"

exec > >(tee -a "$REPORT") 2>&1
echo "===== System Maintenance $(date) ====="

# 1. 系统更新
echo "[1/8] Updating system..."
apt update -q
UPDATES=$(apt list --upgradable 2>/dev/null | wc -l)
echo "  Available updates: $UPDATES"
apt upgrade -y
apt autoremove -y

# 2. 安全扫描
echo "[2/8] Running security scan..."
rkhunter --check --skip-keypress || true

# 3. 清理日志
echo "[3/8] Cleaning logs..."
journalctl --vacuum-size=500M
find /var/log -name "*.gz" -mtime +30 -delete

# 4. 磁盘检查
echo "[4/8] Checking disk usage..."
df -h | grep -vE '^Filesystem|tmpfs|cdrom'
INODE_WARN=$(df -i | awk 'NR>1 && $5+0 > 80 {print $6 " (" $5 ")"}')
[ -n "$INODE_WARN" ] && echo "  WARNING: High inode usage: $INODE_WARN"

# 5. 检查失败服务
echo "[5/8] Checking failed services..."
FAILED=$(systemctl --failed --no-pager --no-legend | wc -l)
echo "  Failed services: $FAILED"
[ $FAILED -gt 0 ] && systemctl --failed

# 6. 检查磁盘健康
echo "[6/8] Checking disk health..."
for disk in $(lsblk -dn -o NAME | grep -E '^(sd|nvme)'); do
    HEALTH=$(smartctl -H /dev/$disk 2>/dev/null | grep "PASSED\|FAILED" || echo "N/A")
    echo "  /dev/$disk: $HEALTH"
done

# 7. 检查SSH密钥
echo "[7/8] Checking SSH authorized keys..."
for user_home in /home/*/; do
    user=$(basename $user_home)
    keys=$(wc -l < "$user_home/.ssh/authorized_keys" 2>/dev/null || echo "0")
    echo "  $user: $keys authorized keys"
done

# 8. 系统信息
echo "[8/8] System info..."
echo "  Uptime: $(uptime -p)"
echo "  Kernel: $(uname -r)"
echo "  Last reboot: $(who -b | awk '{print $3, $4}')"

echo "===== Maintenance Complete $(date) ====="

19.3 版本升级

# 升级前准备
sudo apt update && sudo apt full-upgrade -y
sudo apt autoremove -y
# 完整备份!

# 从22.04升级到24.04
sudo do-release-upgrade

# 检查可用升级
sudo do-release-upgrade -c

# 强制升级(如果提示没有新版本)
sudo do-release-upgrade -d

# 升级后检查
sudo apt update && sudo apt full-upgrade -y
sudo apt autoremove -y
sudo reboot

# 验证版本
lsb_release -a
cat /etc/os-release

⚠️ 重要:升级前请完整备份系统,并在测试环境先验证。生产环境建议在维护窗口期进行。

19.4 内核管理

# 查看已安装的内核
dpkg --list | grep linux-image

# 查看当前使用的内核
uname -r

# 清理旧内核(保留当前和上一个版本)
sudo apt autoremove --purge

# 更新GRUB
sudo update-grub

# 查看GRUB默认启动项
grep menuentry /boot/grub/grub.cfg

20. 常用命令速查

20.1 文件与目录

ls -lah              # 列出所有文件(含隐藏)
ls -lSr              # 按大小排序
tree -L 2            # 树形显示目录
cd /path             # 切换目录
cd -                 # 切换到上次的目录
pwd                  # 显示当前路径
cp -r src/ dest/     # 复制目录
cp -a src/ dest/     # 完整复制(保留属性)
cp --backup=numbered src dest  # 备份已存在的文件
mv old new           # 移动/重命名
rm -rf dir/          # 强制删除
rm -i file           # 交互式删除
find / -name "*.log" -mtime +7 -delete  # 查找并删除旧日志
find . -type f -size +100M    # 查找大文件
find . -perm 777     # 查找777权限文件
locate filename      # 快速查找(需updatedb)
updatedb             # 更新locate数据库
grep -rn "text" /dir # 递归搜索文本(显示行号)
grep -i "error" log  # 忽略大小写
grep -v "pattern"    # 反向匹配
chmod 755 file       # 修改权限
chmod -R u+x dir/    # 递归给owner添加执行权限
chown user:group file # 修改所有者
chown -R user:group dir/ # 递归修改
ln -s target link    # 创建软链接
ln target link       # 创建硬链接
tar -czf archive.tar.gz dir/   # 压缩gz
tar -cjf archive.tar.bz2 dir/  # 压缩bz2
tar -cJf archive.tar.xz dir/   # 压缩xz
tar -xzf archive.tar.gz        # 解压gz
tar -xjf archive.tar.bz2       # 解压bz2
tar -xJf archive.tar.xz        # 解压xz
tar -tvf archive.tar.gz        # 查看内容
zip -r archive.zip dir/        # ZIP压缩
unzip archive.zip              # ZIP解压

20.2 系统信息

uname -a             # 内核信息
uname -r             # 内核版本
lsb_release -a       # 发行版信息
cat /etc/os-release  # 系统信息
hostnamectl          # 主机名和系统信息
uptime               # 运行时间和负载
uptime -p            # 可读格式的运行时间
w                    # 当前登录用户
who                  # 登录用户详情
whoami               # 当前用户
id                   # 当前用户UID/GID
last                 # 登录历史
lastb                # 失败登录(需root)
lastlog              # 所有用户最后登录
free -h              # 内存使用
free -m              # 内存使用(MB)
df -h                # 磁盘使用
df -i                # inode使用
du -sh *             # 目录大小
du -sh /var/*        # 特定目录
lscpu                # CPU信息
lscpu | grep "Model name"  # CPU型号
nproc                # CPU核心数
lsblk                # 块设备
lsblk -f             # 文件系统信息
blkid                # 分区UUID
fdisk -l             # 磁盘信息(需root)
lsmod                # 内核模块
modinfo module       # 模块详情
dmesg | tail         # 内核日志
dmesg | grep -i error # 内核错误
lspci -v             # PCI设备
lsusb -v             # USB设备
dmidecode            # 硬件信息(需root)
dmidecode -t memory  # 内存信息
dmidecode -t bios    # BIOS信息
cat /proc/cpuinfo    # CPU详情
cat /proc/meminfo    # 内存详情
cat /proc/loadavg    # 负载
sensors              # 温度传感器(需lm-sensors)

20.3 网络命令

ip addr              # IP地址
ip addr show ens33   # 特定网卡
ip link              # 链路状态
ip route             # 路由表
ip neigh             # ARP表
ss -tuln             # 监听端口
ss -tulnp            # 监听端口+进程
ss -s                # 统计
ss -tn state established  # 已建立的TCP连接
ping -c 4 host       # 连通性测试
ping6 host           # IPv6测试
curl -I url          # HTTP头信息
curl -v url          # 详细请求信息
curl -X POST -d "data" url  # POST请求
wget url             # 下载文件
wget -c url          # 断点续传
wget -r -np url      # 递归下载
scp file user@host:/path  # 远程复制
scp -r dir/ user@host:/path
rsync -av src/ dest/ # 同步文件
sftp user@host       # SFTP交互
dig domain           # DNS查询
dig +short domain    # 简短DNS结果
dig MX domain        # 查询邮件记录
dig @8.8.8.8 domain  # 指定DNS服务器
host domain          # 简单DNS查询
nslookup domain      # DNS查询
traceroute host      # 路由追踪
tracepath host       # UDP追踪
mtr host             # 综合追踪
nmap -sV host        # 端口扫描+版本
nmap -sS host        # SYN扫描
nmap -A host         # 全扫描
nc -zv host port     # 端口连通测试
nc -l -p 8080        # 监听端口
openssl s_client -connect host:443  # 检查SSL证书

20.4 进程管理

ps aux               # 所有进程
ps aux | grep name   # 查找进程
ps -ef               # 另一种格式
ps -u username       # 特定用户的进程
ps --forest          # 树形显示
pgrep process_name   # 按名称查找PID
pstree               # 进程树
pstree -p            # 进程树+PID
kill PID             # 终止进程
kill -15 PID         # 优雅终止(SIGTERM)
kill -9 PID          # 强制终止(SIGKILL)
kill -HUP PID        # 重载配置
killall name         # 按名称终止
pkill pattern        # 按模式终止
xkill                # 点击窗口终止(图形界面)
top                  # 进程监控
htop                 # 增强进程监控(推荐)
bg                   # 后台运行
fg                   # 前台运行
jobs                 # 查看后台任务
nohup cmd &          # 后台运行(不挂断)
disown %1            # 从shell中脱离任务
nice -n 10 cmd       # 低优先级运行
renice 10 PID        # 调整优先级
ionice -c 2 cmd      # 调整IO优先级
strace -p PID        # 跟踪系统调用
lsof -p PID          # 进程打开的文件
lsof -i :port        # 端口相关进程
/proc/PID/           # 进程详情目录
/proc/PID/fd/        # 进程文件描述符
/proc/PID/status     # 进程状态

20.5 文本处理

cat file             # 显示文件
head -n 20 file      # 显示前20行
tail -n 20 file      # 显示后20行
tail -f file         # 实时跟踪
less file            # 分页查看
more file            # 分页查看(功能较少)
wc -l file           # 行数
wc -w file           # 单词数
wc -c file           # 字符数
sort file            # 排序
sort -n file         # 数字排序
sort -r file         # 倒序
sort -u file         # 去重排序
uniq file            # 去重(需先排序)
cut -d: -f1 /etc/passwd  # 按分隔符截取
awk '{print $1}' file    # AWK打印第一列
awk -F: '{print $1}' /etc/passwd
sed 's/old/new/g' file   # 替换文本
sed -i 's/old/new/g' file  # 直接修改文件
sed -n '5,10p' file      # 打印5-10行
grep -c "pattern" file   # 匹配行数
diff file1 file2         # 比较文件
colordiff file1 file2    # 彩色比较
comm file1 file2         # 比较共同行
tee file                 # 同时输出到屏幕和文件
xargs                    # 将输入转为命令参数
echo "file1\nfile2" | xargs rm  # 批量删除
seq 1 10                 # 生成序列
yes "text" | head -5     # 重复输出

21. 磁盘管理 (LVM/ZFS/Btrfs)

21.1 LVM (Logical Volume Manager)

# 查看LVM状态
sudo pvs               # 物理卷
sudo vgs               # 卷组
sudo lvs               # 逻辑卷
sudo pvdisplay
sudo vgdisplay
sudo lvdisplay

# 创建物理卷
sudo pvcreate /dev/sdb
sudo pvcreate /dev/sdc

# 创建卷组
sudo vgcreate vg_data /dev/sdb /dev/sdc

# 创建逻辑卷
sudo lvcreate -L 100G -n lv_app vg_data
sudo lvcreate -l 100%FREE -n lv_data vg_data  # 使用全部剩余空间
sudo lvcreate -l 50%VG -n lv_half vg_data     # 使用50%空间

# 格式化并挂载
sudo mkfs.ext4 /dev/vg_data/lv_app
sudo mkfs.xfs /dev/vg_data/lv_data
sudo mkdir -p /app /data
sudo mount /dev/vg_data/lv_app /app
sudo mount /dev/vg_data/lv_data /data

# 添加到fstab
# /dev/vg_data/lv_app /app ext4 defaults 0 2
# /dev/vg_data/lv_data /data xfs defaults 0 2

21.2 LVM扩容

# 添加新磁盘到VG
sudo pvcreate /dev/sdd
sudo vgextend vg_data /dev/sdd

# 扩展逻辑卷
sudo lvextend -L +50G /dev/vg_data/lv_app
# 或扩展到指定大小
sudo lvextend -L 200G /dev/vg_data/lv_app
# 或使用全部剩余空间
sudo lvextend -l +100%FREE /dev/vg_data/lv_data

# 扩展文件系统
# ext4
sudo resize2fs /dev/vg_data/lv_app
# xfs
sudo xfs_growfs /data

21.3 LVM快照

# 创建快照(用于备份)
sudo lvcreate -L 10G -s -n snap_app /dev/vg_data/lv_app

# 挂载快照
sudo mount -o ro /dev/vg_data/snap_app /mnt/snap

# 备份数据
tar -czf /backup/app_$(date +%Y%m%d).tar.gz /mnt/snap

# 删除快照
sudo umount /mnt/snap
sudo lvremove /dev/vg_data/snap_app

21.4 ZFS文件系统

# 安装ZFS
sudo apt install zfsutils-linux

# 创建ZFS池
sudo zpool create tank /dev/sdb /dev/sdc     # RAID0
sudo zpool create tank mirror /dev/sdb /dev/sdc  # RAID1镜像
sudo zpool create tank raidz /dev/sdb /dev/sdc /dev/sdd  # RAID5

# 查看池状态
zpool status
zpool list
zfs list

# 创建数据集
sudo zfs create tank/data
sudo zfs create tank/backup
sudo zfs create -o mountpoint=/home tank/home

# 设置属性
sudo zfs set compression=lz4 tank/data
sudo zfs set atime=off tank/data
sudo zfs set quota=100G tank/data

# 快照
sudo zfs snapshot tank/data@20260718
sudo zfs list -t snapshot

# 回滚快照
sudo zfs rollback tank/data@20260718

# 克隆快照
sudo zfs clone tank/data@20260718 tank/data_clone

# 发送/接收(远程备份)
zfs send tank/data@20260718 | ssh user@remote "zfs receive backup/data"

# 数据校验(Scrub)
sudo zpool scrub tank
zpool status tank

21.5 Btrfs文件系统

# 安装Btrfs工具
sudo apt install btrfs-progs

# 创建Btrfs文件系统
sudo mkfs.btrfs /dev/sdb

# 多设备创建
sudo mkfs.btrfs -d raid1 /dev/sdb /dev/sdc

# 挂载
sudo mount /dev/sdb /data

# 创建子卷
sudo btrfs subvolume create /data/subvol1
sudo mount -o subvol=subvol1 /dev/sdb /mnt/sub1

# 快照
sudo btrfs subvolume snapshot /data /data/snap_20260718

# 只读快照
sudo btrfs subvolume snapshot -r /data /data/ro_snap

# 删除快照
sudo btrfs subvolume delete /data/snap_20260718

# 数据校验(Scrub)
sudo btrfs scrub start /data
sudo btrfs scrub status /data

# 压缩
sudo mount -o compress=zstd /dev/sdb /data

# 文件系统检查
sudo btrfs check /dev/sdb

22. 内核管理

22.1 内核版本管理

# 查看当前内核版本
uname -r
uname -a

# 查看已安装的内核
dpkg --list | grep linux-image
dpkg --list | grep linux-headers

# 安装特定内核
sudo apt install linux-image-6.8.0-40-generic
sudo apt install linux-headers-6.8.0-40-generic

# 安装HWE(硬件启用)内核
sudo apt install linux-generic-hwe-24.04

# 安装Low Latency内核(实时应用)
sudo apt install linux-lowlatency

# 删除旧内核(保留当前+一个旧版)
sudo apt autoremove --purge

22.2 内核模块管理

# 查看已加载模块
lsmod
lsmod | grep driver_name

# 加载模块
sudo modprobe module_name
sudo modprobe module_name param=value

# 卸载模块
sudo modprobe -r module_name
sudo rmmod module_name

# 查看模块信息
modinfo module_name

# 禁止自动加载模块
echo "blacklist module_name" | sudo tee /etc/modprobe.d/blacklist-module.conf

# 永久加载模块(开机自动加载)
echo "module_name" | sudo tee /etc/modules-load.d/module.conf

# 更新initramfs
sudo update-initramfs -u
sudo update-initramfs -u -k all

22.3 内核参数管理

# 查看内核参数
sysctl -a | grep parameter
sysctl net.ipv4.ip_forward

# 临时修改
sudo sysctl -w net.ipv4.ip_forward=1

# 持久化修改
echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-custom.conf
sudo sysctl --system

# GRUB内核参数
sudo nano /etc/default/grub
# GRUB_CMDLINE_LINUX="quiet splash"
# 常用参数:
# nomodeset - 禁用GPU模式设置
# acpi=off - 禁用ACPI
# processor.max_cstate=1 - 限制CPU C状态
# intel_iommu=on - 启用IOMMU
# iommu=pt - IOMMU直通模式

sudo update-grub

22.4 内核编译(高级)

# 安装编译工具
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev bc

# 下载内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.8.tar.xz
tar -xf linux-6.8.tar.xz
cd linux-6.8

# 复制当前内核配置
cp /boot/config-$(uname -r) .config

# 修改配置
make menuconfig    # 图形界面配置
make olddefconfig  # 使用默认值更新配置

# 编译
make -j$(nproc)

# 安装模块和内核
sudo make modules_install
sudo make install

# 更新GRUB
sudo update-grub
sudo reboot

23. 高级网络技术

23.1 网卡绑定 (Bonding)

# 网卡绑定提供冗余和负载均衡
# 编辑netplan配置
sudo nano /etc/netplan/02-bond.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
    ens34:
      dhcp4: no
  bonds:
    bond0:
      interfaces:
        - ens33
        - ens34
      addresses:
        - 192.168.1.100/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8]
      parameters:
        mode: 802.3ad        # LACP模式(推荐)
        # 其他模式:
        # balance-rr (0) - 轮询
        # active-backup (1) - 主备
        # balance-xor (2) - XOR哈希
        # broadcast (3) - 广播
        # 802.3ad (4) - LACP(需交换机支持)
        # balance-tlb (5) - 自适应发送
        # balance-alb (6) - 自适应收发
        lacp-rate: fast
        mii-monitor-interval: 100
        transmit-hash-policy: layer3+4
# 应用配置
sudo netplan apply

# 查看绑定状态
cat /proc/net/bonding/bond0

23.2 VLAN配置

# 安装VLAN支持
sudo apt install vlan
sudo modprobe 8021q
echo "8021q" | sudo tee /etc/modules-load.d/vlan.conf

# Netplan VLAN配置
sudo nano /etc/netplan/03-vlan.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
  vlans:
    vlan10:
      id: 10
      link: ens33
      addresses:
        - 192.168.10.100/24
    vlan20:
      id: 20
      link: ens33
      addresses:
        - 192.168.20.100/24

23.3 策略路由

# 多ISP策略路由
# 创建路由表
echo "100 isp1" | sudo tee -a /etc/iproute2/rt_tables
echo "200 isp2" | sudo tee -a /etc/iproute2/rt_tables

# 配置路由表1(ISP1)
sudo ip route add default via 192.168.1.1 dev ens33 table isp1
sudo ip route add 192.168.1.0/24 dev ens33 table isp1

# 配置路由表2(ISP2)
sudo ip route add default via 10.0.0.1 dev ens34 table isp2
sudo ip route add 10.0.0.0/24 dev ens34 table isp2

# 根据源IP选择路由表
sudo ip rule add from 192.168.1.100 table isp1
sudo ip rule add from 10.0.0.100 table isp2

# 持久化
# 创建脚本 /etc/networkd-dispatcher/routable.d/policy-routing

23.4 流量整形 (TC)

# 安装tc工具
sudo apt install iproute2

# 限制ens33的出方向带宽为100Mbps
sudo tc qdisc add dev ens33 root tbf rate 100mbit burst 32kbit latency 400ms

# 查看规则
sudo tc qdisc show dev ens33

# 删除规则
sudo tc qdisc del dev ens33 root

# 基于IP的限速
sudo tc qdisc add dev ens33 root handle 1: htb default 10
sudo tc class add dev ens33 parent 1: classid 1:1 htb rate 100mbit
sudo tc class add dev ens33 parent 1:1 classid 1:10 htb rate 50mbit ceil 100mbit
sudo tc class add dev ens33 parent 1:1 classid 1:20 htb rate 50mbit ceil 100mbit
sudo tc filter add dev ens33 protocol ip parent 1:0 prio 1 u32 \
  match ip src 192.168.1.100 flowid 1:10

24. 虚拟化 (KVM/LXC)

24.1 KVM安装

# 检查CPU虚拟化支持
egrep -c '(vmx|svm)' /proc/cpuinfo
# 结果>0表示支持

# 安装KVM及相关工具
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients \
  bridge-utils virt-manager cloud-image-utils

# 将用户加入libvirt和kvm组
sudo usermod -aG libvirt,kvm $USER

# 启动libvirtd
sudo systemctl enable --now libvirtd

# 验证安装
virsh list --all
sudo virsh nodeinfo

24.2 KVM网络桥接

# 配置网桥(netplan)
sudo nano /etc/netplan/01-kvm-bridge.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
  bridges:
    br0:
      interfaces:
        - ens33
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8]
sudo netplan apply

# 定义KVM使用的网络
sudo virsh net-define /dev/stdin << EOF

  br0
  
  

EOF

sudo virsh net-start br0
sudo virsh net-autostart br0

24.3 创建KVM虚拟机

# 使用virt-install创建虚拟机
sudo virt-install \
  --name=ubuntu-vm1 \
  --ram=4096 \
  --vcpus=2 \
  --disk path=/var/lib/libvirt/images/ubuntu-vm1.qcow2,size=50,bus=virtio \
  --cdrom=/path/to/ubuntu-24.04-live-server-amd64.iso \
  --os-variant=ubuntu24.04 \
  --network bridge=br0,model=virtio \
  --graphics spice,listen=0.0.0.0 \
  --noautoconsole

# 使用cloud-init快速创建
# 下载cloud镜像
wget https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img

# 创建cloud-init配置
cat > user-data << 'EOF'
#cloud-config
users:
  - name: admin
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
      - ssh-ed25519 AAAA...
EOF

# 创建seed镜像
cloud-localds seed.img user-data

# 创建并启动
sudo virt-install \
  --name=cloud-vm \
  --ram=2048 --vcpus=2 \
  --disk path=ubuntu-24.04-server-cloudimg-amd64.img,device=disk \
  --disk path=seed.img,device=cdrom \
  --os-variant=ubuntu24.04 \
  --network bridge=br0 \
  --import --noautoconsole

24.4 KVM虚拟机管理

# 虚拟机管理命令
virsh list --all             # 列出所有虚拟机
virsh start vm_name          # 启动
virsh shutdown vm_name       # 优雅关机
virsh destroy vm_name        # 强制关机
virsh reboot vm_name         # 重启
virsh suspend vm_name        # 暂停
virsh resume vm_name         # 恢复

# 查看虚拟机信息
virsh dominfo vm_name
virsh domblklist vm_name
virsh domiflist vm_name

# 快照管理
virsh snapshot-create-as vm_name snap1
virsh snapshot-list vm_name
virsh snapshot-revert vm_name snap1
virsh snapshot-delete vm_name snap1

# 克隆虚拟机
virt-clone --original vm1 --name vm2 \
  --file /var/lib/libvirt/images/vm2.qcow2

# 连接控制台
virsh console vm_name
# 或通过SSH
ssh admin@vm_ip

24.5 LXC/LXD容器

# 安装LXD
sudo snap install lxd --channel=5.21/stable

# 初始化LXD
sudo lxd init
# 选择默认值,设置存储池大小等

# 容器操作
lxc launch ubuntu:24.04 mycontainer
lxc list
lxc exec mycontainer -- /bin/bash
lxc stop mycontainer
lxc start mycontainer
lxc delete mycontainer

# 资源配置
lxc config set mycontainer limits.memory 2GB
lxc config set mycontainer limits.cpu 2

# 网络
lxc network list
lxc network create mybridge
lxc network attach mybridge mycontainer

# 存储
lxc storage list
lxc storage create mypool zfs source=/dev/sdb

# 快照
lxc snapshot mycontainer snap1
lxc restore mycontainer snap1

# 导入/导出
lxc export mycontainer backup.tar.gz
lxc import backup.tar.gz

25. Kubernetes部署

25.1 安装kubeadm

# 所有节点都需要执行

# 禁用swap
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab

# 加载内核模块
cat << EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 内核参数
cat << EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system

# 安装容器运行时(containerd)
sudo apt install containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
# 修改SystemdCgroup = true
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd

# 安装kubeadm、kubelet、kubectl
sudo apt install apt-transport-https ca-certificates curl gpg

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | \
  sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | \
  sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt update
sudo apt install kubeadm kubelet kubectl
sudo apt-mark hold kubeadm kubelet kubectl

25.2 初始化集群

# Master节点初始化集群
sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=192.168.1.100

# 配置kubectl
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 安装网络插件(Calico)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml

# 或安装Flannel
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

# Worker节点加入(使用kubeadm init输出的命令)
sudo kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx

25.3 Kubernetes基本操作

# 查看节点
kubectl get nodes
kubectl describe node node1

# 部署应用
kubectl create deployment nginx --image=nginx:latest --replicas=3
kubectl get deployments
kubectl get pods
kubectl get pods -o wide

# 暴露服务
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get services

# 扩缩容
kubectl scale deployment nginx --replicas=5

# 更新镜像
kubectl set image deployment/nginx nginx=nginx:1.26

# 回滚
kubectl rollout undo deployment/nginx
kubectl rollout status deployment/nginx

# 删除
kubectl delete deployment nginx
kubectl delete service nginx

25.4 Helm包管理

# 安装Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# 搜索Chart
helm search repo nginx
helm search hub wordpress

# 安装应用
helm install my-nginx bitnami/nginx
helm install my-wordpress bitnami/wordpress --set wordpressPassword=pass123

# 管理
helm list
helm upgrade my-nginx bitnami/nginx
helm rollback my-nginx
helm uninstall my-nginx

26. VPN搭建

26.1 WireGuard VPN

# 安装WireGuard
sudo apt install wireguard

# 生成密钥对(服务器端)
cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key

# 生成密钥对(客户端)
wg genkey | tee client_private.key | wg pubkey > client_public.key

# 服务器配置
sudo nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey = 
Address = 10.0.0.1/24
ListenPort = 51820
# NAT转发
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens33 -j MASQUERADE

[Peer]
# Client 1
PublicKey = 
AllowedIPs = 10.0.0.2/32

[Peer]
# Client 2
PublicKey = 
AllowedIPs = 10.0.0.3/32
# 启用IP转发
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system

# 启动WireGuard
sudo systemctl enable --now wg-quick@wg0

# 查看状态
sudo wg show

26.2 WireGuard客户端配置

# 客户端配置(wg0.conf)
[Interface]
PrivateKey = 
Address = 10.0.0.2/24
DNS = 8.8.8.8

[Peer]
PublicKey = 
Endpoint = server_ip:51820
AllowedIPs = 0.0.0.0/0, ::/0   # 全部流量走VPN
PersistentKeepalive = 25

26.3 OpenVPN

# 安装OpenVPN和Easy-RSA
sudo apt install openvpn easy-rsa

# 初始化PKI
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey --secret pki/ta.key

# 生成客户端证书
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1

# 服务器配置
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gunzip /etc/openvpn/server.conf.gz
# 编辑配置文件指向证书路径

# 启动服务
sudo systemctl enable --now openvpn@server

27. DNS服务器

27.1 BIND9 DNS服务器

# 安装BIND9
sudo apt install bind9 bind9utils bind9-doc dnsutils

# 主配置文件
sudo nano /etc/bind/named.conf.options
options {
    directory "/var/cache/bind";
    recursion yes;
    allow-recursion { localhost; 192.168.1.0/24; };
    listen-on { any; };
    listen-on-v6 { any; };

    # 转发器
    forwarders {
        8.8.8.8;
        8.8.4.4;
    };

    # DNSSEC
    dnssec-validation auto;

    # 安全
    allow-query { any; };
    allow-transfer { none; };
    version "Not disclosed";
};

27.2 正向解析区域

# 添加区域配置
sudo nano /etc/bind/named.conf.local
zone "example.com" {
    type master;
    file "/etc/bind/zones/db.example.com";
    allow-update { none; };
};

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1";
};
# 创建区域文件
sudo mkdir -p /etc/bind/zones
sudo nano /etc/bind/zones/db.example.com
$TTL 86400
@   IN  SOA ns1.example.com. admin.example.com. (
        2026071801  ; Serial
        3600        ; Refresh (1小时)
        1800        ; Retry (30分钟)
        604800      ; Expire (1周)
        86400       ; Minimum TTL (1天)
)

; NS记录
@       IN  NS  ns1.example.com.
@       IN  NS  ns2.example.com.

; A记录
@       IN  A   192.168.1.100
ns1     IN  A   192.168.1.100
ns2     IN  A   192.168.1.101
www     IN  A   192.168.1.100
mail    IN  A   192.168.1.102
api     IN  A   192.168.1.103
db      IN  A   192.168.1.104

; CNAME记录
ftp     IN  CNAME   www
blog    IN  CNAME   www

; MX记录
@       IN  MX  10  mail.example.com.

; TXT记录
@       IN  TXT "v=spf1 mx ~all"

; AAAA记录(IPv6)
@       IN  AAAA    2001:db8::100

27.3 反向解析区域

# 反向解析文件
sudo nano /etc/bind/zones/db.192.168.1
$TTL 86400
@   IN  SOA ns1.example.com. admin.example.com. (
        2026071801
        3600
        1800
        604800
        86400
)

@       IN  NS  ns1.example.com.
@       IN  NS  ns2.example.com.

100     IN  PTR ns1.example.com.
100     IN  PTR www.example.com.
101     IN  PTR ns2.example.com.
102     IN  PTR mail.example.com.
103     IN  PTR api.example.com.
104     IN  PTR db.example.com.
# 验证配置
sudo named-checkconf
sudo named-checkzone example.com /etc/bind/zones/db.example.com

# 重启服务
sudo systemctl restart bind9

# 测试
dig example.com @localhost
dig -x 192.168.1.100 @localhost
nslookup example.com 127.0.0.1

27.4 Unbound递归DNS

# 安装Unbound
sudo apt install unbound

# 配置
sudo nano /etc/unbound/unbound.conf.d/myconf.conf
server:
    interface: 0.0.0.0
    access-control: 192.168.1.0/24 allow
    access-control: 127.0.0.0/8 allow

    # DNSSEC验证
    auto-trust-anchor-file: "/var/lib/unbound/root.key"

    # 性能
    num-threads: 4
    msg-cache-slabs: 8
    rrset-cache-slabs: 8
    infra-cache-slabs: 8
    key-cache-slabs: 8
    rrset-cache-size: 256m
    msg-cache-size: 128m

    # 隐私
    hide-identity: yes
    hide-version: yes

    # 转发到上游(可选)
    # forward-zone:
    #     name: "."
    #     forward-addr: 8.8.8.8
    #     forward-addr: 1.1.1.1
sudo systemctl enable --now unbound
sudo resolvectl dns ens33 127.0.0.1

28. 高可用集群

28.1 Keepalived (VIP高可用)

# 安装Keepalived
sudo apt install keepalived

# Master节点配置
sudo nano /etc/keepalived/keepalived.conf
vrrp_script check_nginx {
    script "/usr/bin/pgrep -x nginx"
    interval 2
    weight -20
    fall 3
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass secret123
    }

    virtual_ipaddress {
        192.168.1.200/24
    }

    track_script {
        check_nginx
    }

    notify_master "/opt/scripts/notify.sh master"
    notify_backup "/opt/scripts/notify.sh backup"
}
# Backup节点配置(主要区别)
# state BACKUP
# priority 90

sudo systemctl enable --now keepalived

# 验证VIP
ip addr show ens33
# 查看是否有 192.168.1.200

28.2 HAProxy负载均衡

# 安装HAProxy
sudo apt install haproxy

# 配置
sudo nano /etc/haproxy/haproxy.cfg
global
    log /dev/log local0
    log /dev/log local1 notice
    maxconn 4096
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    retries 3
    option redispatch

frontend http_front
    bind *:80
    bind *:443 ssl crt /etc/haproxy/certs/combined.pem
    default_backend http_back
    # HTTP重定向到HTTPS
    redirect scheme https if !{ ssl_fc }

backend http_back
    balance roundrobin
    option httpchk GET /health
    http-check expect status 200
    server web1 192.168.1.101:80 check weight 1 maxconn 100
    server web2 192.168.1.102:80 check weight 1 maxconn 100
    server web3 192.168.1.103:80 check weight 1 maxconn 100 backup

# 统计页面
listen stats
    bind *:8404
    stats enable
    stats uri /stats
    stats realm HAProxy\ Statistics
    stats auth admin:password
sudo systemctl enable --now haproxy

28.3 Pacemaker/Corosync集群

# 安装集群组件
sudo apt install pacemaker corosync pcs

# 设置集群用户密码
sudo passwd hacluster

# 启动服务
sudo systemctl enable --now pcsd corosync pacemaker

# 认证节点
sudo pcs host auth node1 node2 -u hacluster

# 创建集群
sudo pcs cluster setup mycluster node1 node2

# 启动集群
sudo pcs cluster start --all
sudo pcs cluster enable --all

# 配置资源
sudo pcs resource create VirtualIP ocf:heartbeat:IPaddr2 \
  ip=192.168.1.200 cidr_netmask=24 op monitor interval=30s

sudo pcs resource create WebServer systemd:nginx \
  op monitor interval=30s

# 资源约束(确保VIP和Web在同一节点)
sudo pcs constraint colocation add WebServer VirtualIP INFINITY
sudo pcs constraint order VirtualIP then WebServer

# 查看状态
sudo pcs status
sudo crm_mon -1

29. 高级存储方案

29.1 Ceph分布式存储

# Ceph部署(使用cephadm)

# 安装cephadm
curl --silent --remote-name --location \
  https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm
chmod +x cephadm
sudo ./cephadm add-repo --release quincy
sudo ./cephadm install ceph-common

# 创建集群
sudo cephadm bootstrap --mon-ip 192.168.1.100

# 添加节点
sudo ceph orch host add node2 192.168.1.101
sudo ceph orch host add node3 192.168.1.102

# 添加OSD
sudo ceph orch daemon add osd node1:/dev/sdb
sudo ceph orch daemon add osd node2:/dev/sdb
sudo ceph orch daemon add osd node3:/dev/sdb

# 创建存储池
sudo ceph osd pool create mypool 128 128
sudo ceph osd pool set mypool size 3
sudo ceph osd pool set mypool min_size 2

# 创建文件系统(CephFS)
sudo ceph fs volume create myfs
sudo ceph fs subvolume create myfs mysubvol

# 创建块设备(RBD)
sudo rbd create mypool/myimage --size 10240  # 10GB
sudo rbd map mypool/myimage
sudo mkfs.ext4 /dev/rbd0
sudo mount /dev/rbd0 /mnt/rbd

# 创建对象存储(RGW)
sudo ceph orch apply rgw myrgw

# 查看集群状态
sudo ceph status
sudo ceph osd tree

29.2 GlusterFS分布式文件系统

# 安装GlusterFS(所有节点)
sudo apt install glusterfs-server

# 启动服务
sudo systemctl enable --now glusterd

# 在node1上添加peer
sudo gluster peer probe node2
sudo gluster peer probe node3
sudo gluster peer status

# 创建brick目录(所有节点)
sudo mkdir -p /data/glusterfs/myvolume/brick1

# 创建卷
sudo gluster volume create myvolume replica 3 \
  node1:/data/glusterfs/myvolume/brick1 \
  node2:/data/glusterfs/myvolume/brick1 \
  node3:/data/glusterfs/myvolume/brick1

# 启动卷
sudo gluster volume start myvolume

# 查看卷信息
sudo gluster volume info
sudo gluster volume status

# 客户端挂载
sudo apt install glusterfs-client
sudo mount -t glusterfs node1:/myvolume /mnt/gluster

# fstab持久化
# node1:/myvolume /mnt/gluster glusterfs defaults,_netdev 0 0

29.3 iSCSI存储

# iSCSI Target(服务端)
sudo apt install targetcli-fb
sudo systemctl enable --now target

# 配置target
sudo targetcli
/> backstores/fileio create name=lun0 dev=/dev/vg_data/lv_iscsi size=100G
/> iscsi/ create iqn.2026-07.com.example:storage
/> iscsi/iqn.2026-07.com.example:storage/tpg1/luns create /backstores/fileio/lun0
/> iscsi/iqn.2026-07.com.example:storage/tpg1/portals create 192.168.1.100
/> iscsi/iqn.2026-07.com.example:storage/tpg1 set attribute authentication=0
/> saveconfig
/> exit

# iSCSI Initiator(客户端)
sudo apt install open-iscsi

# 发现目标
sudo iscsiadm -m discovery -t sendtargets -p 192.168.1.100

# 登录
sudo iscsiadm -m node --login

# 查看磁盘
lsblk
# 新磁盘会自动出现

# 格式化和挂载
sudo mkfs.ext4 /dev/sdb
sudo mount /dev/sdb /mnt/iscsi

30. 自动化运维 (Ansible)

30.1 安装Ansible

# 安装Ansible
sudo apt install ansible

# 或使用pip安装最新版
sudo apt install python3-pip
pip3 install ansible --break-system-packages

# 验证安装
ansible --version

# 配置inventory
sudo mkdir -p /etc/ansible
sudo nano /etc/ansible/hosts
[webservers]
web1 ansible_host=192.168.1.101
web2 ansible_host=192.168.1.102

[dbservers]
db1 ansible_host=192.168.1.103
db2 ansible_host=192.168.1.104

[all:vars]
ansible_user=admin
ansible_ssh_private_key_file=~/.ssh/id_ed25519
ansible_python_interpreter=/usr/bin/python3

30.2 Ansible Ad-Hoc命令

# Ping所有主机
ansible all -m ping

# 在webservers组执行命令
ansible webservers -a "uptime"
ansible webservers -a "df -h"

# 使用sudo
ansible all -m shell -a "apt update" --become

# 复制文件
ansible webservers -m copy -a "src=/local/file dest=/remote/file"

# 安装软件包
ansible webservers -m apt -a "name=nginx state=present" --become

# 管理服务
ansible webservers -m service -a "name=nginx state=started enabled=yes" --become

# 获取facts
ansible all -m setup

30.3 Ansible Playbook

# 创建playbook
nano ~/playbooks/webserver.yml
---
- name: Configure Web Servers
  hosts: webservers
  become: yes
  vars:
    nginx_version: "1.25"
    document_root: /var/www/html

  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes
        cache_valid_time: 3600

    - name: Install Nginx
      apt:
        name: nginx
        state: present

    - name: Configure Nginx
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: Restart Nginx

    - name: Deploy website
      copy:
        src: files/index.html
        dest: "{{ document_root }}/index.html"

    - name: Enable firewall rules
      ufw:
        rule: allow
        port: "{{ item }}"
        proto: tcp
      loop:
        - "80"
        - "443"

    - name: Ensure Nginx is running
      service:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: Restart Nginx
      service:
        name: nginx
        state: restarted
# 执行playbook
ansible-playbook ~/playbooks/webserver.yml

# 检查语法
ansible-playbook ~/playbooks/webserver.yml --syntax-check

# 模拟执行(dry-run)
ansible-playbook ~/playbooks/webserver.yml --check

# 详细输出
ansible-playbook ~/playbooks/webserver.yml -v

30.4 Ansible Roles

# 创建Role结构
ansible-galaxy init myrole

# 目录结构
# myrole/
# ├── defaults/main.yml    # 默认变量
# ├── handlers/main.yml    # 处理器
# ├── meta/main.yml        # 元数据
# ├── tasks/main.yml       # 任务
# ├── templates/           # Jinja2模板
# ├── files/               # 静态文件
# └── vars/main.yml        # 变量
# 使用Role的playbook
---
- hosts: webservers
  become: yes
  roles:
    - common
    - nginx
    - php
    - { role: mysql, when: "'dbservers' in group_names" }

31. 高级监控系统

31.1 Prometheus + Grafana

# 安装Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.53.0/prometheus-2.53.0.linux-amd64.tar.gz
tar xzf prometheus-2.53.0.linux-amd64.tar.gz
sudo mv prometheus-2.53.0.linux-amd64 /opt/prometheus

# 创建系统服务
sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir /etc/prometheus /var/lib/prometheus
sudo cp /opt/prometheus/prometheus /opt/prometheus/promtool /usr/local/bin/
sudo cp -r /opt/prometheus/consoles /opt/prometheus/console_libraries /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
# Prometheus配置
sudo nano /etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']

rule_files:
  - "alert_rules.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']

  - job_name: 'nginx'
    static_configs:
      - targets: ['localhost:9113']

  - job_name: 'mysql'
    static_configs:
      - targets: ['localhost:9104']
# Node Exporter(系统指标收集)
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.1/node_exporter-1.8.1.linux-amd64.tar.gz
tar xzf node_exporter-1.8.1.linux-amd64.tar.gz
sudo mv node_exporter-1.8.1.linux-amd64/node_exporter /usr/local/bin/

# 创建systemd服务
sudo nano /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
  --collector.systemd \
  --collector.processes

[Install]
WantedBy=multi-user.target
# 安装Grafana
sudo apt install apt-transport-https software-properties-common
wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" | \
  sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt install grafana
sudo systemctl enable --now grafana-server
# 访问 http://server:3000  默认 admin/admin

31.2 告警配置

# Alertmanager安装
wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz
tar xzf alertmanager-0.27.0.linux-amd64.tar.gz
sudo mv alertmanager-0.27.0.linux-amd64/alertmanager /usr/local/bin/

# Alertmanager配置
sudo nano /etc/alertmanager/alertmanager.yml
global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alert@example.com'
  smtp_auth_username: 'alert@example.com'
  smtp_auth_password: 'password'

route:
  receiver: 'email-alerts'
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h

receivers:
  - name: 'email-alerts'
    email_configs:
      - to: 'admin@example.com'
        send_resolved: true

  - name: 'slack-alerts'
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/xxx'
        channel: '#alerts'

32. Shell脚本编程

32.1 脚本基础

#!/bin/bash
# 脚本第一行指定解释器
# 常用: #!/bin/bash  #!/bin/sh  #!/usr/bin/env bash

# 严格模式(推荐所有脚本使用)
set -euo pipefail
# -e: 命令失败时退出
# -u: 未定义变量时报错
# -o pipefail: 管道中任意命令失败则整体失败

# 变量定义
NAME="Ubuntu"
VERSION=24.04
READONLY_VAR="constant"  # 只读变量
readonly READONLY_VAR

# 使用变量
echo "System: $NAME $VERSION"
echo "Path: ${HOME}/documents"  # 花括号避免歧义

# 命令替换
CURRENT_DATE=$(date +%Y-%m-%d)
FILE_COUNT=$(ls -1 | wc -l)

# 算术运算
COUNT=$((5 + 3))
RESULT=$((COUNT * 2))

# 数组
ARRAY=(one two three)
echo ${ARRAY[0]}       # 第一个元素
echo ${ARRAY[@]}       # 所有元素
echo ${#ARRAY[@]}      # 数组长度

32.2 条件判断

# if-elif-else
if [ "$USER" = "root" ]; then
    echo "You are root"
elif [ "$USER" = "admin" ]; then
    echo "You are admin"
else
    echo "You are $USER"
fi

# 文件测试
if [ -f "/etc/hosts" ]; then
    echo "File exists"
fi

# 常用文件测试:
# -f file    文件存在且是普通文件
# -d dir     目录存在
# -e path    路径存在
# -r file    可读
# -w file    可写
# -x file    可执行
# -s file    文件大小>0
# -L file    是软链接

# 字符串比较
if [ -z "$VAR" ]; then     # 字符串为空
    echo "Empty"
fi
if [ -n "$VAR" ]; then     # 字符串非空
    echo "Not empty"
fi
if [ "$A" = "$B" ]; then   # 字符串相等
    echo "Equal"
fi

# 数字比较
if [ "$A" -eq "$B" ]; then echo "Equal"; fi      # 等于
if [ "$A" -ne "$B" ]; then echo "Not equal"; fi  # 不等于
if [ "$A" -gt "$B" ]; then echo "Greater"; fi    # 大于
if [ "$A" -lt "$B" ]; then echo "Less"; fi       # 小于
if [ "$A" -ge "$B" ]; then echo "Gte"; fi        # 大于等于
if [ "$A" -le "$B" ]; then echo "Lte"; fi        # 小于等于

# 逻辑运算
if [ -f "$FILE" ] && [ -r "$FILE" ]; then
    echo "File exists and readable"
fi

if [ "$A" = "1" ] || [ "$B" = "2" ]; then
    echo "Either condition true"
fi

# case语句
case "$1" in
    start)
        echo "Starting..."
        ;;
    stop)
        echo "Stopping..."
        ;;
    restart)
        echo "Restarting..."
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac

32.3 循环结构

# for循环
for i in 1 2 3 4 5; do
    echo "Number: $i"
done

# 范围循环
for i in {1..10}; do
    echo "Number: $i"
done

# C风格循环
for ((i=0; i<10; i++)); do
    echo "Index: $i"
done

# 遍历文件
for file in /var/log/*.log; do
    echo "Processing: $file"
    wc -l "$file"
done

# while循环
count=0
while [ $count -lt 5 ]; do
    echo "Count: $count"
    ((count++))
done

# 读取文件逐行
while IFS= read -r line; do
    echo "Line: $line"
done < /etc/hosts

# until循环(条件为假时执行)
until ping -c 1 8.8.8.8 &>/dev/null; do
    echo "Waiting for network..."
    sleep 5
done
echo "Network is up!"

32.4 函数

# 函数定义
log() {
    local level=$1
    local message=$2
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $message"
}

# 调用函数
log "INFO" "Script started"
log "ERROR" "Something went wrong"

# 带返回值的函数
check_disk() {
    local usage=$(df -h / | tail -1 | awk '{print $5}' | tr -d '%')
    if [ "$usage" -gt 80 ]; then
        echo "WARNING"
        return 1
    else
        echo "OK"
        return 0
    fi
}

# 使用返回值
result=$(check_disk)
if [ $? -eq 0 ]; then
    echo "Disk usage: $result"
else
    echo "Disk usage: $result - Need attention!"
fi

# 函数参数
backup_dir() {
    local src=$1
    local dest=$2
    local date=$(date +%Y%m%d)

    if [ ! -d "$src" ]; then
        log "ERROR" "Source directory not found: $src"
        return 1
    fi

    tar -czf "${dest}/backup_${date}.tar.gz" "$src"
    log "INFO" "Backup created: ${dest}/backup_${date}.tar.gz"
}

32.5 实用脚本示例

#!/bin/bash
# 系统健康检查脚本
set -euo pipefail

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 函数
print_section() {
    echo ""
    echo "=== $1 ==="
}

check_and_print() {
    local name=$1
    local value=$2
    local threshold=$3
    local unit=$4

    if [ "$value" -gt "$threshold" ]; then
        echo -e "${RED}[WARN]${NC} $name: ${value}${unit} (threshold: ${threshold}${unit})"
    else
        echo -e "${GREEN}[OK]${NC} $name: ${value}${unit}"
    fi
}

# 主程序
echo "System Health Check - $(date)"
echo "Host: $(hostname)"

print_section "Disk Usage"
while read -r line; do
    usage=$(echo "$line" | awk '{print $5}' | tr -d '%')
    mount=$(echo "$line" | awk '{print $6}')
    [ -n "$usage" ] && check_and_print "$mount" "$usage" 85 "%"
done < <(df -h | grep -vE '^Filesystem|tmpfs|cdrom')

print_section "Memory"
mem_total=$(free -m | awk '/Mem:/ {print $2}')
mem_used=$(free -m | awk '/Mem:/ {print $3}')
mem_pct=$((mem_used * 100 / mem_total))
check_and_print "Memory" "$mem_pct" 85 "%"

print_section "Load Average"
load=$(cat /proc/loadavg | awk '{print $1}')
load_int=${load%.*}
cpu_count=$(nproc)
check_and_print "Load (1min)" "$load_int" "$cpu_count" ""

print_section "Failed Services"
failed=$(systemctl --failed --no-pager --no-legend 2>/dev/null | wc -l)
if [ "$failed" -gt 0 ]; then
    echo -e "${RED}[WARN]${NC} $failed failed services"
    systemctl --failed --no-pager
else
    echo -e "${GREEN}[OK]${NC} No failed services"
fi

print_section "Uptime"
echo "Uptime: $(uptime -p)"

echo ""
echo "Check completed at $(date)"

33. 文件系统高级

33.1 文件权限深入

# 权限数字表示
# 4 = read (r)
# 2 = write (w)
# 1 = execute (x)
# 755 = rwxr-xr-x
# 644 = rw-r--r--

# 特殊权限
# SUID (4000): 执行时以文件所有者身份运行
sudo chmod u+s /usr/bin/passwd
# chmod 4755 file

# SGID (2000): 执行时以文件所属组身份运行 / 目录中创建的文件继承组
sudo chmod g+s /shared_dir
# chmod 2755 dir

# Sticky Bit (1000): 只有文件所有者能删除(常用于/tmp)
sudo chmod +t /tmp
# chmod 1777 dir

# ACL (Access Control Lists) 细粒度权限
sudo apt install acl

# 设置ACL
setfacl -m u:username:rwx file
setfacl -m g:groupname:rwx dir
setfacl -m o::r file

# 默认ACL(目录中新创建文件的默认权限)
setfacl -d -m u:username:rwx dir
setfacl -d -m g:groupname:rwx dir

# 查看ACL
getfacl file
getfacl dir

# 删除ACL
setfacl -b file        # 删除所有ACL
setfacl -x u:username file  # 删除特定ACL

33.2 扩展属性

# 安装工具
sudo apt install attr

# 设置扩展属性
setfattr -n user.comment -v "important document" file.txt

# 查看扩展属性
getfattr file.txt
getfattr -d file.txt      # 显示值
getfattr -n user.comment file.txt  # 显示特定属性

# 删除扩展属性
setfattr -x user.comment file.txt

# 不可变属性(即使root也不能修改/删除)
sudo chattr +i file.txt
sudo lsattr file.txt      # 查看属性

# 只追加(只能追加不能删除)
sudo chattr +a /var/log/myapp.log

# 移除属性
sudo chattr -i file.txt
sudo chattr -a /var/log/myapp.log

33.3 挂载选项

# /etc/fstab 完整示例
#      

# 标准挂载
UUID=xxxx  /          ext4  defaults        0  1
UUID=yyyy  /boot      ext4  defaults        0  2
UUID=zzzz  none       swap  sw              0  0

# 安全挂载选项
/dev/sda3  /data  ext4  defaults,noexec,nosuid,nodev  0  2

# 常用挂载选项:
# defaults     = rw,suid,dev,exec,auto,nouser,async
# noexec       禁止执行文件
# nosuid       忽略SUID/SGID位
# nodev        禁止解释字符/块设备
# ro           只读
# rw           读写
# noatime      不更新访问时间(提升性能)
# nodiratime   不更新目录访问时间
# relatime     相对访问时间(推荐)
# discard      启用TRIM(SSD)
# errors=remount-ro  出错时重新挂载为只读

# tmpfs(内存文件系统)
tmpfs  /tmp  tmpfs  defaults,noatime,size=2G  0  0

# bind mount(目录映射)
/var/www/html  /srv/web  none  bind  0  0

33.4 文件系统检查与修复

# ext4检查和修复
sudo umount /dev/sda3
sudo fsck.ext4 -f /dev/sda3           # 强制检查
sudo fsck.ext4 -y /dev/sda3           # 自动修复
sudo e2fsck -f -y /dev/sda3           # 等同于fsck.ext4

# XFS检查和修复
sudo xfs_repair /dev/sda3
sudo xfs_repair -L /dev/sda3          # 清除日志(可能丢失数据)

# Btrfs检查和修复
sudo btrfs check /dev/sda3
sudo btrfs check --repair /dev/sda3   # 修复(谨慎使用)

# 在线调整大小(不卸载)
# ext4
sudo resize2fs /dev/vg_data/lv_app
# xfs
sudo xfs_growfs /data

# 查看文件系统信息
sudo dumpe2fs /dev/sda3 | head -30    # ext4
sudo xfs_info /data                    # xfs
sudo btrfs filesystem show             # btrfs

34. 进程与内存管理

34.1 进程深入理解

# 进程状态
# R - Running/Runnable
# S - Interruptible Sleep (等待事件)
# D - Uninterruptible Sleep (IO等待)
# Z - Zombie (僵尸进程)
# T - Stopped/Traced

# 查看进程详情
ps aux --sort=-%cpu | head -20
ps -eo pid,ppid,user,stat,%cpu,%mem,cmd --sort=-%mem | head -20

# 进程树
pstree -p
pstree -u          # 显示用户
pstree -s PID      # 显示进程的父进程链

# /proc文件系统
cat /proc/PID/status       # 进程状态
cat /proc/PID/cmdline      # 启动命令
ls -l /proc/PID/fd/        # 打开的文件描述符
cat /proc/PID/maps         # 内存映射
cat /proc/PID/environ      # 环境变量

# 信号
kill -l                # 列出所有信号
# 常用信号:
# 1  SIGHUP   - 重载配置
# 2  SIGINT   - 中断(Ctrl+C)
# 9  SIGKILL  - 强制终止(不可捕获)
# 15 SIGTERM  - 优雅终止(默认)
# 18 SIGCONT  - 继续
# 19 SIGSTOP  - 暂停

# 进程优先级
nice -n -20 cmd        # 最高优先级(-20到19)
nice -n 19 cmd         # 最低优先级
renice -n 10 -p PID    # 修改运行中进程
# realtime优先级(需root)
chrt -f 99 cmd

34.2 cgroups资源限制

# cgroup v2(Ubuntu 24.04默认)

# 查看cgroup层级
cat /proc/cgroups
ls /sys/fs/cgroup/

# 为进程设置资源限制(使用systemd)
# 在服务文件中:
[Service]
MemoryMax=1G
MemoryHigh=800M
CPUQuota=50%
TasksMax=100
IOWeight=100

# 使用cgexec临时限制
sudo apt install cgroup-tools
sudo cgcreate -g memory,cpu:/mygroup
sudo cgset -r memory.max=1G mygroup
sudo cgset -r cpu.max=50000 mygroup  # 50%
sudo cgexec -g memory,cpu:mygroup ./myapp

34.3 内存管理

# 查看内存详情
free -h
free -m
cat /proc/meminfo
vmstat 1 10

# 内存字段说明:
# total    总内存
# used     已使用
# free     完全空闲
# shared   共享内存
# buff/cache 缓冲/缓存
# available 应用可用内存(重要!)

# 清除缓存(仅在需要时)
sudo sync
echo 1 | sudo tee /proc/sys/vm/drop_caches  # 清pagecache
echo 2 | sudo tee /proc/sys/vm/drop_caches  # 清dentries和inodes
echo 3 | sudo tee /proc/sys/vm/drop_caches  # 清所有

# OOM Killer
# 查看OOM分数
cat /proc/PID/oom_score
# 调整OOM优先级(-1000到1000)
echo -500 | sudo tee /proc/PID/oom_score_adj
# -1000表示永不OOM kill
echo -1000 | sudo tee /proc/PID/oom_score_adj

# 查看OOM历史
dmesg | grep -i oom
journalctl -k | grep -i "oom\|killed"

34.4 进程监控工具

# 安装高级工具
sudo apt install glances nmon atop

# Glances - Web模式
glances -w
# 访问 http://server:61208

# atop - 历史回溯
atop -r /var/log/atop/atop_20260718

# strace - 系统调用跟踪
sudo strace -p PID
sudo strace -e trace=network -p PID   # 仅跟踪网络调用
sudo strace -f -o output.txt ./app    # 跟踪子进程

# ltrace - 库调用跟踪
ltrace ./app

# perf - 性能分析
sudo apt install linux-tools-$(uname -r)
sudo perf top                    # 实时热点
sudo perf record -g ./app        # 记录性能数据
sudo perf report                 # 分析报告
sudo perf stat ./app             # 统计事件

35. Cloud-Init与自动部署

35.1 Cloud-Init基础

# Cloud-Init是云环境中初始化实例的标准工具
# Ubuntu 24.04 Server默认包含cloud-init

# 查看cloud-init状态
sudo cloud-init status
sudo cloud-init status --long

# 查看cloud-init日志
sudo less /var/log/cloud-init.log
sudo less /var/log/cloud-init-output.log

# 重新运行cloud-init(慎用)
sudo cloud-init clean
sudo cloud-init init
sudo cloud-init modules --mode=config
sudo cloud-init modules --mode=final

35.2 Cloud-Init用户数据

# cloud-config格式(YAML)
# 用于云环境或虚拟机首次启动时自动配置

#cloud-config
# 设置主机名
hostname: myserver
fqdn: myserver.example.com

# 用户管理
users:
  - name: admin
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: sudo, docker
    shell: /bin/bash
    ssh_authorized_keys:
      - ssh-ed25519 AAAA... user@host

# 设置时区
timezone: Asia/Shanghai

# 安装软件包
package_update: true
package_upgrade: true
packages:
  - nginx
  - docker.io
  - htop

# 运行命令
runcmd:
  - systemctl enable --now nginx
  - ufw allow 80/tcp
  - ufw allow 443/tcp
  - ufw enable

# 写入文件
write_files:
  - path: /etc/nginx/sites-available/default
    content: |
      server {
        listen 80;
        server_name _;
        root /var/www/html;
        index index.html;
      }

# 最终消息
final_message: "System ready after $UPTIME seconds"

35.3 Preseed自动安装

# Preseed用于完全自动化的Ubuntu安装
# 创建preseed.cfg文件

# 语言设置
d-i debian-installer/locale string en_US.UTF-8
d-i console-setup/ask_detect boolean false
d-i keyboard-configuration/xkb-keymap select us

# 网络设置
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string ubuntu-server
d-i netcfg/get_domain string local

# 镜像源
d-i mirror/country string manual
d-i mirror/http/hostname string mirrors.aliyun.com
d-i mirror/http/directory string /ubuntu
d-i mirror/http/proxy string

# 磁盘分区(使用整块磁盘+LVM)
d-i partman-auto/method string lvm
d-i partman-auto-lvm/guided_size string max
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto/choose_recipe select atomic
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

# 用户设置
d-i passwd/root-login boolean false
d-i passwd/user-fullname string Admin User
d-i passwd/username string admin
d-i passwd/user-password password SecurePass123!
d-i passwd/user-password-again password SecurePass123!

# 软件选择
tasksel tasksel/first multiselect standard, openssh-server
d-i pkgsel/include string curl wget vim htop

# GRUB
d-i grub-installer/only_debian boolean true
d-i grub-installer/bootdev string /dev/sda

# 完成后执行脚本
d-i preseed/late_command string \
  in-target sh -c 'echo "admin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/admin'

35.4 Packer镜像构建

# Packer用于构建可重复的虚拟机镜像
# 安装Packer
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
  sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install packer

# Packer HCL模板 (ubuntu-2404.pkr.hcl)
packer {
  required_plugins {
    qemu = {
      version = ">= 1.0.0"
      source  = "github.com/hashicorp/qemu"
    }
  }
}

source "qemu" "ubuntu" {
  iso_url          = "https://releases.ubuntu.com/24.04/ubuntu-24.04-live-server-amd64.iso"
  iso_checksum     = "sha256:xxx"
  output_directory = "output"
  vm_name          = "ubuntu-2404.qcow2"
  disk_size        = "20G"
  format           = "qcow2"
  accelerator      = "kvm"
  boot_wait        = "5s"
  boot_command     = [
    "c",
    "linux /casper/vmlinuz autoinstall ds=nocloud-net;s=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ ---",
    "<enter><wait>",
    "initrd /casper/initrd",
    "<enter><wait>",
    "boot",
    "<enter>"
  ]
  http_directory   = "http"
  ssh_username     = "admin"
  ssh_password     = "password"
  ssh_timeout      = "20m"
  shutdown_command = "sudo shutdown -P now"
}

build {
  sources = ["source.qemu.ubuntu"]

  provisioner "shell" {
    inline = [
      "sudo apt update",
      "sudo apt upgrade -y",
      "sudo apt install -y nginx docker.io",
      "sudo apt autoremove -y",
      "sudo apt clean"
    ]
  }
}

36. CI/CD流水线

36.1 Gitea (自建Git服务)

# 使用Docker部署Gitea
docker compose up -d
# docker-compose.yml
services:
  gitea:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=sqlite3
      - GITEA__server__ROOT_URL=https://git.example.com
      - GITEA__server__DOMAIN=git.example.com
    volumes:
      - gitea_data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "222:22"
    restart: unless-stopped

volumes:
  gitea_data:

36.2 Jenkins部署

# 安装Jenkins
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | \
  sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null

echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/" | \
  sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null

sudo apt update
sudo apt install fontconfig openjdk-17-jre jenkins

# 启动Jenkins
sudo systemctl enable --now jenkins

# 获取初始密码
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

# 访问 http://server:8080

36.3 GitHub Actions Runner

# 创建runner用户
sudo useradd -m -s /bin/bash runner
sudo usermod -aG docker runner

# 下载runner
mkdir actions-runner && cd actions-runner
curl -o actions-runner-linux-x64-2.317.0.tar.gz -L \
  https://github.com/actions/runner/releases/download/v2.317.0/actions-runner-linux-x64-2.317.0.tar.gz
tar xzf actions-runner-linux-x64-2.317.0.tar.gz

# 配置runner
./config.sh --url https://github.com/owner/repo --token XXXXXXXX

# 安装为服务
sudo ./svc.sh install
sudo ./svc.sh start

36.4 Drone CI

# 使用Docker部署Drone
# docker-compose.yml
services:
  drone:
    image: drone/drone:2
    ports:
      - "8080:80"
    volumes:
      - drone_data:/data
    environment:
      - DRONE_GITHUB_CLIENT_ID=xxx
      - DRONE_GITHUB_CLIENT_SECRET=xxx
      - DRONE_SERVER_HOST=ci.example.com
      - DRONE_SERVER_PROTO=https
      - DRONE_RPC_SECRET=super_secret_key
    restart: unless-stopped

  drone-runner:
    image: drone/drone-runner-docker:1
    command: agent
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_HOST=drone:80
      - DRONE_RPC_SECRET=super_secret_key
      - DRONE_RUNNER_CAPACITY=4
    restart: unless-stopped

volumes:
  drone_data:

37. 邮件服务器

37.1 Postfix邮件服务器

# 安装Postfix
sudo apt install postfix mailutils

# 基本配置(选择"Internet Site")
sudo dpkg-reconfigure postfix

# 手动配置
sudo nano /etc/postfix/main.cf
# 基本设置
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8, 192.168.1.0/24

# TLS/SSL
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtp_tls_security_level = may

# SASL认证
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

# 限制
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination

# 虚拟域名
virtual_alias_domains = example.com otherdomain.com
virtual_alias_maps = hash:/etc/postfix/virtual

37.2 Dovecot IMAP/POP3

# 安装Dovecot
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d

# 配置认证
sudo nano /etc/dovecot/conf.d/10-auth.conf
# disable_plaintext_auth = yes
# auth_mechanisms = plain login

# 配置邮件位置
sudo nano /etc/dovecot/conf.d/10-mail.conf
# mail_location = maildir:~/Maildir

# 配置SSL
sudo nano /etc/dovecot/conf.d/10-ssl.conf
# ssl = required
# ssl_cert = 

37.3 邮件客户端测试
# 发送测试邮件
echo "Test message" | mail -s "Test Subject" user@example.com

# 使用sendmail
sendmail user@example.com << EOF
Subject: Test
From: admin@example.com
To: user@example.com

This is a test email.
EOF

# 使用swaks测试
sudo apt install swaks
swaks --to user@example.com --from admin@example.com \
  --server mail.example.com --port 587 --auth LOGIN \
  --auth-user admin --auth-password password --tls

# 查看邮件队列
sudo mailq
sudo postqueue -f   # 强制发送队列中的邮件

# 查看日志
sudo tail -f /var/log/mail.log

38. 安全合规与审计

38.1 CIS基准检查

# CIS (Center for Internet Security) 基准是业界标准的安全配置指南

# 使用CIS-CAT或开源替代工具
# Ubuntu CIS基准涵盖:
# - 初始设置(文件系统、服务)
# - 服务配置(SSH、NTP、DNS)
# - 网络配置(防火墙、内核参数)
# - 日志和审计
# - 访问认证和权限
# - 系统维护

# 自动化检查工具
# Docker Bench for Security
docker run -it --net host --pid host --userns host \
  -v /:/host docker/docker-bench-security

# kube-bench(Kubernetes安全基准)
# https://github.com/aquasecurity/kube-bench

38.2 审计日志 (auditd)

# 安装auditd
sudo apt install auditd audispd-plugins

# 配置审计规则
sudo nano /etc/audit/rules.d/audit.rules
# 删除所有当前规则
-D

# 缓冲区大小
-b 8192

# 失败模式(0=silent, 1=printk, 2=panic)
-f 1

# 监控文件修改
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/ssh/sshd_config -p wa -k sshd_config

# 监控用户操作
-a always,exit -F arch=b64 -S execve -k process_execution
-a always,exit -F arch=b64 -S open,openat -F dir=/etc -k etc_access

# 监控登录
-w /var/log/auth.log -p wa -k auth_log
-w /var/run/faillock -p wa -k faillock

# 监控特权操作
-a always,exit -F arch=b64 -S setuid,setgid -k privilege_escalation
-a always,exit -F arch=b64 -S mount -k filesystem_mount

# 使规则不可修改(需重启才能修改)
-e 2
# 加载规则
sudo augenrules --load
# 或
sudo service auditd restart

# 查看审计日志
sudo ausearch -k identity
sudo ausearch -k sshd_config
sudo ausearch -ts today
sudo aureport -au     # 认证报告
sudo aureport -x      # 执行报告
sudo aureport -f      # 文件访问报告

# 搜索特定用户的活动
sudo ausearch -ua 1000 -ts today

38.3 日志集中管理

# rsyslog远程日志收集

# 服务端配置(/etc/rsyslog.d/remote.conf)
module(load="imtcp")
input(type="imtcp" port="514")

# 按主机名分文件
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs

# 客户端配置(/etc/rsyslog.d/remote.conf)
*.* @@logserver.example.com:514  # TCP (@@)
# 或
*.* @logserver.example.com:514   # UDP (@)

sudo systemctl restart rsyslog

# Elasticsearch + Logstash + Kibana (ELK)
# 使用Docker Compose快速部署
# 或使用OpenSearch(开源替代)

38.4 漏洞扫描

# OpenVAS/Greenbone漏洞扫描
# 使用Docker部署
docker pull greenbone/gvm
# 或使用容器化的GVM-CE

# Nikto Web扫描
sudo apt install nikto
nikto -h https://example.com

# Nuclei(快速漏洞扫描)
# https://github.com/projectdiscovery/nuclei
nuclei -u https://example.com -severity critical,high

# Trivy(容器和依赖扫描)
trivy image myimage:latest
trivy fs /path/to/project
trivy config /path/to/infrastructure

39. 高级文本处理

39.1 AWK高级用法

# AWK是强大的文本处理工具

# 基本语法
awk 'pattern {action}' file

# 打印特定列
awk '{print $1, $3}' file
awk -F: '{print $1, $7}' /etc/passwd

# 条件过滤
awk '$3 > 1000 {print $1}' /etc/passwd   # UID>1000的用户
awk '$5 ~ /error/ {print}' log.txt       # 包含error的行
awk '$1 == "root" {print}' /etc/passwd   # 精确匹配

# 计算统计
# 求和
awk '{sum += $1} END {print sum}' numbers.txt

# 平均值
awk '{sum += $1; count++} END {print sum/count}' numbers.txt

# 最大/最小值
awk 'BEGIN{max=0} {if($1>max) max=$1} END{print max}' numbers.txt

# 频率统计
awk '{count[$1]++} END {for(item in count) print item, count[item]}' access.log

# BEGIN和END块
awk 'BEGIN{print "Start"} {print NR": "$0} END{print "Total: "NR" lines"}' file

# 多文件处理
awk 'FNR==1{print "---" FILENAME "---"} {print}' file1 file2

39.2 Sed高级用法

# 替换(全局)
sed 's/old/new/g' file
sed 's|/old/path|/new/path|g' file    # 用|作分隔符

# 只替换第N次出现
sed 's/old/new/2' file

# 删除行
sed '5d' file              # 删除第5行
sed '5,10d' file           # 删除5-10行
sed '/^$/d' file           # 删除空行
sed '/pattern/d' file      # 删除匹配行
sed '/^#/d' file           # 删除注释行

# 插入和追加
sed '3i\New line here' file    # 在第3行前插入
sed '3a\New line here' file    # 在第3行后追加
sed '/pattern/a\New line' file # 在匹配行后追加

# 替换整行
sed '5s/.*/replacement/' file  # 替换第5行整行

# 多命令
sed -e 's/foo/bar/g' -e 's/baz/qux/g' file
sed -e '/^#/d' -e '/^$/d' file

# 反向引用
sed 's/\(word1\) \(word2\)/\2 \1/g' file  # 交换两个词

# 范围操作
sed '/START/,/END/d' file   # 删除START到END之间的行
sed -n '/START/,/END/p' file # 只打印START到END之间的行

# 直接修改文件
sed -i 's/old/new/g' file
sed -i.bak 's/old/new/g' file  # 备份原文件

39.3 正则表达式

# 基本正则表达式 (BRE)
.        任意单个字符
*        前一个字符0次或多次
^        行首
$        行尾
[abc]    字符集合
[^abc]   排除字符集
[a-z]    范围

# 扩展正则表达式 (ERE, 使用grep -E或egrep)
+        1次或多次
?        0次或1次
{n}      精确n次
{n,m}    n到m次
{n,}     至少n次
|        或
()       分组

# 特殊字符类
[:alpha:]   字母
[:digit:]   数字
[:alnum:]   字母数字
[:space:]   空白
[:upper:]   大写
[:lower:]   小写

# 实用正则示例
grep -E '^[a-z]+@[a-z]+\.[a-z]+$' emails.txt     # 简单邮箱
grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' file  # IP地址
grep -E '^ERROR.*[0-9]{4}-[0-9]{2}-[0-9]{2}' log  # 带日期的ERROR行
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/' file  # 日期格式转换

39.4 jq (JSON处理)

# 安装jq
sudo apt install jq

# 基本操作
echo '{"name":"John","age":30}' | jq '.'
echo '{"name":"John","age":30}' | jq '.name'
echo '{"name":"John","age":30}' | jq '.age'

# 数组操作
echo '[1,2,3,4,5]' | jq '.[0]'           # 第一个元素
echo '[1,2,3,4,5]' | jq '.[2:4]'         # 切片
echo '[1,2,3,4,5]' | jq '.[]'            # 展开数组
echo '[1,2,3,4,5]' | jq 'map(. * 2)'     # 每个元素乘2
echo '[1,2,3,4,5]' | jq 'map(select(. > 3))'  # 过滤

# 复杂JSON
cat data.json | jq '.users[] | {name, email}'
cat data.json | jq '.users[] | select(.age > 25) | .name'
cat data.json | jq '[.users[] | {id, fullName: (.first + " " + .last)}]'

# 修改JSON
echo '{"a":1}' | jq '.b = 2'
echo '{"a":1}' | jq 'del(.a)'
echo '{"users":[]}' | jq '.users += [{"name":"John"}]'

# 格式化输出
jq '.' data.json > formatted.json
jq -c '.' data.json  # 紧凑输出

# 结合curl使用
curl -s https://api.github.com/users/octocat | jq '.name, .bio'
curl -s https://api.github.com/repos/torvalds/linux | jq '.stargazers_count'

40. 生产环境最佳实践

40.1 服务器部署清单

类别检查项状态
基础安全SSH密钥认证+禁用密码☐
基础安全SSH端口非默认22☐
基础安全Fail2ban已配置☐
基础安全UFW/防火墙已启用☐
基础安全自动安全更新已启用☐
基础安全非root用户运行服务☐
网络静态IP已配置☐
网络NTP时间同步☐
网络DNS已配置冗余☐
监控系统监控已部署☐
监控告警通知已配置☐
监控日志集中收集☐
备份自动备份已配置☐
备份备份恢复已测试☐
备份异地备份已配置☐
性能内核参数已优化☐
性能文件描述符限制已调整☐
文档部署文档已完善☐
文档灾备恢复计划☐

40.2 命名规范

# 主机名规范
# [环境]-[角色]-[序号].[域名]
# prod-web-01.example.com
# prod-db-01.example.com
# staging-api-01.example.com
# dev-app-01.example.com

# 服务账户命名
svc_[服务名]_[环境]
# svc_nginx_prod
# svc_mysql_prod
# svc_redis_staging

# 目录规范
/opt/[company]/[project]/[component]
# /opt/mycompany/webapp/frontend
# /opt/mycompany/webapp/backend
# /opt/mycompany/webapp/scripts

# 日志目录
/var/log/[service_name]/
# /var/log/myapp/access.log
# /var/log/myapp/error.log
# /var/log/myapp/audit.log

40.3 变更管理

# 生产环境变更流程:
# 1. 变更申请 (说明原因、影响、风险)
# 2. 变更评审 (团队审核)
# 3. 测试验证 (在staging环境验证)
# 4. 变更窗口 (选择低峰期执行)
# 5. 回滚计划 (准备好回退方案)
# 6. 执行变更 (按步骤执行)
# 7. 验证确认 (确认服务正常)
# 8. 记录归档 (记录变更详情)

# 变更管理脚本模板
#!/bin/bash
# change_management.sh

CHANGE_ID=$1
ACTION=$2
SERVICE=$3

log_change() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') | $CHANGE_ID | $USER | $ACTION | $SERVICE | $1" \
      >> /var/log/changes.log
}

case $ACTION in
    deploy)
        log_change "START"
        # 执行部署步骤
        # ...
        log_change "COMPLETED"
        ;;
    rollback)
        log_change "ROLLBACK_START"
        # 执行回滚步骤
        # ...
        log_change "ROLLBACK_COMPLETED"
        ;;
esac

40.4 灾难恢复计划

# RTO (Recovery Time Objective) - 恢复时间目标
# 定义服务恢复的最大允许时间

# RPO (Recovery Point Objective) - 恢复点目标
# 定义可接受的数据丢失时间范围

# 灾难恢复层级:
# Level 1: 数据备份恢复(小时级RTO)
# Level 2: 服务重启恢复(分钟级RTO)
# Level 3: 热备切换(秒级RTO)
# Level 4: 多活架构(零中断)

# 恢复步骤文档模板
# 1. 评估影响范围
# 2. 启动恢复流程
# 3. 恢复基础设施
# 4. 恢复数据
# 5. 恢复服务
# 6. 验证功能
# 7. 通知相关方
# 8. 事后复盘

40.5 安全基线检查清单

# 每月安全检查
□ 系统补丁已更新
□ 用户账户审计(删除无用账户)
□ SSH密钥审计(检查authorized_keys)
□ 防火墙规则审计
□ 备份恢复测试
□ 安全扫描(Lynis/rkhunter)
□ 日志审计(检查异常登录)
□ 证书到期检查
□ 依赖漏洞检查

# 每季度安全检查
□ 密码策略审查
□ 访问权限最小化原则检查
□ 安全培训
□ 灾备演练
□ 渗透测试(可选)

45.64.74.193

← 返回IT 技术 yicool 百科 · Ubuntu 24.04 LTS 服务器版完整教程

评论 0