1. 系统简介
▼
1.1 什么是Debian 13.2 LTS
Debian 13 代号为 "Trixie",是 Debian 项目发布的稳定版 GNU/Linux 操作系统。Debian 13.2 是该版本的第二个点更新,包含安全修复和Bug修复。LTS(长期支持)版本意味着该版本将获得长达5年的安全更新支持,非常适合服务器生产环境使用。
1.2 Debian 13.2 的主要特性
- 内核版本:Linux 6.12 LTS 内核,支持更多硬件驱动和性能优化
- Systemd 版本:257,提供更好的系统管理和服务控制
- GCC 编译器:GCC 14.2,提供更优的代码编译性能
- Python:预装 Python 3.13
- OpenSSL:版本 3.4,提供更强的加密安全性
- 支持架构:amd64、arm64、armhf、i386、mips64el、mipsel、ppc64el、s390x 等
- 软件包数量:超过 64,000 个预编译软件包
- AppArmor:默认启用的强制访问控制系统
- Wayland:改进的显示服务器支持
1.3 为什么选择Debian作为服务器系统
- 稳定性:Debian以极高的系统稳定性著称,适合长时间运行的服务器环境
- 安全性:拥有专门的安全团队,及时发布安全补丁
- 软件生态:APT包管理器提供丰富的软件仓库
- 社区支持:庞大的开源社区提供技术支持
- 低资源消耗:最小安装仅需极少系统资源
- 企业友好:5年LTS支持周期满足企业需求
1.4 系统要求
| 配置项 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 1 GHz 单核 | 2 GHz 多核 |
| 内存 | 512 MB | 2 GB 以上 |
| 硬盘 | 10 GB | 50 GB 以上 |
| 网络 | 100 Mbps | 1 Gbps |
2. 系统安装
▼
2.1 获取安装镜像
从官方渠道下载 Debian 13.2 安装镜像。对于服务器环境,建议使用 netinst(网络安装)镜像或最小化安装镜像。
# 官方下载地址
https://www.debian.org/distrib/
# 国内镜像站推荐
https://mirrors.tuna.tsinghua.edu.cn/debian-cd/
https://mirrors.aliyun.com/debian-cd/
https://mirrors.ustc.edu.cn/debian-cd/
2.2 制作启动介质
Linux/macOS 系统下制作
# 使用 dd 命令写入U盘(注意替换设备名)
sudo dd if=debian-13.2-amd64-netinst.iso of=/dev/sdX bs=4M status=progress conv=fsync
# 或使用 Rufus(Windows)/ Etcher(跨平台)工具
2.3 BIOS/UEFI 设置
- 进入 BIOS 设置界面(开机按 Del/F2/F12)
- 设置 UEFI 启动模式(推荐)或 Legacy 模式
- 关闭 Secure Boot(如需要)
- 设置USB/光驱为第一启动设备
2.4 安装步骤详解
步骤一:启动安装程序
从启动介质引导后,选择 "Install"(图形安装)或 "Graphical install"。服务器环境也可选择文本模式安装以节省资源。
步骤二:语言与地区设置
- 选择语言:中文(简体)或 English
- 选择地区:中国
- 选择键盘布局:美式键盘(American English)
步骤三:网络配置
- 配置网络接口(DHCP 或手动配置)
- 设置主机名(如:server01)
- 设置域名(如:example.com,可留空)
步骤四:用户设置
# 设置 root 密码
# 建议设置强密码:包含大小写字母、数字、特殊字符,至少12位
# 创建普通用户
用户名:admin
全名:System Administrator
密码:设置强密码
步骤五:磁盘分区
服务器推荐的分区方案:
| 分区 | 大小 | 文件系统 | 说明 |
|---|---|---|---|
| /boot/efi | 512 MB | FAT32 | EFI系统分区(UEFI模式需要) |
| /boot | 1 GB | ext4 | 引导分区 |
| / | 30 GB | ext4 | 根分区 |
| /var | 20 GB | ext4 | 日志和变量数据 |
| /home | 剩余空间 | ext4 | 用户数据 |
| swap | 内存×1~2 | swap | 交换分区 |
步骤六:软件选择
服务器安装时建议选择最小化安装:
- 取消勾选 "Debian desktop environment"
- 勾选 "SSH server"
- 勾选 "standard system utilities"
步骤七:安装 GRUB 引导程序
选择安装 GRUB 到主硬盘的 MBR 或 EFI 分区。
2.5 首次启动检查
# 检查系统版本
cat /etc/debian_version
# 输出: 13.2
# 检查内核版本
uname -r
# 检查系统信息
hostnamectl
3. 基础配置
▼
3.1 配置软件源
安装完成后首先配置国内镜像源以加速软件包下载。
# 备份原始源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 编辑源文件(Debian 13 Trixie)
sudo nano /etc/apt/sources.list
替换为清华镜像源:
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-backports main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ trixie-security main contrib non-free non-free-firmware
💡 提示:Debian 12 开始默认使用 /etc/apt/sources.list.d/ 目录下的独立配置文件,也可以在该目录下创建 .list 或 .sources 文件。
# 更新软件包列表
sudo apt update
# 升级系统软件包
sudo apt upgrade -y
# 完整升级(处理依赖关系)
sudo apt full-upgrade -y
# 清理不需要的包
sudo apt autoremove -y
sudo apt autoclean
3.2 设置主机名
# 查看当前主机名
hostnamectl
# 设置新的主机名
sudo hostnamectl set-hostname server01.example.com
# 编辑 /etc/hosts 文件
sudo nano /etc/hosts
# 添加以下内容:
# 127.0.0.1 server01.example.com server01
# 192.168.1.100 server01.example.com server01
3.3 设置时区与时间同步
# 设置时区为上海
sudo timedatectl set-timezone Asia/Shanghai
# 查看时间设置
timedatectl
# 安装 chrony 进行时间同步
sudo apt install chrony -y
# 启动并启用 chrony 服务
sudo systemctl enable chrony
sudo systemctl start chrony
# 检查时间同步状态
chronyc tracking
chronyc sources -v
3.4 配置系统 locale
# 生成中文 locale
sudo apt install locales -y
sudo dpkg-reconfigure locales
# 选择 zh_CN.UTF-8 UTF-8 和 en_US.UTF-8 UTF-8
# 设置默认 locale 为 en_US.UTF-8(服务器推荐英文避免乱码)
# 或手动设置
echo 'LANG=en_US.UTF-8' | sudo tee /etc/default/locale
echo 'LC_ALL=en_US.UTF-8' | sudo tee -a /etc/default/locale
3.5 安装常用工具
# 安装基础管理工具
sudo apt install -y \
vim \
wget \
curl \
git \
htop \
tree \
unzip \
zip \
net-tools \
dnsutils \
lsof \
strace \
tcpdump \
sysstat \
rsync \
tmux \
screen \
sudo \
ca-certificates \
gnupg \
apt-transport-https \
software-properties-common
3.6 配置 sudo 权限
# 将普通用户加入 sudo 组
sudo usermod -aG sudo admin
# 编辑 sudo 配置
sudo visudo
# 添加免密sudo(可选,用于自动化脚本)
# admin ALL=(ALL) NOPASSWD: ALL
# 设置 sudo 超时
# Defaults timestamp_timeout=15
3.7 优化系统参数
# 编辑 sysctl 配置
sudo nano /etc/sysctl.conf
添加以下优化参数:
# 网络优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10000 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 30
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 文件系统优化
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
# 内存优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# 应用配置
sudo sysctl -p
4. 网络配置
▼
4.1 查看网络信息
# 查看所有网络接口
ip addr show
# 或
ip a
# 查看路由信息
ip route show
# 查看网络连接状态
ss -tulnp
# 查看DNS配置
cat /etc/resolv.conf
4.2 配置静态IP(使用 NetworkManager)
# 安装 NetworkManager
sudo apt install network-manager -y
# 查看连接名称
nmcli connection show
# 配置静态IP
sudo nmcli connection modify "有线连接 1" \
ipv4.method manual \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns "223.5.5.5,119.29.29.29" \
connection.autoconnect yes
# 重启连接
sudo nmcli connection up "有线连接 1"
4.3 配置静态IP(使用 systemd-networkd)
# 启用 systemd-networkd
sudo systemctl enable systemd-networkd
sudo systemctl start systemd-networkd
# 创建网络配置文件
sudo nano /etc/systemd/network/20-wired.network
[Match]
Name=enp* eth*
[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=223.5.5.5
DNS=119.29.29.29
# 重启网络服务
sudo systemctl restart systemd-networkd
4.4 配置 DNS 解析
# 使用 systemd-resolved
sudo systemctl enable systemd-resolved
sudo systemctl start systemd-resolved
# 创建链接
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
# 或手动配置 DNS
sudo nano /etc/resolv.conf
# nameserver 223.5.5.5
# nameserver 119.29.29.29
# nameserver 8.8.8.8
4.5 配置网络接口绑定(Bonding)
# 安装 ifenslave
sudo apt install ifenslave -y
# 编辑网络配置
sudo nano /etc/network/interfaces
# 双网卡绑定配置示例
auto bond0
iface bond0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
bond-slaves eth0 eth1
bond-mode 802.3ad
bond-miimon 100
bond-downdelay 200
bond-updelay 200
4.6 配置网络桥接
# 安装桥接工具
sudo apt install bridge-utils -y
# 创建桥接接口
sudo nano /etc/network/interfaces
auto br0
iface br0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
4.7 IPv6 配置
# 启用 IPv6
sudo nano /etc/sysctl.conf
# 确保以下行未被注释
# net.ipv6.conf.all.disable_ipv6 = 0
# net.ipv6.conf.default.disable_ipv6 = 0
# 配置 IPv6 地址
sudo nmcli connection modify "有线连接 1" \
ipv6.method manual \
ipv6.addresses 2001:db8::100/64 \
ipv6.gateway 2001:db8::1
4.8 常用网络诊断命令
# 测试网络连通性
ping -c 4 223.5.5.5
ping6 -c 4 google.com
# DNS查询
dig example.com
nslookup example.com
# 路由追踪
traceroute google.com
mtr google.com
# 端口扫描
sudo nmap -sT localhost
# 查看网络流量
sudo iftop -i eth0
sudo nethogs eth0
5. 用户与权限管理
▼
5.1 用户管理基本命令
# 创建用户
sudo useradd -m -s /bin/bash username
sudo useradd -m -s /bin/bash -G sudo,developers username # 同时加入多个组
# 设置密码
sudo passwd username
# 查看用户信息
id username
getent passwd username
# 修改用户
sudo usermod -s /bin/zsh username # 修改shell
sudo usermod -aG docker username # 加入新组
sudo usermod -d /home/newdir username # 修改主目录
sudo usermod -l newname oldname # 重命名用户
# 删除用户
sudo userdel username # 删除用户但保留主目录
sudo userdel -r username # 删除用户及其主目录
# 锁定/解锁用户
sudo passwd -l username # 锁定
sudo passwd -u username # 解锁
# 设置密码过期
sudo chage -M 90 username # 密码最长有效期90天
sudo chage -W 7 username # 过期前7天提醒
sudo chage -E 2026-12-31 username # 设置账号过期日期
5.2 用户组管理
# 创建用户组
sudo groupadd developers
sudo groupadd -g 1500 developers # 指定GID
# 删除用户组
sudo groupdel developers
# 修改用户组
sudo groupmod -n newname oldname # 重命名组
# 查看用户所属组
groups username
id username
# 将用户加入组
sudo gpasswd -a username groupname
sudo usermod -aG groupname username
# 从组中移除用户
sudo gpasswd -d username groupname
# 设置组管理员
sudo gpasswd -A adminuser groupname
5.3 文件权限管理
# 查看权限
ls -la
# 修改权限(数字方式)
chmod 755 filename # rwxr-xr-x
chmod 644 filename # rw-r--r--
chmod 700 directory # rwx------
# 修改权限(符号方式)
chmod u+x file # 用户添加执行权限
chmod g-w file # 组移除写权限
chmod o=r file # 其他人只读
chmod a+x file # 所有人添加执行权限
# 递归修改权限
chmod -R 755 /var/www/html
# 修改所有者
sudo chown user:group filename
sudo chown -R user:group /var/www/html
# 设置 SUID/SGID
chmod u+s file # SUID(执行时以文件所有者身份)
chmod g+s directory # SGID(目录中新文件继承组)
chmod +t directory # Sticky Bit(只有所有者能删除)
5.4 ACL 访问控制列表
# 安装 ACL 工具
sudo apt install acl -y
# 设置 ACL
setfacl -m u:username:rwx file # 给特定用户设置权限
setfacl -m g:groupname:rx directory # 给特定组设置权限
setfacl -m o::--- file # 移除其他人权限
# 设置默认 ACL(对新创建的文件生效)
setfacl -d -m u:username:rwx directory
# 查看 ACL
getfacl file
# 移除 ACL
setfacl -x u:username file # 移除特定用户ACL
setfacl -b file # 移除所有ACL
5.5 禁用 root 远程登录
# 编辑 SSH 配置
sudo nano /etc/ssh/sshd_config
# 修改以下内容
# PermitRootLogin no
# PasswordAuthentication no
# 重启 SSH 服务
sudo systemctl restart sshd
⚠️ 警告:禁用root登录前请确保普通用户有sudo权限,否则将无法管理系统!
6. 软件包管理(APT)
▼
6.1 APT 基本命令
# 更新软件包列表
sudo apt update
# 升级已安装的软件包
sudo apt upgrade
# 完整升级(处理依赖关系变化)
sudo apt full-upgrade
# 安装软件包
sudo apt install package_name
# 同时安装多个包
sudo apt install package1 package2 package3
# 安装指定版本
sudo apt install package_name=1.2.3-1
# 卸载软件包(保留配置文件)
sudo apt remove package_name
# 完全卸载软件包(删除配置文件)
sudo apt purge package_name
# 自动删除不再需要的依赖
sudo apt autoremove
# 清理下载的包缓存
sudo apt clean
sudo apt autoclean
6.2 软件包查询
# 搜索软件包
apt search keyword
apt search "web server"
# 查看软件包信息
apt show package_name
apt-cache show package_name
# 查看已安装的包
apt list --installed
dpkg -l
# 查看包是否已安装
dpkg -s package_name
apt list package_name --installed
# 查看包包含哪些文件
dpkg -L package_name
# 查看某个文件属于哪个包
dpkg -S /path/to/file
apt-file search filename
# 列出可升级的包
apt list --upgradable
6.3 管理软件源
# 添加 PPA(需要先安装 software-properties-common)
sudo add-apt-repository ppa:user/ppa-name
# 删除 PPA
sudo add-apt-repository --remove ppa:user/ppa-name
# 添加第三方仓库(以 Docker 为例)
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian trixie stable" | sudo tee /etc/apt/sources.list.d/docker.list
# 固定软件包版本(防止意外升级)
sudo nano /etc/apt/preferences.d/pin-package
# 固定包版本示例
Package: nginx
Pin: version 1.24.*
Pin-Priority: 1001
6.4 软件包优先级
# 查看当前优先级策略
apt-cache policy package_name
# 创建优先级配置
sudo nano /etc/apt/preferences.d/custom-pin
# 优先级值说明
# 1001: 强制安装该版本(允许降级)
# 1000: 强制安装该版本
# 500: 目标发布版本的包
# 100: 已安装的包
# 1: 阻止安装
# 示例:优先从 backports 安装
Package: *
Pin: release a=trixie-backports
Pin-Priority: 800
6.5 使用 dpkg 直接安装
# 安装 .deb 包
sudo dpkg -i package.deb
# 修复依赖问题
sudo apt install -f
# 查看 .deb 包信息
dpkg-deb --info package.deb
# 列出 .deb 包内容
dpkg-deb --contents package.deb
# 重新配置已安装的包
sudo dpkg-reconfigure package_name
6.6 安全更新管理
# 安装 unattended-upgrades 自动安全更新
sudo apt install unattended-upgrades -y
# 配置自动更新
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
// 启用自动安全更新
Unattended-Upgrade::Origins-Pattern {
"origin=Debian,codename=${distro_codename},label=Debian-Security";
};
// 自动删除不再需要的依赖
Unattended-Upgrade::Remove-Unused-Dependencies "true";
// 自动重启(如果内核更新)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
# 启用自动更新服务
sudo dpkg-reconfigure -plow unattended-upgrades
7. 防火墙与安全配置
▼
7.1 配置 UFW 防火墙
# 安装 UFW
sudo apt install ufw -y
# 查看状态
sudo ufw status
sudo ufw status verbose
# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许 SSH
sudo ufw allow ssh
# 或指定端口
sudo ufw allow 22/tcp
# 允许 HTTP/HTTPS
sudo ufw allow http
sudo ufw allow https
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 允许特定端口
sudo ufw allow 8080/tcp
sudo ufw allow 3306/tcp
# 允许特定IP访问
sudo ufw allow from 192.168.1.0/24
sudo ufw allow from 192.168.1.100 to any port 22
# 删除规则
sudo ufw delete allow 8080/tcp
sudo ufw delete allow from 192.168.1.0/24
# 启用防火墙
sudo ufw enable
# 禁用防火墙
sudo ufw disable
# 查看编号规则
sudo ufw status numbered
sudo ufw delete 3 # 删除第3条规则
7.2 配置 iptables/nftables
# Debian 13 默认使用 nftables
sudo apt install nftables -y
sudo systemctl enable 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;
# 允许已建立的连接
ct state established,related accept
# 允许回环
iif lo accept
# 允许 SSH
tcp dport 22 accept
# 允许 HTTP/HTTPS
tcp dport 80 accept
tcp dport 443 accept
# 允许 ICMP
ip protocol icmp accept
# 允许本地网络
ip saddr 192.168.1.0/24 accept
# 限制 SSH 连接速率
tcp dport 22 ct state new limit rate 5/minute accept
# 记录并丢弃其他
log prefix "nftables-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 restart nftables
7.3 配置 Fail2Ban
# 安装 Fail2Ban
sudo apt install fail2ban -y
# 创建本地配置
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
# 忽略的IP(白名单)
ignoreip = 127.0.0.1/8 192.168.1.0/24
# 封禁时间(秒)
bantime = 3600
# 检测时间窗口
findtime = 600
# 最大失败次数
maxretry = 3
# 通知邮件
destemail = admin@example.com
sendername = Fail2Ban
action = %(action_mwl)s
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
# 启动服务
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# 查看状态
sudo fail2ban-client status
sudo fail2ban-client status sshd
# 手动解封IP
sudo fail2ban-client set sshd unbanip 192.168.1.50
7.4 AppArmor 安全模块
# 查看 AppArmor 状态
sudo aa-status
# 列出配置文件
ls /etc/apparmor.d/
# 查看特定配置
cat /etc/apparmor.d/usr.sbin.nginx
# 设置为强制模式
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
# 设置为学习模式
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
# 禁用特定配置
sudo aa-disable /etc/apparmor.d/usr.sbin.nginx
# 重新加载配置
sudo systemctl reload apparmor
7.5 SSH 安全加固
# 编辑 SSH 配置
sudo nano /etc/ssh/sshd_config
# 安全配置项
Port 2222 # 修改默认端口
Protocol 2 # 仅使用SSHv2
PermitRootLogin no # 禁止root登录
PasswordAuthentication no # 禁用密码认证(使用密钥)
PubkeyAuthentication yes # 启用公钥认证
PermitEmptyPasswords no # 禁止空密码
MaxAuthTries 3 # 最大认证尝试次数
ClientAliveInterval 300 # 空闲超时(秒)
ClientAliveCountMax 2 # 最大空闲次数
X11Forwarding no # 禁用X11转发
AllowUsers admin deploy # 仅允许特定用户
AllowGroups sshusers # 仅允许特定组
# 加密算法限制
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,curve25519-sha256@libssh.org
# 重启 SSH
sudo systemctl restart sshd
# 测试连接(新开终端测试!)
ssh -p 2222 admin@server_ip
⚠️ 重要:修改 SSH 配置后,务必在新的终端窗口测试连接,确保配置正确后再关闭当前会话!
7.6 SSH 密钥认证配置
# 在客户端生成密钥对
ssh-keygen -t ed25519 -C "admin@example.com"
# 将公钥复制到服务器
ssh-copy-id -p 22 admin@server_ip
# 或手动复制
cat ~/.ssh/id_ed25519.pub | ssh admin@server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
8. SSH 远程管理
▼
8.1 SSH 客户端配置
# 编辑 SSH 客户端配置
nano ~/.ssh/config
# 服务器别名配置
Host myserver
HostName 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ServerAliveCountMax 3
Host webserver
HostName 10.0.0.10
User deploy
Port 22
IdentityFile ~/.ssh/deploy_key
# 使用别名连接
ssh myserver
8.2 SSH 端口转发
# 本地端口转发(将本地端口映射到远程服务器可达的主机)
ssh -L local_port:remote_host:remote_port user@server
ssh -L 3307:db-server:3306 admin@myserver
# 远程端口转发(将远程服务器端口映射到本地)
ssh -R remote_port:localhost:local_port user@server
ssh -R 8080:localhost:80 admin@myserver
# 动态端口转发(SOCKS代理)
ssh -D 1080 user@server
# 然后在浏览器设置 SOCKS5 代理为 localhost:1080
8.3 SSH 跳板机配置
# 使用 -J 参数指定跳板机
ssh -J jump_server target_server
ssh -J admin@jumphost admin@target
# 多级跳板
ssh -J jump1,jump2 target
# 在配置文件中设置
# ~/.ssh/config
Host target
HostName 10.0.0.100
User admin
ProxyJump jumphost
8.4 文件传输
# SCP 传输文件
scp local_file user@server:/remote/path
scp user@server:/remote/file /local/path
scp -r local_dir user@server:/remote/path # 递归传输目录
# 指定端口
scp -P 2222 local_file user@server:/remote/path
# SFTP 交互传输
sftp user@server
sftp> put local_file
sftp> get remote_file
sftp> ls
sftp> cd /path
sftp> lcd /local/path
sftp> mput *.txt
sftp> mget *.log
# rsync 同步文件
rsync -avz --progress /local/dir/ user@server:/remote/dir/
rsync -avz --delete /local/dir/ user@server:/remote/dir/ # 同步删除
rsync -avz -e "ssh -p 2222" /local/ user@server:/remote/ # 指定端口
8.5 SSH 会话管理
# 使用 tmux 管理持久会话
tmux new -s session_name # 创建新会话
tmux ls # 列出所有会话
tmux attach -t session_name # 连接会话
tmux detach # 分离会话 (Ctrl+b, d)
tmux kill-session -t session_name # 关闭会话
# 使用 screen
screen -S session_name # 创建会话
screen -ls # 列出会话
screen -r session_name # 重连
# Ctrl+a, d 分离会话
8.6 批量管理多台服务器
# 使用 SSH 批量执行命令
for host in server1 server2 server3; do
ssh admin@$host "uptime"
done
# 使用 pssh(需安装)
sudo apt install pssh -y
pssh -h hosts.txt -i "uptime"
pssh -h hosts.txt -i "sudo apt update"
# hosts.txt 格式
# admin@192.168.1.100:2222
# admin@192.168.1.101:2222
# admin@192.168.1.102:2222
9. 服务管理(Systemd)
▼
9.1 systemctl 基本命令
# 启动服务
sudo systemctl start service_name
# 停止服务
sudo systemctl stop service_name
# 重启服务
sudo systemctl restart service_name
# 重新加载配置(不重启服务)
sudo systemctl reload service_name
# 查看服务状态
sudo systemctl status service_name
# 启用服务开机启动
sudo systemctl enable service_name
# 禁用开机启动
sudo systemctl disable service_name
# 查看服务是否启用
sudo systemctl is-enabled service_name
# 立即启动并启用
sudo systemctl enable --now service_name
9.2 系统状态查看
# 查看系统启动时间
systemd-analyze
systemd-analyze blame # 各服务启动耗时
systemd-analyze critical-chain # 关键启动链
# 查看所有运行中的服务
systemctl list-units --type=service --state=running
# 查看所有失败的服务
systemctl list-units --type=service --state=failed
# 查看所有监听端口
systemctl list-sockets
# 查看系统日志
journalctl -xe # 最近的日志
journalctl -u service_name # 特定服务日志
journalctl --since today # 今日日志
journalctl --since "2026-01-01" # 指定日期
journalctl -f # 实时跟踪
journalctl -u nginx --since "1 hour ago"
9.3 创建自定义 Systemd 服务
# 创建服务文件
sudo nano /etc/systemd/system/myapp.service
[Unit]
Description=My Application Service
After=network.target
Wants=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/start.sh
ExecStop=/opt/myapp/bin/stop.sh
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=10
# 环境变量
Environment=NODE_ENV=production
Environment=PORT=3000
EnvironmentFile=/etc/myapp/env
# 安全设置
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/myapp/data
PrivateTmp=true
# 资源限制
LimitNOFILE=65536
MemoryMax=512M
CPUQuota=80%
[Install]
WantedBy=multi-user.target
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启动服务
sudo systemctl enable --now myapp
# 查看日志
sudo journalctl -u myapp -f
9.4 Systemd 定时器(替代 Cron)
# 创建定时任务文件
sudo nano /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
# 创建对应的服务文件
sudo nano /etc/systemd/system/backup.service
[Unit]
Description=Daily Backup Service
[Service]
Type=oneshot
User=root
ExecStart=/opt/scripts/backup.sh
[Install]
WantedBy=multi-user.target
# 启用定时器
sudo systemctl enable --now backup.timer
# 查看所有定时器
systemctl list-timers --all
# 查看下次执行时间
systemctl list-timers backup.timer
9.5 Systemd 资源控制
# 临时限制服务资源
sudo systemctl set-property nginx.service CPUQuota=50%
sudo systemctl set-property nginx.service MemoryMax=1G
# 查看服务资源使用
systemctl show nginx.service | grep -E "CPU|Memory"
# 使用 systemd-cgtop 监控
sudo systemd-cgtop
10. 磁盘与存储管理
▼
10.1 查看磁盘信息
# 查看磁盘使用情况
df -h
df -hT # 显示文件系统类型
# 查看目录大小
du -sh /var/*
du -h --max-depth=1 /var
# 查看块设备
lsblk
lsblk -f # 显示文件系统信息
# 查看磁盘详细信息
sudo fdisk -l
sudo parted -l
# 查看磁盘 I/O 性能
iostat -x 1 5
sudo iotop
10.2 磁盘分区与格式化
# 使用 parted 分区(推荐用于大容量磁盘)
sudo parted /dev/sdb
(parted) mklabel gpt
(parted) mkpart primary ext4 0% 100%
(parted) print
(parted) quit
# 使用 fdisk 分区
sudo fdisk /dev/sdb
# 按 n 新建分区
# 按 p 选择主分区
# 按 w 保存退出
# 格式化分区
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.xfs /dev/sdb1
# 创建 swap 分区
sudo mkswap /dev/sdb2
sudo swapon /dev/sdb2
# 查看 swap
swapon --show
free -h
10.3 挂载与 fstab 配置
# 临时挂载
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
# 查看 UUID
sudo blkid
# 编辑 fstab 实现开机自动挂载
sudo nano /etc/fstab
# /etc/fstab 格式:
#
UUID=xxxx / ext4 errors=remount-ro 0 1
UUID=xxxx /boot ext4 defaults 0 2
UUID=xxxx /var ext4 defaults 0 2
UUID=xxxx /mnt/data ext4 defaults,noatime 0 2
UUID=xxxx none swap sw 0 0
# NFS 挂载
server:/share /mnt/nfs nfs defaults,soft,timeo=30 0 0
# tmpfs 挂载
tmpfs /tmp tmpfs defaults,size=2G 0 0
# 测试 fstab(重要!错误配置可能导致系统无法启动)
sudo mount -a
# 卸载
sudo umount /mnt/data
sudo umount -f /mnt/data # 强制卸载
10.4 LVM 逻辑卷管理
# 安装 LVM
sudo apt install lvm2 -y
# 创建物理卷
sudo pvcreate /dev/sdb1 /dev/sdc1
# 创建卷组
sudo vgcreate datavg /dev/sdb1 /dev/sdc1
# 创建逻辑卷
sudo lvcreate -L 100G -n datalv datavg
sudo lvcreate -l 100%FREE -n datalv datavg # 使用全部剩余空间
# 格式化并挂载
sudo mkfs.ext4 /dev/datavg/datalv
sudo mkdir /data
sudo mount /dev/datavg/datalv /data
# 扩展逻辑卷
sudo lvextend -L +50G /dev/datavg/datalv
sudo resize2fs /dev/datavg/datalv # ext4
sudo xfs_growfs /data # xfs
# 查看 LVM 信息
sudo pvs # 物理卷
sudo vgs # 卷组
sudo lvs # 逻辑卷
sudo pvdisplay
sudo vgdisplay
sudo lvdisplay
10.5 RAID 配置(mdadm)
# 安装 mdadm
sudo apt install mdadm -y
# 创建 RAID 1(镜像)
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
# 创建 RAID 5(带校验的条带)
sudo mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
# 查看 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
# 格式化并挂载
sudo mkfs.ext4 /dev/md0
sudo mount /dev/md0 /data
10.6 磁盘配额管理
# 安装配额工具
sudo apt install quota -y
# 在 fstab 中启用配额
# UUID=xxxx /home ext4 defaults,usrquota,grpquota 0 2
# 创建配额文件
sudo quotacheck -cum /home
sudo quotaon /home
# 设置用户配额
sudo edquota -u username
# 设置 soft limit 和 hard limit
# 查看配额
quota -u username
repquota /home
11. 计划任务(Cron)
▼
11.1 Cron 基本语法
# Cron 时间格式
# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 日 (1 - 31)
# │ │ │ ┌───────────── 月 (1 - 12)
# │ │ │ │ ┌───────────── 星期 (0 - 7, 0和7都是周日)
# │ │ │ │ │
# * * * * * command
11.2 常用 Cron 表达式
| 表达式 | 说明 |
|---|---|
| * * * * * | 每分钟执行 |
| 0 * * * * | 每小时执行 |
| 0 0 * * * | 每天午夜执行 |
| 0 2 * * * | 每天凌晨2点执行 |
| 0 0 * * 0 | 每周日午夜执行 |
| 0 0 1 * * | 每月1号执行 |
| /5 * * * | 每5分钟执行 |
| 0 /2 * * | 每2小时执行 |
| 0 0 * * 1-5 | 工作日午夜执行 |
| 0 0 1 1 * | 每年1月1日执行 |
| 0 8-18 * * 1-5 | 工作日8-18点每小时执行 |
11.3 管理 Cron 任务
# 编辑当前用户的 cron 任务
crontab -e
# 查看当前用户的 cron 任务
crontab -l
# 删除当前用户的所有 cron 任务
crontab -r
# 编辑指定用户的 cron 任务(需要root权限)
sudo crontab -u username -e
# 查看系统级 cron 配置
ls -la /etc/cron.d/
ls -la /etc/cron.daily/
ls -la /etc/cron.hourly/
ls -la /etc/cron.weekly/
ls -la /etc/cron.monthly/
cat /etc/crontab
11.4 Cron 使用示例
# 每天凌晨2点备份数据库
0 2 * * * /opt/scripts/backup_db.sh >> /var/log/backup.log 2>&1
# 每30分钟检查服务状态
*/30 * * * * /opt/scripts/check_services.sh
# 每天凌晨3点清理日志
0 3 * * * find /var/log -name "*.log" -mtime +30 -delete
# 每周一早上8点发送报告
0 8 * * 1 /opt/scripts/weekly_report.sh | mail -s "Weekly Report" admin@example.com
# 每小时同步时间
0 * * * * /usr/sbin/ntpdate pool.ntp.org >> /var/log/ntp.log 2>&1
11.5 使用 at 执行一次性任务
# 安装 at
sudo apt install at -y
# 设置10分钟后执行
echo "command" | at now + 10 minutes
# 设置明天下午3点执行
echo "/opt/scripts/task.sh" | at 15:00 tomorrow
# 查看待执行任务
atq
# 删除任务
atrm job_number
# 查看任务详情
at -c job_number
11.6 Cron 日志与调试
# 查看 cron 日志
grep CRON /var/log/syslog
# 或
journalctl -u cron
# 启用详细日志
# 编辑 /etc/rsyslog.d/50-default.conf
# 取消注释:cron.* /var/log/cron.log
sudo systemctl restart rsyslog
# 常见问题排查
# 1. 确保脚本有执行权限
chmod +x /opt/scripts/script.sh
# 2. 使用绝对路径
# 错误:python script.py
# 正确:/usr/bin/python3 /opt/scripts/script.py
# 3. 设置环境变量
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 2 * * * /opt/scripts/backup.sh
12. 日志管理
▼
12.1 系统日志概览
# 主要日志文件位置
/var/log/syslog # 系统全局日志
/var/log/auth.log # 认证日志(SSH登录等)
/var/log/kern.log # 内核日志
/var/log/daemon.log # 守护进程日志
/var/log/mail.log # 邮件日志
/var/log/messages # 一般消息
/var/log/boot.log # 启动日志
/var/log/dmesg # 内核启动消息
12.2 使用 journalctl 管理日志
# 查看所有日志
journalctl
# 实时查看日志
journalctl -f
journalctl -u nginx -f # 特定服务实时日志
# 按时间查看
journalctl --since "2026-01-01"
journalctl --since today
journalctl --since "2 hours ago"
journalctl --since "2026-01-01" --until "2026-01-02"
# 按服务查看
journalctl -u nginx
journalctl -u ssh
journalctl _SYSTEMD_UNIT=nginx.service
# 按优先级查看
journalctl -p err # 只显示错误及以上
journalctl -p warning
# 优先级:emerg(0) alert(1) crit(2) err(3) warning(4) notice(5) info(6) debug(7)
# 按PID查看
journalctl _PID=1234
# 按用户查看
journalctl _UID=1000
# 查看磁盘使用
journalctl --disk-usage
# 查看启动日志
journalctl -b # 当前启动
journalctl -b -1 # 上次启动
journalctl --list-boots # 列出所有启动记录
12.3 配置日志轮转(logrotate)
# 查看默认配置
cat /etc/logrotate.conf
# 创建自定义轮转配置
sudo nano /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily # 每天轮转
missingok # 文件不存在不报错
rotate 30 # 保留30个历史文件
compress # 压缩旧日志
delaycompress # 延迟压缩
notifempty # 空文件不轮转
create 0640 www-data www-data # 创建新文件权限
dateext # 使用日期作为后缀
dateformat -%Y%m%d
sharedscripts # 共享脚本(只执行一次)
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
# Nginx 日志轮转配置示例
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
# 手动测试轮转
sudo logrotate -d /etc/logrotate.d/myapp # 测试(不执行)
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行
# 查看轮转状态
cat /var/lib/logrotate/status
12.4 rsyslog 配置
# 主配置文件
sudo nano /etc/rsyslog.conf
# 将日志发送到远程服务器
# 编辑 /etc/rsyslog.d/remote.conf
*.* @logserver.example.com:514 # UDP
*.* @@logserver.example.com:514 # TCP
# 按条件过滤日志
# /etc/rsyslog.d/custom.conf
if $programname == 'myapp' then /var/log/myapp.log
& stop
# 重启 rsyslog
sudo systemctl restart rsyslog
12.5 集中日志管理方案
生产环境建议使用集中日志管理系统:
- ELK Stack:Elasticsearch + Logstash + Kibana
- Loki:轻量级日志聚合系统,与Grafana集成
- Graylog:功能丰富的日志管理平台
- Fluentd/Fluent Bit:统一日志收集层
# 安装 Promtail(Loki客户端)
curl -O -L "https://github.com/grafana/loki/releases/latest/download/promtail-linux-amd64.zip"
unzip promtail-linux-amd64.zip
sudo mv promtail-linux-amd64 /usr/local/bin/promtail
sudo chmod +x /usr/local/bin/promtail
# 配置 Promtail
sudo nano /etc/promtail/config.yml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki-server:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*.log
- job_name: nginx
static_configs:
- targets:
- localhost
labels:
job: nginx
__path__: /var/log/nginx/*.log
13. 备份与恢复
▼
13.1 备份策略
遵循 3-2-1 备份原则:
- 3 份数据副本(1份原始 + 2份备份)
- 2 种不同存储介质
- 1 份异地备份
13.2 rsync 增量备份
# 完整备份脚本 /opt/scripts/backup.sh
#!/bin/bash
BACKUP_DIR="/backup"
SOURCE_DIR="/var/www /etc /home"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/backup_${DATE}.log"
# 创建备份目录
mkdir -p ${BACKUP_DIR}/${DATE}
# 执行备份
rsync -avz --delete \
--exclude="*.tmp" \
--exclude="/var/cache" \
--exclude="/tmp" \
${SOURCE_DIR} ${BACKUP_DIR}/${DATE}/ 2>&1 | tee ${LOG_FILE}
# 检查退出状态
if [ ${PIPESTATUS[0]} -eq 0 ]; then
echo "备份成功: ${DATE}" >> /var/log/backup.log
else
echo "备份失败: ${DATE}" >> /var/log/backup.log
fi
# 清理30天前的备份
find ${BACKUP_DIR} -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
# 压缩备份
tar -czf ${BACKUP_DIR}/backup_${DATE}.tar.gz -C ${BACKUP_DIR} ${DATE}
rm -rf ${BACKUP_DIR}/${DATE}
13.3 使用 restic 进行备份
# 安装 restic
sudo apt install restic -y
# 初始化备份仓库
restic -r /backup/restic-repo init
restic -r s3:s3.amazonaws.com/my-backup-bucket init
# 执行备份
restic -r /backup/restic-repo backup /var/www /etc /home
restic -r /backup/restic-repo backup --exclude="*.tmp" /var/www
# 查看快照
restic -r /backup/restic-repo snapshots
# 恢复备份
restic -r /backup/restic-repo restore latest --target /restore/
restic -r /backup/restic-repo restore snapshot_id --target /restore/
# 清理旧快照(保留策略)
restic -r /backup/restic-repo forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12
restic -r /backup/restic-repo forget --prune --keep-last 10
13.4 数据库备份
# MySQL/MariaDB 备份
mysqldump -u root -p --all-databases --single-transaction --routines --triggers > /backup/mysql_full_$(date +%Y%m%d).sql
# 压缩备份
mysqldump -u root -p --all-databases | gzip > /backup/mysql_$(date +%Y%m%d).sql.gz
# 单库备份
mysqldump -u root -p database_name > /backup/db_name_$(date +%Y%m%d).sql
# PostgreSQL 备份
pg_dumpall -U postgres > /backup/pg_full_$(date +%Y%m%d).sql
pg_dump -U postgres -Fc database_name > /backup/db_name_$(date +%Y%m%d).dump
# 恢复 MySQL
mysql -u root -p database_name < backup.sql
gunzip < backup.sql.gz | mysql -u root -p database_name
# 恢复 PostgreSQL
psql -U postgres database_name < backup.dump
13.5 系统完整备份
# 使用 dd 创建磁盘镜像
sudo dd if=/dev/sda of=/backup/disk_full.img bs=4M status=progress
# 使用 Clonezilla
sudo apt install clonezilla -y
# 使用 fsarchiver(分区级备份)
sudo apt install fsarchiver -y
sudo fsarchiver savefs /backup/system.fsa /dev/sda1 /dev/sda2 -v
# 恢复
sudo fsarchiver restfs /backup/system.fsa id=0,dest=/dev/sda1
sudo fsarchiver restfs /backup/system.fsa id=1,dest=/dev/sda2
13.6 自动备份脚本
#!/bin/bash
# /opt/scripts/auto_backup.sh
# 配置
BACKUP_ROOT="/backup"
DATE=$(date +%Y%m%d)
RETENTION_DAYS=30
# 数据库备份
echo "[$(date)] 开始数据库备份..."
mysqldump -u root -p${DB_PASSWORD} --all-databases | gzip > ${BACKUP_ROOT}/mysql_${DATE}.sql.gz
# 文件备份
echo "[$(date)] 开始文件备份..."
rsync -az --delete /var/www/ ${BACKUP_ROOT}/www/
rsync -az /etc/ ${BACKUP_ROOT}/etc_${DATE}/
# 打包归档
echo "[$(date)] 开始打包..."
tar -czf ${BACKUP_ROOT}/backup_${DATE}.tar.gz \
${BACKUP_ROOT}/mysql_${DATE}.sql.gz \
${BACKUP_ROOT}/www \
${BACKUP_ROOT}/etc_${DATE}
# 上传到远程服务器
echo "[$(date)] 上传到远程..."
rsync -az --progress ${BACKUP_ROOT}/backup_${DATE}.tar.gz \
backup-user@remote-server:/backup/
# 清理旧备份
echo "[$(date)] 清理旧备份..."
find ${BACKUP_ROOT} -name "backup_*.tar.gz" -mtime +${RETENTION_DAYS} -delete
echo "[$(date)] 备份完成!" | mail -s "备份报告" admin@example.com
13.7 灾难恢复计划
- 定期测试恢复过程(至少每季度一次)
- 记录详细的恢复步骤
- 保持离线备份副本
- 验证备份完整性
- 文档化所有配置和依赖关系
14. Web 服务器配置
▼
14.1 安装 Nginx
# 安装 Nginx
sudo apt install nginx -y
# 启动并启用服务
sudo systemctl enable --now nginx
# 查看版本
nginx -v
# 检查配置语法
sudo nginx -t
# 查看状态
sudo systemctl status nginx
14.2 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" "$http_x_forwarded_for" '
'rt=$request_time';
access_log /var/log/nginx/access.log main;
# 性能优化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 100M;
server_tokens off;
# 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;
# 安全头
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 "no-referrer-when-downgrade" always;
# 包含站点配置
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
14.3 配置虚拟主机
# 创建站点配置
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/log/nginx/example.com.access.log main;
error_log /var/log/nginx/example.com.error.log;
# 主配置
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP 处理
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# 防盗链
location ~* \.(jpg|jpeg|png|gif)$ {
valid_referers none blocked example.com www.example.com;
if ($invalid_referer) {
return 403;
}
}
}
# HTTPS 配置(使用 Let's Encrypt)
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
root /var/www/example.com/html;
# SSL 证书
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL 优化
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;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
}
}
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
# 启用站点
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
14.4 安装 Let's Encrypt 证书
# 安装 certbot
sudo apt install certbot python3-certbot-nginx -y
# 自动申请并配置证书
sudo certbot --nginx -d example.com -d www.example.com
# 仅申请证书(手动配置)
sudo certbot certonly --webroot -w /var/www/example.com/html -d example.com
# 自动续期测试
sudo certbot renew --dry-run
# certbot 会自动添加 cron 任务进行续期
cat /etc/cron.d/certbot
14.5 Nginx 反向代理
# 反向代理配置
upstream backend_servers {
least_conn; # 最少连接算法
server 10.0.0.10:8080 weight=3;
server 10.0.0.11:8080 weight=2;
server 10.0.0.12:8080 backup; # 备用服务器
keepalive 32;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend_servers;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 缓冲设置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
}
# WebSocket 支持
location /ws {
proxy_pass http://backend_servers;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
14.6 安装 Apache
# 安装 Apache
sudo apt install apache2 -y
# 启用常用模块
sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod headers
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod http2
# 重启 Apache
sudo systemctl restart apache2
# 虚拟主机配置
sudo nano /etc/apache2/sites-available/example.com.conf
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/html
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined
# 安全头
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
# 启用站点
sudo a2ensite example.com.conf
sudo systemctl reload apache2
15. 数据库服务
▼
15.1 安装 MySQL/MariaDB
# 安装 MariaDB(Debian 默认)
sudo apt install mariadb-server mariadb-client -y
# 或安装 MySQL
sudo apt install mysql-server mysql-client -y
# 安全初始化
sudo mysql_secure_installation
# 设置 root 密码
# 移除匿名用户
# 禁止远程 root 登录
# 删除测试数据库
# 重新加载权限表
15.2 MySQL/MariaDB 配置优化
# 编辑配置文件
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
# 基本设置
bind-address = 0.0.0.0 # 允许远程连接(注意安全)
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_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_io_capacity = 2000
# 查询缓存
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M
# 日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[mysqldump]
quick
max_allowed_packet = 64M
# 重启服务
sudo systemctl restart mariadb
15.3 用户与权限管理
# 登录 MySQL
mysql -u root -p
# 创建数据库
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 创建用户
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'strong_password';
CREATE USER 'appuser'@'%' IDENTIFIED BY 'strong_password'; -- 允许远程连接
# 授权
GRANT ALL PRIVILEGES ON myapp.* TO 'appuser'@'localhost';
GRANT SELECT, INSERT, UPDATE ON myapp.* TO 'readonly'@'localhost';
GRANT SELECT ON myapp.* TO 'report'@'192.168.1.%'; -- 允许特定网段
-- 刷新权限
FLUSH PRIVILEGES;
-- 查看权限
SHOW GRANTS FOR 'appuser'@'localhost';
-- 查看用户
SELECT user, host FROM mysql.user;
-- 删除用户
DROP USER 'appuser'@'localhost';
15.4 安装 PostgreSQL
# 安装 PostgreSQL
sudo apt install postgresql postgresql-contrib -y
# 启动服务
sudo systemctl enable --now postgresql
# 切换到 postgres 用户
sudo -i -u postgres
# 进入 PostgreSQL 控制台
psql
# 或创建数据库和用户
createuser --interactive
createdb myapp
15.5 PostgreSQL 配置优化
# 编辑配置
sudo nano /etc/postgresql/17/main/postgresql.conf
# 连接设置
listen_addresses = '*'
max_connections = 200
superuser_reserved_connections = 3
# 内存设置
shared_buffers = 1GB # 物理内存的 25%
effective_cache_size = 3GB # 物理内存的 75%
work_mem = 16MB # 每个排序/哈希操作
maintenance_work_mem = 256MB
# WAL 设置
wal_level = replica
max_wal_size = 2GB
min_wal_size = 1GB
checkpoint_completion_target = 0.9
# 查询优化
random_page_cost = 1.1 # SSD 磁盘
effective_io_concurrency = 200 # SSD
# 日志
log_min_duration_statement = 1000 # 记录超过1秒的查询
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
# 自动清理
autovacuum = on
autovacuum_max_workers = 3
# 配置客户端认证
sudo nano /etc/postgresql/17/main/pg_hba.conf
# 添加远程访问规则
# host all all 192.168.1.0/24 scram-sha-256
# 重启服务
sudo systemctl restart postgresql
15.6 数据库主从复制
MySQL 主从配置
# 主库配置 /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 100M
sync_binlog = 1
# 在主库创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
# 查看主库状态
SHOW MASTER STATUS;
# 从库配置
[mysqld]
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin
read_only = 1
log_slave_updates = 1
# 在从库配置复制
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G
15.7 Redis 安装与配置
# 安装 Redis
sudo apt install redis-server -y
# 编辑配置
sudo nano /etc/redis/redis.conf
# 基本配置
bind 127.0.0.1 ::1 # 绑定地址
port 6379
daemonize yes
supervised systemd
# 安全
requirepass your_strong_password
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""
# 内存管理
maxmemory 2gb
maxmemory-policy allkeys-lru
# 持久化
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
# 重启服务
sudo systemctl restart redis-server
# 测试连接
redis-cli -a your_strong_password
redis> ping
PONG
16. 邮件服务器
▼
16.1 安装 Postfix(MTA)
# 安装 Postfix
sudo apt install postfix mailutils -y
# 安装过程中选择 "Internet Site"
# 设置邮件域名:mail.example.com
# 重新配置
sudo dpkg-reconfigure postfix
16.2 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
inet_interfaces = all
inet_protocols = all
# TLS 设置
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_use_tls = yes
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_sasl_authenticated, permit_mynetworks, reject_unauth_destination
# 邮件大小限制
message_size_limit = 52428800 # 50MB
# 别名
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
16.3 安装 Dovecot(IMAP/POP3)
# 安装 Dovecot
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-sieve dovecot-managesieved -y
# 编辑配置
sudo nano /etc/dovecot/conf.d/10-mail.conf
# 邮件存储位置
mail_location = maildir:~/Maildir
# 认证配置
sudo nano /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = plain login
# SSL 配置
sudo nano /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_cert =
**16.4 配置 DKIM 签名** **16.5 SPF、DMARC DNS 记录** **16.6 配置 SpamAssassin**
``
**17. 容器技术(Docker)** ▼ **17.1 安装 Docker** **17.2 Docker 配置优化** **17.3 Docker 基本操作** **17.4 Docker Compose 使用** **17.5 Dockerfile 编写** **17.6 Docker 安全最佳实践** **17.7 Podman(无守护进程的容器引擎)** **18. 性能优化** ▼ **18.1 系统监控工具** **18.2 内核参数优化** **18.3 启用 TCP BBR** **18.4 文件描述符限制** **18.5 Nginx 性能优化** **18.6 PHP-FPM 优化** **18.7 MySQL 性能调优** **18.8 使用缓存提升性能** **18.9 性能基准测试** **19. 故障排查** ▼ **19.1 系统启动故障** **19.2 网络故障排查** **19.3 磁盘空间问题** **19.4 内存与 CPU 问题** **19.5 服务故障排查** **19.6 数据库故障排查** **19.7 常用排查命令汇总** **20. 系统升级与维护** ▼ **20.1 日常维护任务** **20.2 系统版本升级** ⚠️ 大版本升级前务必创建完整的系统备份!建议在测试环境先进行验证。 **20.3 内核管理** **20.4 自动化运维脚本** **20.5 监控系统搭建** **20.6 安全审计与加固** **20.7 维护检查清单** ✅ 恭喜!您已完成 Debian 13.2 LTS 服务器版操作系统的完整学习教程。建议在实际操作前先在测试环境中进行练习。 **参考资源:**