服务器重启后的运维排查记录

2026年6月9日 server 10 分钟阅读 115 次阅读
📖 文章摘要

记录一次服务器重启后的运维排查全过程,解决 SSH 无法连接与缺少 Swap 分区两大问题,附完整修复步骤与原理讲解。

背景

今天对服务器进行了一次重启,目的是验证所有服务是否配置了开机自启。重启后遇到了两个问题:SSH 无法连接、服务器没有 Swap 分区。以下是排查和解决的完整过程。

问题一:重启后 SSH 无法连接

现象

服务器重启后,本地 SSH 连接超时,无法登录。通过云服务商 VNC 终端(控制台自带的网页终端,不需要 SSH)登录服务器排查。

排查过程

1. 确认网络连通性

ping 服务器IP

能 ping 通说明服务器在线,问题出在 SSH 服务本身。

2. 检查 SSH 服务状态

systemctl status sshd

输出:

Unit sshd.service could not be found.

奇怪,sshd 服务不存在?

实际上 Ubuntu 的 SSH 服务名是 ssh,不是 sshd(CentOS/RHEL 才叫 sshd)。这是一个常见的踩坑点。

systemctl status ssh

输出:

● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/usr/lib/systemd/system/ssh.service; disabled; preset: enabled)
     Active: active (running) since Sat 2026-07-11 21:31:28 CST; 2min 29s ago

服务在运行,但状态是 disabled(未设置开机自启)。这就是重启后断连的原因。

3. 确认端口配置

grep -i "^Port" /etc/ssh/sshd_config

输出:

Port SSH端口

配置没问题,SSH 监听的是自定义端口(修改了默认的 22 端口)。

4. 手动启动 SSH 服务

由于服务未开机自启,重启后没自动运行,需要手动拉起:

/usr/sbin/sshd

5. 验证端口监听

ss -tlnp | grep SSH端口

输出:

LISTEN  0  128  0.0.0.0:SSH端口  0.0.0.0:*  users:(("sshd",pid=1430,fd=3))
LISTEN  0  128     [::]:SSH端口     [::]:*  users:(("sshd",pid=1430,fd=4))

ss 命令用于查看网络连接状态,-tlnp 参数含义:

  • -t:显示 TCP 连接
  • -l:只显示监听状态的端口
  • -n:直接显示端口号,不解析为服务名
  • -p:显示进程名和 PID

看到端口在监听,SSH 可以连接了。

修复:设置开机自启

systemctl enable ssh

输出:

Synchronizing state of ssh.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ssh
Created symlink /etc/systemd/system/ssh.service → /usr/lib/systemd/system/ssh.service.
Created symlink /etc/systemd/system/multi-user.target.wants/ssh.service → /usr/lib/systemd/system/ssh.service.

systemctl enable 的本质是创建一个软链接,把 SSH 服务注册到系统启动目标(multi-user.target)中。这样每次开机时,systemd 就会自动启动 SSH 服务。

涉及的关键概念

systemd:Linux 的服务管理器,负责启动、停止、管理后台服务。每个服务有一个 .service 文件定义其行为。

systemctl:systemd 的命令行工具,常用操作:

  • systemctl start 服务名:立即启动
  • systemctl stop 服务名:停止
  • systemctl restart 服务名:重启
  • systemctl enable 服务名:设置开机自启
  • systemctl status 服务名:查看状态

服务名差异:不同发行版的 SSH 服务名不同,Ubuntu 叫 ssh,CentOS 叫 sshd

问题二:没有 Swap 分区

背景

之前博客 API 因为内存占用过高被 OOM Killer 杀掉过一次。当时服务器 1.6GB 内存没有任何 Swap 分区,一旦内存耗尽就直接崩溃,没有任何缓冲。

Swap 是什么

Swap(交换分区)是用硬盘空间模拟的虚拟内存。当物理内存不足时,系统会把暂时不用的数据从内存搬到 Swap 区域,腾出内存给急需的进程。虽然硬盘速度远不如内存,但至少不会直接 OOM 崩溃。

操作步骤

1. 创建 Swap 文件

fallocate -l 2G /swapfile

fallocate 快速分配指定大小的磁盘空间。-l 2G 表示创建 2GB。这会在根目录生成一个 2GB 的空文件 /swapfile

2. 设置权限

chmod 600 /swapfile

chmod 600 表示只有 root 用户可读写。Swap 文件包含内存中的敏感数据,必须限制访问权限。

3. 格式化为 Swap 格式

mkswap /swapfile

输出:

Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

mkswap 把文件格式化为 Swap 专用格式,类似用 mkfs.ext4 格式化硬盘分区。

4. 启用 Swap

swapon /swapfile

立即激活这个 Swap 文件,系统开始使用。

5. 永久生效

echo '/swapfile none swap sw 0 0' >> /etc/fstab

/etc/fstab 是系统启动时自动读取的挂载配置文件。写入这行后,每次开机系统会自动挂载 Swap 文件,无需手动操作。

验证

free -h

输出:

               total        used        free      shared  buff/cache   available
Mem:           1.6Gi       548Mi       612Mi       2.7Mi       605Mi       1.0Gi
Swap:         2.0Gi          0B       2.0Gi

Swap 那行显示 2.0Gi,说明配置成功。

重启后的服务验证

确认所有关键服务正常运行:

systemctl status blog-api blog-web nginx mychat proxy-control --no-pager | grep -E 'Active:|Loaded:'

输出:

     Loaded: loaded (/etc/systemd/system/blog-api.service; enabled; preset: enabled)
     Active: active (running) since Sat 2026-07-11 21:21:50 CST; 13min ago
     Loaded: loaded (/etc/systemd/system/blog-web.service; enabled; preset: enabled)
     Active: active (running) since Sat 2026-07-11 21:21:50 CST; 13min ago
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Sat 2026-07-11 21:21:50 CST; 13min ago
     Loaded: loaded (/etc/systemd/system/mychat.service; enabled; preset: enabled)
     Active: active (running) since Sat 2026-07-11 21:21:50 CST; 13min ago
     Loaded: loaded (/etc/systemd/system/proxy-control.service; enabled; preset: enabled)
     Active: active (running) since Sat 2026-07-11 21:21:50 CST; 13min ago

全部 active (running) + enabled,重启后所有服务正常自启。

验证网站访问:

curl -s -o /dev/null -w "%{http_code}" -L https://your-blog-domain.com
curl -s -o /dev/null -w "%{http_code}" -L https://your-blog-domain.com/api/stats

输出:

200

网站和 API 均正常响应。

检查内存占用:

systemctl show blog-api --property=MemoryCurrent

输出:

MemoryCurrent=167112704

blog-api 占用约 159MB,远低于之前 OOM 时的 1GB,内存优化生效。

总结

这次重启排查暴露了两个关于运维的细节:

  1. 服务开机自启:通过 systemctl enable 设置,用 systemctl list-unit-files --state=enabled 可以查看所有已设置自启的服务
  2. Swap 作为安全缓冲:小内存服务器(≤2GB)强烈建议配置 Swap,至少 1-2GB,防止 OOM

服务器是生产环境的基础,每次重启前都应该确认关键服务的自启配置,避免"重启即失联"的尴尬。

文章创建于:2026年6月9日CC BY-NC-SA 4.0

评论

暂无评论,来写第一条吧

别老叽霸扫描爆破后台了,个人博客能存啥有价值的东西,有这时间不如去扫俩放片的网站