背景
今天对服务器进行了一次重启,目的是验证所有服务是否配置了开机自启。重启后遇到了两个问题: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,内存优化生效。
总结
这次重启排查暴露了两个关于运维的细节:
- 服务开机自启:通过
systemctl enable设置,用systemctl list-unit-files --state=enabled可以查看所有已设置自启的服务 - Swap 作为安全缓冲:小内存服务器(≤2GB)强烈建议配置 Swap,至少 1-2GB,防止 OOM
服务器是生产环境的基础,每次重启前都应该确认关键服务的自启配置,避免"重启即失联"的尴尬。
