Debian 13.2 LTS 服务器版操作系统详细教程

IT 技术 78 阅读 更新于 2026-09-04 08:00

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 系统要求

配置项最低要求推荐配置
CPU1 GHz 单核2 GHz 多核
内存512 MB2 GB 以上
硬盘10 GB50 GB 以上
网络100 Mbps1 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/efi512 MBFAT32EFI系统分区(UEFI模式需要)
/boot1 GBext4引导分区
/30 GBext4根分区
/var20 GBext4日志和变量数据
/home剩余空间ext4用户数据
swap内存×1~2swap交换分区

步骤六:软件选择

服务器安装时建议选择最小化安装:

  • 取消勾选 "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 服务器版操作系统的完整学习教程。建议在实际操作前先在测试环境中进行练习。 **参考资源:**

← 返回IT 技术 yicool 百科 · Debian 13.2 LTS 服务器版操作系统详细教程

评论 0