这份手册是我维护 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/syslog | Debian 系统综合日志 |
/var/log/auth.log | 登录、sudo、SSH 认证(查暴力破解看这里) |
/var/log/nginx/ | Nginx 访问与错误日志 |
/var/log/mysql/error.log | MySQL / 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 暴露到远端 80806.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 可提前升非 LTS9.6 升级前的检查清单
- 备份:
/etc、数据库、面板与应用数据(三重备份,至少一份在另一台机器)。 - 记录现状:
cat /etc/os-release、uname -r、apt list --installed | wc -l、关键服务清单。 - 确认能进控制台/VNC(网络配置改坏时是唯一救命通道)。
- 在非关键机器上先跑一遍。生产升级放维护窗口。
- 升级后验收:服务是否都起来了(
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 10fq 队列是关键,少了它 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 32ip 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.targetsystemctl 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-world11.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-stream11.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防火墙保命准则:
- 先加规则,再删规则。删掉的若是当前 SSH 端口的放行规则,你会当场断线,且再也连不上(只能靠云控制台 VNC 救)。
- 实时链与落盘规则文件要逐行核对一致(1Panel 的规则文件在
/opt/1panel/firewall/)。 default deny incoming一定放在规则都加好之后。fail2ban只管暴力破解、不管端口放行,两件事别混。- Docker 发布的端口在
ufw眼里是「已放行」的,安全边界要用iptables -I DOCKER-USER那条链来加限制。
十五、定时任务
crontab -l # 看当前用户的任务
crontab -e # 编辑(保存即生效)
ls /etc/cron.d/ # 系统级任务语法(分 时 日 月 周):
0 3 * * * 每天 03:00
*/10 * * * * 每 10 分钟
30 4 * * 0 每周日 04:300 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 # 见第十三节:会删数据卷五条日常习惯:
- 改配置先备份:
cp x.conf x.conf.bak.$(date +%F)。 - 删除先干跑:
rsync -n、rm -i,或先ls一遍。 - 重载前先测语法:
nginx -t、php -l。 - 改主机防火墙时保留一个已登录的 SSH 会话,新规则在新窗口验证通过再关旧窗口。
- 备份要异地:本机备份防不了机器丢。重要数据至少两份,其中一份在另一台机器或另一个机房。
附:一页速查
# 系统
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)。这套顺序能覆盖八成线上故障。
暂无评论