ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

服务器重启后服务不可访问的排查与解决方案

服务器重启后服务不可访问的排查与解决方案

1. 问题现象与初步排查

天机学堂作为在线教育平台,其服务稳定性直接影响教学体验。近期我们遇到一个典型故障:服务器重启后,整套系统无法访问。这种问题在运维工作中其实相当常见,但排查过程往往涉及多个技术层面的交叉验证。

典型症状表现为:

  • 浏览器访问返回"无法连接"或"连接超时"
  • ping测试显示请求超时(Request timeout)
  • 本地telnet测试服务端口失败
  • 服务器控制台显示服务进程正常运行

重要提示:遇到此类问题切忌立即重装系统!90%的类似故障都可通过系统化排查解决。

我首先采用分层排查法,从底层网络到上层应用逐步验证:

1.1 网络层基础检查

使用ipconfig /all(Windows)或ifconfig -a(Linux)查看网卡状态时,发现VMnet8虚拟网卡异常——这个用于Docker和虚拟机通信的关键接口没有获得有效IP。这直接导致所有通过该网卡的服务(包括Jenkins构建系统)失去连接。

网络连通性测试时有个实用技巧:同时运行持续ping和traceroute。我在cmd中执行:

ping -t 目标IP # Windows持续ping tracert 目标IP # 路径追踪

这样既能实时观察连通性变化,又能定位断点位置。

1.2 服务进程验证

通过systemctl list-units --type=service检查关键服务状态,发现两个异常点:

  1. Docker服务显示"active (exited)"
  2. Jenkins虽然运行中,但日志中有大量连接数据库失败记录

这里有个容易忽略的细节:Docker的异常退出状态。很多人看到服务是"active"就认为正常,其实"(exited)"说明容器没有持久化运行。

1.3 防火墙规则审查

突然想到服务器重启会重置防火墙规则,立即用iptables -L -n -v检查,果然发现INPUT链中DROP了所有来自172.18.0.0/16(Docker默认网段)的流量。这就是典型的重启后遗症——防火墙策略未固化。

2. 根因分析与解决方案

经过上述排查,问题脉络逐渐清晰:服务器重启导致虚拟网络组件初始化异常,进而引发连锁反应。具体来说有三大核心问题需要解决。

2.1 VMnet8虚拟网卡故障

VMnet8是VMware为NAT模式创建的虚拟网卡,也是Docker Desktop默认的网络接口。在Windows系统中,这类虚拟设备经常因快速启动功能出现初始化异常。

解决方案分三步走:

  1. 彻底禁用快速启动(会延长开机时间但提高稳定性):
    powercfg /h off
  2. 重置虚拟网络组件:
    netsh winsock reset netsh int ip reset
  3. 重新生成VMnet8接口:
    • 打开VMware Virtual Network Editor
    • 选择"恢复默认设置"
    • 重启主机生效

2.2 Docker服务异常恢复

Docker在Windows平台依赖两个关键组件:后台服务(Docker Desktop Service)和虚拟化引擎(通常是WSL2或Hyper-V)。重启后常见的问题是服务启动顺序错乱。

可靠的重启流程:

  1. 确保依赖服务就绪:
    Get-Service -Name "com.docker.service" | Restart-Service -Force Get-Service -Name "LxssManager" | Restart-Service # WSL2服务
  2. 检查虚拟化状态:
    systeminfo | find "Hyper-V要求"
    如果显示"已检测到Hyper-V",但Docker仍报错,可能需要:
    bcdedit /set hypervisorlaunchtype auto shutdown /r /t 0

2.3 Jenkins容器网络隔离

我们的Jenkins运行在Docker容器中,其网络配置需要特殊处理。当主机网络发生变化时,容器可能因为IP冲突或路由失效导致失联。

容器网络修复方案:

  1. 重建容器网络(不丢失数据):
    docker network disconnect bridge jenkins_main docker network connect --ip 172.18.0.100 bridge jenkins_main
  2. 检查容器内路由表:
    docker exec -it jenkins_main route -n
    如果缺少默认路由,需要手动添加:
    docker exec -it jenkins_main ip route add default via 172.18.0.1

3. 防御性配置实践

为避免类似问题再次发生,我实施了以下加固措施,这些配置在生产环境中经过验证能显著提升重启后的服务恢复率。

3.1 Docker服务依赖管理

在Linux系统通过systemd确保服务启动顺序正确:

# /etc/systemd/system/docker.service.d/override.conf [Unit] After=network-online.target firewalld.service containerd.service Wants=network-online.target [Service] RestartSec=5s Restart=always

Windows平台则通过任务计划程序实现:

  1. 创建新任务,触发器设为"启动时"
  2. 操作设置为启动程序:"C:\Program Files\Docker\Docker\Docker Desktop.exe"
  3. 添加延迟:30秒(等待网络就绪)

3.2 防火墙规则固化

使用netsh实现Windows防火墙规则持久化:

netsh advfirewall firewall add rule name="Docker Subnet" dir=in action=allow protocol=any localip=any remoteip=172.18.0.0/16 netsh advfirewall firewall add rule name="Docker Subnet" dir=out action=allow protocol=any localip=any remoteip=172.18.0.0/16

Linux系统推荐使用iptables-persistent:

apt install iptables-persistent netfilter-persistent save

3.3 Jenkins容器高可用配置

在docker-compose.yml中添加健康检查和自动恢复:

services: jenkins: restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/login"] interval: 30s timeout: 10s retries: 3 networks: default: ipv4_address: 172.18.0.100

4. 典型问题速查手册

根据实战经验整理出以下常见问题及解决方案,建议运维团队收藏备用:

现象描述可能原因验证命令解决方案
能ping通但端口不通防火墙拦截/服务未监听telnet IP 端口
`netstat -ano
findstr 端口`
Docker容器无法联网iptables规则丢失
DNS配置错误
docker exec -it 容器名 nslookup baidu.com重建Docker网络
指定--dns参数
Jenkins构建失败节点连接超时
凭据失效
查看系统管理→系统日志更新节点配置
刷新API Token
虚拟机网络异常VMnet服务未启动
网卡驱动异常
services.msc查看服务状态重启VMware NAT服务
重装VMware Tools

网络恢复后的必要检查项:

  1. 跨主机容器通信测试
  2. Jenkins构建任务试运行
  3. 数据库连接池状态监控
  4. 持续观察系统日志30分钟

最后分享一个诊断网络问题的万能命令组合:

# Windows netsh interface ipv4 show config && netstat -ano | findstr ESTABLISHED # Linux ip a && ss -tulnp && journalctl -xe --no-pager
返回列表