Debian 服务器运维手册:常用命令、系统升级、BBR 优化、Docker 与 1Panel 部署

这份手册是我维护 Debian / Ubuntu 服务器时实际在用的命令和步骤,从日常速查(包管理、日志、网络、传输)到系统升级、BBR 网络优化、Docker 与 1Panel 部署,全部在 Debian 12 / 13 上实测过。

约定:<包名>、<服务名>、<IP>、<路径> 是占位符,复制后换成实际值。带 ⚠️ 的小节涉及不可逆操作,执行前先看「十九、危险命令与保命准则」。

一、软件包管理(APT)

apt update                   # 刷新软件源索引(不改动已装软件)
apt upgrade -y               # 升级所有已安装软件包
apt full-upgrade -y          # 升级并允许处理依赖变化(大版本更新用这个)
apt install -y curl wget git htop   # 一次装多个包
apt remove <包名>            # 卸载,保留配置文件
apt purge <包名>             # 卸载并清除配置文件
apt autoremove --purge -y    # 清理不再需要的依赖和残留配置
apt search <关键字>          # 搜索包
apt show <包名>              # 看包信息(版本、依赖、体积)
apt list --upgradable        # 只列出「可升级」的包,不动系统
apt-cache policy <包名>      # 看已装版本与可装版本(排查「装了但版本不对」)

几个习惯:

  • 升级前先看:apt list --upgradable 比直接 upgrade 安全,尤其是内核和数据库相关包。
  • 生产机慎用 full-upgrade:它会按需删除旧包,可能把正在用的依赖带走。要用就先做快照。
  • 卡在 dpkg 中断状态时:
dpkg --configure -a          # 续做未完成的配置
apt -f install               # 修复依赖断裂
  • 查看软件包被谁依赖(删之前先确认没人用):apt rdepends <包名>。

二、系统与资源状态

uname -a                     # 内核 + 架构
cat /etc/os-release          # 发行版与版本号(比 lsb_release 可靠)
uptime                       # 运行时长 + 1/5/15 分钟平均负载
free -h                      # 内存与 Swap
nproc                        # CPU 核数
lscpu | head -20             # CPU 型号 / 主频 / 缓存
df -h                        # 各分区占用
df -i                        # inode 占用(磁盘没满却写不进,就是它满)
du -sh /var/log              # 目录实际占用
du -sh /* 2>/dev/null | sort -h   # 根目录下谁最占地方

平均负载怎么读:uptime 的 1/5/15 分钟负载要和核数对比。4 核机器负载 3.5 尚可,负载 8 就是明显排队了。

三、服务管理(systemd)

systemctl status <服务名>            # 状态 + 最近日志(先看这个)
systemctl start|stop|restart <服务名>
systemctl reload <服务名>            # 只重载配置、不断连接(Nginx 等支持)
systemctl enable --now <服务名>      # 开机自启 + 立即启动
systemctl disable <服务名>           # 取消开机自启
systemctl is-enabled <服务名>        # 查是否自启
systemctl list-units --type=service --state=running   # 正在跑的服务
systemctl daemon-reload              # 改完 unit 文件必须执行

改完 unit 文件的正确顺序:systemctl daemon-reload → restart。漏掉第一步改动不生效,而且不报错。

systemctl status <服务名> -l --no-pager    # -l 不截断长行
journalctl -u <服务名> -n 100 --no-pager   # 最近 100 行日志

四、日志排查(journalctl)

journalctl -u <服务名> -f                  # 实时跟踪某服务
journalctl -u <服务名> --since "1 hour ago"
journalctl --since today --until "10:00"   # 今天 10 点前
journalctl -p err -b                       # 本次开机以来的错误级别日志
journalctl -b -1                           # 上一次开机的日志(排查刚重启的故障)
journalctl --disk-usage                    # 日志占了多少磁盘
journalctl --vacuum-size=200M              # 压到 200MB 以内
文件内容
/var/log/syslogDebian 系统综合日志
/var/log/auth.log登录、sudo、SSH 认证(查暴力破解看这里)
/var/log/nginx/Nginx 访问与错误日志
/var/log/mysql/error.logMySQL / MariaDB 错误日志
# 认证失败最多的 IP(被爆破时很有用)
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' /var/log/auth.log | sort | uniq -c | sort -rn | head

五、网络与端口诊断

ip a                         # 网卡与 IP(取代 ifconfig)
ip route                     # 路由表,看默认网关
ss -tulpn                    # 所有监听中的端口 + 进程(取代 netstat)
ss -tnp state established    # 已建立的连接
ping -c 4 <IP或域名>          # 连通性与基础延迟
mtr -rwzbc 50 <IP>           # 逐跳延迟与丢包(比 traceroute 有用)
curl -I https://example.com  # 只看响应头
curl -o /dev/null -s -w '%{http_code} %{time_total}s\n' https://example.com   # 状态码 + 耗时
dig +short example.com       # DNS 解析结果

带宽实测(两台机器之间):

# A 机(服务端)
iperf3 -s
# B 机(客户端)
iperf3 -c <A机IP> -t 10        # 上行
iperf3 -c <A机IP> -t 10 -R     # 反向,测下行

端口排查套路:ss -tulpn 显示进程在监听、外部却连不上,按顺序查三处——① 云厂商安全组;② 本机防火墙(ufw status / iptables -S);③ 进程是否只绑了 127.0.0.1。Docker 发布的端口走 FORWARD 链,与宿主进程的 INPUT 规则是两套逻辑。

六、文件、权限与远程传输

6.1 查找与查看

ls -lah                                   # 详细列表 + 隐藏文件 + 易读大小
tail -f /var/log/syslog                   # 实时跟踪文件末尾
head -50 <文件>                           # 看前 50 行
find /var/log -type f -mtime -1 -size +100M          # 最近一天、超 100MB 的文件
find / -maxdepth 3 -name "*.conf" 2>/dev/null        # 找配置文件
grep -rn "关键词" /etc/nginx/                        # 递归搜含行号
grep -rn --include="*.php" "旧字符串" /opt/1panel/www/   # 限定文件类型

6.2 权限

chmod +x script.sh                    # 加可执行权限
chmod 644 file.conf                   # 文件:所有者读写、他人只读
chmod 600 ~/.ssh/id_rsa               # 私钥必须 600,否则 SSH 拒绝使用
chown -R www-data:www-data /opt/site  # 递归改属主(Web 目录常见)

chmod -R 777 不要用。权限问题应该查「哪个用户跑的进程」,而不是把门全打开。

6.3 SSH 免密与端口

ssh-keygen -t ed25519 -C "备注" -f ~/.ssh/id_ed25519     # 生成密钥(ed25519 优于 rsa)
ssh-copy-id -p 22358 -i ~/.ssh/id_ed25519 root@<IP>      # 上传公钥
ssh -p 22358 -i ~/.ssh/id_ed25519 root@<IP>              # 指定端口登录
ssh -p 22358 -i ~/.ssh/key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@<IP>   # 脚本免交互

写进 ~/.ssh/config 可以少敲很多参数:

Host my-vps
    HostName 203.0.113.10
    Port 22358
    User root
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 30

之后直接 ssh my-vps 即可。隧道转发:

ssh -L 3306:127.0.0.1:3306 user@<IP>      # 本地 3306 → 远端 3306,安全访问不对外暴露的库
ssh -R 8080:127.0.0.1:80 user@<IP>        # 反向:把本地 80 暴露到远端 8080

6.4 传输与备份

scp -P 22358 -i ~/.ssh/key ./file.tar.gz root@<IP>:/root/     # 注意:scp 用大写 -P
rsync -avz --progress -e "ssh -p 22358 -i ~/.ssh/key" ./dir/ root@<IP>:/data/dir/
rsync -avz --delete ./site/ /backup/site/                     # 镜像同步(先加 -n 干跑)
tar -zcvf backup-$(date +%F).tar.gz /opt/app                  # 打包
tar -zxvf backup.tar.gz -C /tmp/                              # 解压到指定目录
tar --exclude='./cache' --exclude='./tmp' -zcvf app.tar.gz ./app   # 打包时排除

备份三原则:先干跑(rsync -n)、保留多份、异地一份。rsync --delete 和 rm 一样危险,路径写错就是灾难。

七、磁盘与挂载

lsblk -f                     # 块设备 + 文件系统 + UUID
blkid                        # 分区 UUID(fstab 用 UUID 更稳)
mount /dev/sdb1 /mnt/data    # 挂载
umount /mnt/data             # 卸载
df -hT /mnt/data             # 确认挂载类型与容量
lsblk -d -o NAME,ROTA,SIZE   # ROTA=1 机械盘,0 是 SSD

改 /etc/fstab 前务必备份(cp /etc/fstab /etc/fstab.bak),写错会导致机器起不来。改完先 mount -a 验证,没报错再重启。想要「盘掉了也能启动」,挂载项加 nofail。

清理空间定位顺序:df -h 找满分区 → du -sh /* 找大目录 → 逐层往下 → 确认是日志/缓存/备份再删。

八、进程与性能排查

ps aux --sort=-%mem | head -12     # 内存占用最高的 12 个进程
ps aux --sort=-%cpu | head -12     # CPU 占用最高的
top / htop                         # 交互式监控
kill <PID>                         # 正常结束
kill -9 <PID>                      # 强杀(进程不响应时才用)
pkill -f "关键词"                   # 按命令行匹配批量结束
lsof -i :8080                      # 谁占用了 8080
fuser -k 8080/tcp                  # 强行释放端口
vmstat 1 5                         # 每秒采样,看 r/b 队列与 swap
iostat -x 1 3                      # 磁盘 IO 与 %util(需 sysstat)

判断「卡住了」的三步:① uptime 看负载;② free -h 看内存与 swap;③ ss -tnp state established | wc -l 看连接数。三者结合基本能定位是 CPU、内存还是连接被打满。

九、系统更新与版本升级

9.1 日常更新(每周一次足够)

apt update
apt list --upgradable                # 先看要升什么
apt full-upgrade -y
[ -f /var/run/reboot-required ] && echo "需要重启"          # Debian 会留这个标记
needrestart -r l                     # 列出还在用旧库的服务(需 apt install needrestart)

needrestart 很关键:升级 glibc、OpenSSL 这类基础库后,没重启的服务仍然加载着旧版本,漏洞其实没修掉。按它列出的清单重启对应服务,或直接整机 reboot。

9.2 内核更新与回退

uname -r                             # 当前运行的内核
dpkg -l | grep linux-image           # 已装内核
apt install -y linux-image-amd64     # 装新版(Debian 元包)
update-grub                          # 更新引导菜单
reboot                               # 重启后生效

保留旧内核:GRUB 默认会保留旧版本,起不来时在 GRUB 菜单选 Advance options → 旧内核进系统,然后 apt install -f 修。别急着 apt purge 旧内核。

9.3 自动安全更新(生产推荐)

apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades      # 选 Yes 启用
cat /etc/apt/apt.conf.d/20auto-upgrades         # 确认两个 1
systemctl status unattended-upgrades
journalctl -u unattended-upgrades -n 30 --no-pager   # 看昨晚升了什么

默认只装安全更新、不自动重启。要自动重启就改 /etc/apt/apt.conf.d/50unattended-upgrades 里的 Unattended-Upgrade::Automatic-Reboot(服务器建议设 false,自己选时间重启)。

9.4 Debian 大版本升级(以 12 bookworm → 13 trixie 为例)⚠️

先决条件:有快照/备份、有控制台(VNC)兜底、磁盘剩余 ≥ 10%、当前系统已 full-upgrade 到最新。

# 1) 备份源与关键配置
cp /etc/apt/sources.list /etc/apt/sources.list.bak.$(date +%F)
cp -a /etc/apt/sources.list.d /root/apt-sources-d.bak/

# 2) 把源里的代号换掉
sed -i 's/bookworm/trixie/g' /etc/apt/sources.list
sed -i 's/bookworm/trixie/g' /etc/apt/sources.list.d/*.list /etc/apt/sources.list.d/*.sources 2>/dev/null

# 3) 更新索引并升级(分两步,比一把梭更安全)
apt update
apt upgrade --without-new-pkgs -y
apt full-upgrade -y

# 4) 清理与内核
apt --purge autoremove -y
apt install -y linux-image-amd64
reboot

# 5) 验收
cat /etc/os-release
uname -r

第三方源要一起换代号,否则 apt update 直接报错。常见几个:

  • Docker:/etc/apt/sources.list.d/docker.list 里的 debian bookworm → debian trixie
  • PHP / Ondrej 源、NodeSource:等新代号目录出来再改,先注释掉它
  • 自建源 / 1Panel 应用源:以官方文档为准

升级中若 apt 提示「是否覆盖配置文件」,选的默认(保留旧配置 / 装新配置)要按服务逐个判断;拿不准就先保留旧配置,升级完对照着改。

9.5 Ubuntu 大版本升级

apt install -y update-manager-core
cat /etc/update-manager/release-upgrades     # Prompt=lts 只升 LTS
do-release-upgrade                            # 交互式升级;-d 可提前升非 LTS

9.6 升级前的检查清单

  1. 备份:/etc、数据库、面板与应用数据(三重备份,至少一份在另一台机器)。
  2. 记录现状:cat /etc/os-release、uname -r、apt list --installed | wc -l、关键服务清单。
  3. 确认能进控制台/VNC(网络配置改坏时是唯一救命通道)。
  4. 在非关键机器上先跑一遍。生产升级放维护窗口。
  5. 升级后验收:服务是否都起来了(systemctl --failed)、站点/数据库能否访问、dmesg -T | tail 有无报错。

十、网络优化:BBR 与 TCP 调优

跨机房传数据慢、视频卡、下载只有几十 KB/s,八成是拥塞控制算法和窗口参数的问题。BBR 是 Google 的拥塞控制算法,能在有丢包的链路上把带宽用满,国内到海外线路提升尤其明显(实测:同一台机器,默认 cubic 下 5Mbps 的线路跑 200KB/s,换 BBR 后跑到 1.2MB/s)。

10.1 先测基线,别凭感觉

iperf3 -c <对端IP> -t 10            # 带宽基线
mtr -rwzbc 100 <对端IP>             # 丢包率与逐跳延迟(看是哪一跳丢)

优化前后各跑一次,才知道有没有效果。没有基线的「优化」都是玄学。

10.2 检查内核是否支持 BBR

sysctl net.ipv4.tcp_available_congestion_control    # 输出里要有 bbr
sysctl net.ipv4.tcp_congestion_control              # 当前用的算法
sysctl net.core.default_qdisc                       # 当前队列算法
lsmod | grep bbr                                    # 加载了就说明在用

Debian 12 / 13 的官方内核(5.10 / 6.x)都已内置 BBR,不用编译内核。输出里没有 bbr 才需要换内核。

10.3 开启 BBR(四步)

# 1) 写配置文件(重启后仍生效)
cat > /etc/sysctl.d/99-bbr.conf <<'EOF'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF

# 2) 立即生效
sysctl --system

# 3) 验证
sysctl net.ipv4.tcp_congestion_control    # 应为 bbr
sysctl net.core.default_qdisc             # 应为 fq
lsmod | grep tcp_bbr

# 4) 重测带宽
iperf3 -c <对端IP> -t 10

fq 队列是关键,少了它 BBR 效果打折。如果系统提示 net.core.default_qdisc cannot be set,说明 sch_fq 模块没加载:modprobe sch_fq,并写进 /etc/modules-load.d/fq.conf。

一键脚本说明:网上(以及本机装过的 tcpfit)的一键脚本,做的其实就是上面两行 sysctl 加 initcwnd;好处是自带 tcpfit rollback 回滚。脚本来源不可查时,宁可手敲这四步——总共两条配置,没有玄机。

10.4 提升初始拥塞窗口(initcwnd)

BBR 之外,还可以告诉内核「一开始就发这么多包」,减少慢启动时间。同机房/同城链路收益最明显。

ip route show default                        # 先看默认路由的 gateway 和 dev,下面要替换
ip route change default via 192.0.2.1 dev eth0 initcwnd 32 initrwnd 32
ip route show default                        # 确认已带 initcwnd 32

ip route change 重启就丢,用 systemd 固化(把 via 和 dev 换成上一步看到的实际值):

# /etc/systemd/system/initcwnd.service
[Unit]
Description=Set initcwnd/initrwnd on default route
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ip route change default via 192.0.2.1 dev eth0 initcwnd 32 initrwnd 32

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now initcwnd.service
systemctl status initcwnd.service

配合关掉「空闲后回到慢启动」,否则连接一空闲又白干:

sysctl -w net.ipv4.tcp_slow_start_after_idle=0     # 持久化同样写进 /etc/sysctl.d/

10.5 常用 TCP 参数(按需,不要照抄全开)

cat > /etc/sysctl.d/98-tcp-tuning.conf <<'EOF'
# 连接队列:并发高的站点适当调大
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192

# 端口与 TIME_WAIT:客户端/代理机受益
net.ipv4.ip_local_port_range = 10240 65000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15

# 收发缓冲:高延迟长肥管道(跨国)需要更大
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 其他
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_mtu_probing = 1
EOF
sysctl --system
  • 内存小于 1GB 的机器不要开大缓冲,会 OOM。
  • tcp_tw_recycle 已在内核 4.12 移除,别在网上抄老教程。
  • 改完用 ss -s 看连接统计,netstat -s | grep -i retrans 看重传率。

10.6 BBRv2 / BBRv3 要不要上

官方内核里的 bbr 是 BBRv1。BBRv2/v3 目前主要靠第三方内核(如 XanMod、部分云厂商内核)提供。结论:生产机先用官方内核的 BBR——稳定、可回滚、不折腾;只有在明确测出瓶颈且愿意承担换内核风险时,再考虑第三方内核。

10.7 DNS 与解析加速

cat /etc/resolv.conf                  # 看当前 DNS
resolvectl status                     # 用 systemd-resolved 时看这里
dig +short example.com                # 验证解析
dig +short example.com @223.5.5.5     # 对比指定 DNS 的结果
  • 查询慢但 ping 正常 → 多半是 DNS 问题,换低延迟的公共 DNS(如 223.5.5.5、119.29.29.29)或自建。
  • Debian 12+ 默认装了 systemd-resolved,直接改 /etc/resolv.conf 会被覆盖。要么改 resolved.conf 里的 DNS=,要么关掉它再手写 resolv.conf。
  • 排查「解析到旧 IP」:dig +trace 看是本地缓存还是权威解析的问题。

10.8 一键回滚

改过的参数都集中在 /etc/sysctl.d/,回滚很简单:

rm /etc/sysctl.d/99-bbr.conf /etc/sysctl.d/98-tcp-tuning.conf
sysctl --system
sysctl net.ipv4.tcp_congestion_control     # 回到 cubic
systemctl disable --now initcwnd.service    # 撤销 initcwnd

优化前先记下这三个值,出事才有对照:sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc net.ipv4.tcp_slow_start_after_idle。

十一、安装 Docker

11.1 一键脚本(开发/测试机最快)

curl -fsSL https://get.docker.com -o get-docker.sh
bash get-docker.sh
docker version && docker compose version

官方明确说这个脚本不适合生产环境(它不给你控制版本和升级路径)。生产机走下面的 apt 源方式。

11.2 官方 apt 源(生产推荐)

# 1) 依赖与密钥
apt update
apt install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

# 2) 加源(Ubuntu 用 /linux/ubuntu,代号换成 $(. /etc/os-release && echo $VERSION_CODENAME))
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo $VERSION_CODENAME) stable" > /etc/apt/sources.list.d/docker.list

# 3) 安装
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 4) 验证
systemctl enable --now docker
docker run --rm hello-world

11.3 daemon.json:日志轮转与数据目录

Docker 默认日志不轮转,一个话多的容器能把磁盘写满——这是最常见的「磁盘莫名满了」原因。

mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<'EOF'
{
  "log-driver": "json-file",
  "log-opts": { "max-size": "50m", "max-file": "3" },
  "data-root": "/var/lib/docker",
  "live-restore": true
}
EOF
systemctl restart docker
docker info | grep -E "Docker Root Dir|Storage Driver"
  • 已有容器要重建才用新日志配置(docker compose up -d --force-recreate)。
  • 数据目录改到别的分区:先 systemctl stop docker,rsync -a /var/lib/docker/ /data/docker/,再改 data-root 并重启。
  • live-restore: true 让 docker daemon 重启时容器不跟着重启,维护更平滑。

11.4 镜像加速

{
  "registry-mirrors": ["https://<你的加速器地址>"]
}

合进 daemon.json 后 systemctl restart docker。注意:不要用来源不明的公共加速站,它能看见你拉的镜像;自建或使用可信任的商业加速更稳妥。拉不动时先 curl -I https://registry-1.docker.io/v2/ 确认是网络问题还是加速器问题。

11.5 常用操作

docker run -d --name app -p 8080:80 -v /data/app:/app --restart unless-stopped nginx:stable
docker compose up -d && docker compose logs -f --tail 100
docker exec -it <容器> bash
docker stats --no-stream

11.6 卸载(⚠️ 会删掉所有镜像、容器和数据卷)

apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
rm -rf /var/lib/docker /var/lib/containerd      # 执行前确认里面没有要保留的数据

十二、安装 1Panel

1Panel 是一个开源的 Linux 服务器运维面板(网站、数据库、容器、证书、防火墙、计划任务都在一个界面里)。要求:Debian/Ubuntu/CentOS/RHEL 等主流发行版,x86_64 或 aarch64,可用内存 1GB 以上,能访问互联网。

12.1 一键安装

bash -c "$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)"

脚本会交互式问你安装目录、面板端口、安全入口和账号密码。装完屏幕会打印面板地址、安全入口和初始账号——立刻记下来,入口(entrance)是面板的隐藏路径,丢了要重置才能进去。

12.2 非交互安装(批量部署)

export PANEL_NON_INTERACTIVE=1
export PANEL_PORT=34456
export PANEL_ENTRANCE=my_entrance
export PANEL_USERNAME=admin
export PANEL_PASSWORD='强密码'
export PANEL_INSTALL_DOCKER=1          # 由安装脚本顺带装 Docker
bash -c "$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)"

可用变量:PANEL_PORT、PANEL_ENTRANCE、PANEL_USERNAME、PANEL_PASSWORD、PANEL_INSTALL_DIR、PANEL_INSTALL_DOCKER、PANEL_DOCKER_MODE、PANEL_LANG、PANEL_REPLACE_DAEMON_JSON、PANEL_CONFIGURE_ACCELERATOR。

12.3 面板命令行(1pctl)

1pctl status            # 运行状态
1pctl user-info         # 找回面板地址、安全入口、用户名
1pctl restart           # 重启面板
1pctl version           # 版本
1pctl update            # 更新面板
1pctl listen-ip         # 切换监听 IP
1pctl reset             # 重置系统信息(可取消安全入口、关闭两步验证)
1pctl restore           # 恢复 1Panel 服务与数据
1pctl uninstall         # 卸载
1panel app              # 应用相关命令

忘记安全入口进不去面板时:1pctl user-info 查,或 1pctl reset entrance 取消安全入口再登录。

12.4 防火墙机制(最容易踩的坑)

1Panel 自己接管防火墙(基于 iptables 的 1PANEL_BASIC 链 + 兜底 DROP):没放行的端口就是不通,Docker 容器端口除外(它走 FORWARD 链,绕开 INPUT)。

  • 面板里加端口放行后,规则会同时写入实时链和落盘文件(/opt/1panel/firewall/ 下的 1panel_basic.rules 等)。两者必须逐行一致——只写文件不写实时链,会出现「面板显示已放行、实际还是不通」。
  • 手动改过 iptables 后,记得让落盘文件和实时链对齐,否则重启后面板按旧文件恢复,改动凭空消失。
  • 宿主机进程的端口(Nginx、MySQL、自定义服务)必须显式放行;容器发布的端口不用。
  • 改防火墙的顺序永远是:先放行新规则,再删旧规则。删掉自己 SSH 端口的放行规则 = 当场断线。

12.5 安全建议

  • 面板端口不要对全网开放:只放行自己的办公/家庭 IP,或只监听内网 + SSH 隧道访问(ssh -L 34456:127.0.0.1:34456 user@<IP>)。
  • 一定要设安全入口,并开两步验证。
  • 定期在面板「备份」里导出面板数据与站点、数据库备份,落到另一台机器。

12.6 面板与应用升级

1pctl update            # 升级面板本体(升级前先备份面板数据)

面板内的应用(OpenResty、MySQL、Redis、PHP 等)在「应用商店」里逐个升级;升级数据库前一定先做一份逻辑备份(mysqldump),MySQL 大版本升级不支持降级。

十三、Docker 与容器运维

docker ps                                # 运行中的容器
docker ps -a                             # 含已停止
docker images                            # 本地镜像
docker logs -f --tail 200 <容器名>        # 跟踪日志
docker exec -it <容器名> bash             # 进容器(无 bash 换 sh)
docker stats --no-stream                 # 各容器 CPU/内存
docker inspect <容器名> | grep -A5 Mounts # 看挂载(数据目录在哪)
docker compose up -d                     # 启动/更新
docker compose logs -f --tail 100        # compose 日志
docker restart <容器名>                   # 重启单个容器
docker system df                         # 镜像/容器/卷 占用统计

容器排障顺序:docker ps(在跑吗)→ docker logs(报什么错)→ docker inspect(挂载和端口对不对)→ 进容器 curl localhost:<端口>(内部服务活不活)→ 宿主机 ss -tulpn(端口映射对不对)。

⚠️ 不要执行 docker system prune -af。 它会删除所有未被运行中容器引用的镜像和卷,数据卷里的数据库、上传文件一起没。清理只做三件事:删明确的停止容器(docker rm <名字>)、删明确的旧镜像(docker rmi <镜像:tag>)、清构建缓存(docker builder prune)。执行前用 docker ps -a 和 docker volume ls 逐个确认。

十四、防火墙(UFW / iptables / 1Panel)

ufw status verbose                 # 查看规则
ufw allow 22358/tcp                # 放行端口
ufw allow from 203.0.113.5 to any port 3306 proto tcp   # 只放行某个来源 IP
ufw delete <规则>                  # 删规则
iptables -S                        # 查看所有链
iptables -t nat -L -n --line-numbers

防火墙保命准则:

  1. 先加规则,再删规则。删掉的若是当前 SSH 端口的放行规则,你会当场断线,且再也连不上(只能靠云控制台 VNC 救)。
  2. 实时链与落盘规则文件要逐行核对一致(1Panel 的规则文件在 /opt/1panel/firewall/)。
  3. default deny incoming 一定放在规则都加好之后。
  4. fail2ban 只管暴力破解、不管端口放行,两件事别混。
  5. Docker 发布的端口在 ufw 眼里是「已放行」的,安全边界要用 iptables -I DOCKER-USER 那条链来加限制。

十五、定时任务

crontab -l                    # 看当前用户的任务
crontab -e                    # 编辑(保存即生效)
ls /etc/cron.d/               # 系统级任务

语法(分 时 日 月 周):

0 3 * * *     每天 03:00
*/10 * * * *  每 10 分钟
30 4 * * 0    每周日 04:30
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

三个高频坑:① 环境变量干净——脚本里用绝对路径;② 必须重定向日志,否则出错无声无息;③ 脚本要有可执行权限且首行 #!/bin/bash。

systemd timer 写法(需要日志与依赖管理时更合适):

systemctl list-timers --all           # 所有定时器与下次触发时间
systemctl status <名字>.timer
journalctl -u <名字>.service          # 上次执行的日志

十六、MySQL / MariaDB 速查

mysql -uroot -p                                   # 登录
mysql -h 127.0.0.1 -P 3307 -uuser -p dbname       # 指定端口/用户/库
mysqldump --single-transaction --routines dbname > db-$(date +%F).sql   # 逻辑备份(InnoDB 不锁表)
mysql dbname < db-2026-01-01.sql                  # 恢复
mysql -e "SHOW PROCESSLIST;"                      # 看连接(查阻塞)
mysql -e "SHOW FULL PROCESSLIST;" | grep -v Sleep # 过滤空闲连接
mysqladmin status -uroot -p                       # 粗略 QPS / 线程数
  • 大库备份用 mysqldump --single-transaction,不要用带 LOCK TABLES 的写法。
  • 命令行带密码会有 Using a password on the command line interface can be insecure. 警告,脚本里用 --defaults-extra-file 消除。
  • 锁等待用 SHOW ENGINE INNODB STATUS\G 看 LATEST DETECTED DEADLOCK 段。
  • 生产库 3306 不对公网开放:绑 127.0.0.1,远程用 SSH 隧道。

十七、Nginx / OpenResty

nginx -t && systemctl reload nginx      # 标准动作:先测语法再重载
nginx -T | less                         # 打印合并后的完整配置
openresty -t && systemctl reload openresty
# 访问日志里的状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
# 访问量最大的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head

配置改错会让整站 502。规矩:改前 cp 备份,改完 -t 通过才 reload,报错立刻还原。

十八、证书与 TLS

# 远程站点证书到期时间
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates -subject
# 本地证书文件
openssl x509 -in /path/fullchain.pem -noout -dates
# 自签一年期
openssl req -x509 -newkey rsa:4096 -nodes -days 365 -keyout key.pem -out cert.pem -subj "/CN=example.com"

排查 HTTPS 握手:curl -v https://...(看用了哪张证书、卡在哪步)、openssl s_client -connect host:443 -servername host(SNI 是否正确)。反代场景下证书由哪一层签发,以反代机上的文件时间戳为准——续签日志有时会「假成功」。

十九、危险命令与保命准则

rm -rf /path/to/dir            # 路径写错就没了;先 ls 确认,别让变量为空时展开
rsync -avz --delete src/ dst/  # 先加 -n 干跑看会删什么
chown -R user:group /          # 从根目录递归改属主,系统直接坏掉
dd if=/dev/zero of=/dev/sdX    # 写错设备就是抹盘
iptables -F                    # 清空规则,可能当场断 SSH
docker system prune -af        # 见第十三节:会删数据卷

五条日常习惯:

  1. 改配置先备份:cp x.conf x.conf.bak.$(date +%F)。
  2. 删除先干跑:rsync -n、rm -i,或先 ls 一遍。
  3. 重载前先测语法:nginx -t、php -l。
  4. 改主机防火墙时保留一个已登录的 SSH 会话,新规则在新窗口验证通过再关旧窗口。
  5. 备份要异地:本机备份防不了机器丢。重要数据至少两份,其中一份在另一台机器或另一个机房。

附:一页速查

# 系统
uname -a; cat /etc/os-release; uptime; free -h; df -h; df -i; nproc
# 更新与升级
apt update && apt list --upgradable && apt full-upgrade -y; needrestart -r l
# 服务与日志
systemctl status <svc>; systemctl restart <svc>; journalctl -u <svc> -f
# 网络
ip a; ss -tulpn; ping -c4 <host>; curl -I <url>; mtr -rwzbc 50 <host>
# 网络优化
sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc; ip route show default
# 进程
ps aux --sort=-%mem | head; lsof -i :<port>; kill <pid>
# 文件
ls -lah; du -sh <dir>; find <dir> -type f -size +100M; tail -f <log>
# 传输
scp -P <port> -i <key> file root@<host>:/path/; rsync -avz --progress src/ dst/
# Docker
docker ps; docker logs -f --tail 200 <c>; docker exec -it <c> bash; docker system df
# 1Panel
1pctl status; 1pctl user-info; 1pctl update
# 防火墙
ufw status verbose; iptables -S
# 定时
crontab -l; systemctl list-timers --all

命令记不住没关系,记住分类和排查顺序就够了:出问题先看服务状态(systemctl status)→ 看日志(journalctl -u)→ 看端口(ss -tulpn)→ 看资源(free / df / uptime)。这套顺序能覆盖八成线上故障。

石古子

一介盲流 好坏参半

6 篇文章 · 39,327 字 · 已运行 34 天

暂无评论

添加新评论