ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

vCenter登录500错误:身份提供程序出错与no healthy upstream排查

vCenter登录500错误:身份提供程序出错与no healthy upstream排查 先说个结论vCenter 登录弹出 500提示“获取身份提供程序时出错”同时后端日志里能看到 no healthy upstream这俩信息放一起基本可以确定问题出在 vCenter 自身的 Web 前端和 SSO 服务这一条链路上而不是你输错了账号密码。最近我处理了一台 vCenter 7 的登录故障现象和你遇到的一模一样浏览器打开 vSphere Client 首页能出来但输入账号密码点登录后直接报 500界面上写着“获取身份提供程序时出错”后台日志里反复出现 no healthy upstream。坦白讲这个组合报错第一次遇到确实容易懵因为它把前端反代、后端服务健康检查、身份提供程序三个层面的事情全糅在一起了。这篇文章就把整个排查过程、背后原理和最终解决办法完整记录下来给同行走个参考。1. 这个报错到底卡在哪一层1.1 先理清 vSphere 登录链路vCenter 的登录流程不是简单的“浏览器发请求到 Web 服务端”中间至少经过了三层浏览器请求到 vCenter 的 nginx 反向代理nginx 再转发给 vsphere-ui 服务vsphere-ui 收到请求后向本地 Lookup Service 和 STSSecurity Token Service安全令牌服务要身份提供程序信息然后做 SAML 断言、令牌校验最后才完成登录。所以“获取身份提供程序时出错”这个提示字面上看是 vsphere-ui 在向身份提供程序要配置或验证令牌时失败了。而身份提供程序的信息来源又是 vCenter 内置的单点登录组件在 7.0 及以后版本中这套逻辑已经集成到 vmafdVMware Authentication Framework Daemon和 STS 服务里。换句话说你的账号是 AD 账号也好vSphere 本地账号也好登录时都要经过这套身份源发现机制。如果 vmafd 状态不正常或者 STS 返回不了令牌前端就只会丢给你一句含糊的“获取身份提供程序时出错”。1.2 no healthy upstream 是哪里报出来的no healthy upstream 这行字眼通常不是 vSphere 页面上的报错而是 nginx 反向代理在转发请求时发现后端 upstream 不可用后打的日志。在 vCenter 里nginx 的 upstream 主要是 vsphere-ui 服务。nginx 会定期向后端服务发起健康检查请求如果连续多次没有收到预期的响应它就会把该 upstream 标记为不健康。这时候你要是刷新页面nginx 直接返回 502/503页面再经过 vsphere-ui 的错误处理逻辑最终就渲染成了“500 获取身份提供程序时出错”。简单理解就是前端想找后端拿身份提供程序配置结果后端在 nginx 眼里已经“半死不活”请求根本没被正常处理自然拿不到任何有用的身份配置信息。这里有个容易误判的地方no healthy upstream 是表象不代表一定是 vsphere-ui 进程挂了很多时候进程还活着只是它内部依赖的其他组件比如 vmafd、Lookup Service 或者数据库连接池出了问题导致健康检查接口响应变慢或者返回异常nginx 才把它标记为不健康。所以排查的核心是搞清楚 vsphere-ui 为什么不“健康”。2. 定位问题的完整排查流程2.1 从 vCenter 的日志入手遇到这种登录类问题最好不要凭感觉去到处点先看日志。vCenter Appliance 可以通过 SSH 登录到后台日志路径我已经帮你们踩清楚了nginx 日志/var/log/vmware/nginx/error.log和/var/log/vmware/nginx/access.logvsphere-ui 日志/var/log/vmware/vsphere-ui/logs/目录下的vsphere_client_vmon.log和vsphere-ui.logvmon 进程管理日志/var/log/vmware/vmon/vmon.log身份相关组件日志/var/log/vmware/vmafd/vmafd.log、/var/log/vmware/sso/ssoAdminServer.log、/var/log/vmware/lookup/lookupServer.log我先看的是 nginx 的 error.log命令很简单tail -n 100 /var/log/vmware/nginx/error.log日志里刷了大量类似的记录connect() failed (111: Connection refused) while connecting to upstream后面跟着的是 vsphere-ui 对应的 socket 地址。这已经能说明问题nginx 想连 vsphere-ui但连接被拒绝。连接被拒绝有两种可能一是 vsphere-ui 进程确实死了二是它监听的端口根本没起。然后我又看了 vsphere-ui 自己的日志tail -n 200 /var/log/vmware/vsphere-ui/logs/vsphere_client_vmon.log发现里面有大量线程池满、连接超时、无法与 vmafd 通信之类的异常。这说明 vsphere-ui 进程本身活着但它依赖的下游服务出了问题。2.2 检查 vCenter 服务健康状态看服务状态用 vmon 的管理命令比用 systemctl 更靠谱因为 vCenter 里很多关键服务是由 vmon 进程托管service-control 才是正规入口。我习惯一次性把所有服务状态列出来service-control --status --all正常环境下所有服务应该显示为 Running。我当时看到的实际情况是vsphere-ui 显示 Runningvmafd 显示 Runninglookup-service 显示 Running但 sts、sso 相关服务状态在 Running 和 Degraded 之间反复跳。这个 Degraded 状态很关键说明服务进程没退出但健康检查不通过。再用 vmon 的命令看下具体组件的详情vmon-cli -l输出里会列出每个组件的 PID、运行时长、健康检查结果。我当时注意到 vsphere-ui 的 health check 结果不是正常值而是显示成 UNKNOWN 或 FAILED这就和 nginx 报 no healthy upstream 对上了。2.3 磁盘、内存、时间一个都不能少服务状态乱跳很多时候不是服务本身代码有 bug而是底层资源不满足了。我先检查的是磁盘空间df -h发现/storage/log分区已经用了 95%/storage/archive也快满了。这个信息非常关键因为 vmafd 和 sso 这类服务在写日志或临时文件时如果失败整个服务就会变得不稳定。尤其是/storage/log它存的是所有 vmware 组件的日志一旦写满服务启动和运行都会出问题。再查一下内存free -hvCenter 虚拟机如果内存分配不足vsphere-ui 这种 Java 系服务很容易出现堆内存不足进而导致健康检查线程无法正常响应。时间同步同样不能忽视。vCenter 登录涉及 Kerberos 令牌和 SAML 断言对时间偏差非常敏感。我用下面的命令检查chronyc tracking如果 vCenter 和 AD 域控的时间偏差超过 5 分钟STS 服务签发的令牌在验证时直接判失败登录界面表现就是 500 获取身份提供程序时出错。你可以先手动对时再观察服务是否恢复正常但长期还是得配好 NTP。2.4 证书和身份提供程序之间的关联还有一个被很多人忽略的点vCenter 7 的 vsphere-ui 和 nginx 之间走的是 HTTPS 通信如果 vCenter 的机器证书过期或者没有被 vmafd 正确注册nginx 到 vsphere-ui 的健康检查请求就会因 TLS 握手失败而失败nginx 自然就报 no healthy upstream。检查证书的方法/usr/lib/vmware-vmafd/bin/dir-cli cert --list这个命令能列出 vmafd 数据库中注册的机器证书信息重点看有效期。如果证书快过期或已过期即使服务都显示 Runningnginx 和 vsphere-ui 之间的通信也会断断续续。另外也要检查 vCenter 的系统时间是否在证书有效期范围内。证书的 notBefore 时间如果比当前时间晚那就属于典型的“证书未生效”问题通常是因为设备断电后时间跳变导致的。这种情况不需要重新申请证书把时间修正后重启服务即可。3. 实操解决vsphere-ui 与 vmon 的调整3.1 vmon 健康检查机制vmon 是 vCenter Appliance 核心的进程管理守护程序所有 vmware 组件都由它负责拉起和监控。每个组件在/usr/lib/vmware/vmon/vmon.d/目录下都有一个 JSON 配置文件里面定义了服务的启动命令、停止命令、健康检查命令和超时时间。vsphere-ui 的配置路径是/usr/lib/vmware/vmon/vmon.d/vsphere-ui.json。默认的健康检查逻辑是 vmon 周期性执行一个探测命令检查 vsphere-ui 是否响应。如果健康检查命令本身因为环境问题卡住或者超时时间设置太短vmon 就会把健康状态标记为不健康。很多实际的故障案例里vsphere-ui 并没有真正挂掉而是健康检查命令在执行时需要访问 vmafd而 vmafd 恰好因为磁盘空间或网络问题响应慢导致健康检查结果迟迟不返回最后被判定为不健康。这里就有两种处理思路一种是解决 vmafd 的响应慢问题另一种是在确认服务本身正常的前提下适当放宽健康检查参数。3.2 修改 vsphere-ui 健康检查参数的完整步骤我当时在确认磁盘清理后服务仍不稳定决定调整 vsphere-ui 的健康检查参数。这个操作在 VMware 的 KB 里是有据可循的我实际操作下来也确实有效。先备份原配置cp /usr/lib/vmware/vmon/vmon.d/vsphere-ui.json /root/vsphere-ui.json.bak用 vi 打开配置文件vi /usr/lib/vmware/vmon/vmon.d/vsphere-ui.json找到 HealthCheck 字段默认结构大致是HealthCheck: { TimeoutMs: 30000, IntervalMs: 60000, Command: ... }我需要把健康检查的超时时间从 30 秒调大到 60 秒同时把健康检查的执行间隔从 60 秒调到 90 秒。这么做的目的是避免因为偶发的高负载或慢 IO 导致健康检查误判。具体的调整依据是在服务功能正常的情况下健康检查超时时间过短是最常见的误判原因。修改完保存后关键一步是让 vmon 重新加载配置。直接重启 vsphere-ui 是不够的需要执行/usr/lib/vmware/vmon/bin/update-vmon-config.py --component vsphere-ui --update这个命令会把 JSON 中的新配置同步到 vmon 维护的运行时配置中。然后依次重启 vmon 和 vsphere-uiservice-control --restart vmon service-control --restart vsphere-ui注意顺序不要反。先重启 vmon 再重启 vsphere-ui因为 vsphere-ui 的拉起和健康检查都依赖 vmon。3.3 重启服务的正确姿势如果服务状态已经很乱我建议直接重启全部 vCenter 服务而不是单独重启某几个service-control --stop --all等所有服务停止后再统一启动service-control --start --all这个操作时间会比较长一般需要 10 到 20 分钟取决于 vCenter 配置和底层存储性能。有些人是直接重启整个 vCenter 虚拟机这当然也可以但如果你正在远程操作重启虚拟机的风险更大因为 vCenter 虚拟机起不来的时候你连管理入口都没有。所以我的习惯是优先用 service-control 重启服务而不是直接重启虚拟机。还有一个细节重启服务后要确认服务的实际监听端口起来了。vsphere-ui 默认监听的是 5096 端口左右具体可以在 vsphere-ui 配置里查。用下面的命令确认端口netstat -tlnp | grep 5096端口存在且状态为 LISTEN说明 vsphere-ui 确实起来了。这时候再回到 nginx 的日志已经能看到健康检查请求恢复正常no healthy upstream 不再刷屏。4. 其他常见原因与暴力恢复方案4.1 常见问题速查表排查完这一整轮我整理了 vCenter 登录 500 和 no healthy upstream 的常见原因对照表方便大家按图索骥。现象可能原因验证命令解决方式页面提示获取身份提供程序时出错vmafd 服务异常或身份源配置丢失service-control --status --all重启 vmafd检查 /etc/hosts 与 DNS 解析nginx 日志报 no healthy upstreamvsphere-ui 健康检查不通过vmon-cli -l调整 vsphere-ui 健康检查参数或重启服务服务状态反复 Degraded磁盘空间不足或 inode 耗尽df -h 和 df -i清理 /storage/log 和 /storage/archive 下日志登录后长时间转圈然后 500STS 服务超时或证书异常dir-cli cert --list检查证书有效期重启 sso 服务重启服务后仍然报错vmon 配置与运行时不一致update-vmon-config.py --help重新同步 vmon 配置再重启 vmon多台 vCenter 做了身份联合身份提供程序本身不可达curl -k https://vcenter/websso/检查对端 IdP 的健康状态和网络连通性这个表格不是让你每行都试一遍而是教你按优先级排除。我的实际顺序是先确认服务状态和磁盘空间再看日志定位具体是哪个 upstream 不健康然后针对性地处理时间、证书等底座问题。4.2 最后手段证书修复与重置如果磁盘、内存、时间、健康检查参数都调整了问题还在那就得考虑证书层面的修复。vCenter 的机器证书出现问题时最直接的表现就是各个组件之间互相 TLS 握手失败但日志里不会直接写“证书过期”而是表现为各种连接重置或握手超时。如果你在 nginx 日志里看到SSL certificate verify failed或handshake failed这类信息基本就是证书问题没跑了。证书修复的一个可行思路是重新生成机器证书操作之前一定记得把现有证书备份好。我的操作是service-control --stop --all然后使用certool相关命令重新初始化证书相关配置。这块操作比较复杂而且不同 vCenter 版本的命令细节有差异我的建议是优先参考官方文档中关于“重置 vCenter 机器证书”的部分不要自己凭记忆写命令。不过在实际运维中证书问题并不是登录 500 的第一嫌疑。因为证书问题往往会在重启服务后立即暴露而不会只表现为偶发的不健康。所以如果你们的问题断断续续出现先把证书这条线放一放。4.3 后续整改建议问题解决后不能只是高兴一下我建议你顺手做几件事避免下次再踩坑给 vCenter 做一次完整快照。这听起来像废话但很多人在 vCenter 出问题后才后悔没有快照。尤其在调整 vmon 配置、执行服务重启前快照是最后的后悔药。把/storage/log分区的日志轮转策略检查一遍。vCenter 默认的日志轮转在某些版本里配置得不够激进大日志文件一旦累积到 GB 级别非常容易把分区塞满。你可以部署一个简单的定时任务定期清理/storage/archive下的旧日志只保留最近 30 天。监控 vCenter 虚拟机的磁盘 IOPS 和延迟。vCenter 对底层存储性能非常敏感尤其是 vmafd 和 vsphere-ui 依赖的元数据写入。如果存储延迟过高服务健康检查就会超时和这次的问题表现完全一样。还要养成定期检查证书有效期的习惯。vCenter 7 的生命周期里机器证书默认有效期是两年左右如果你很久没有更新 vCenter证书过期引发的登录问题非常隐蔽。5. 我再提醒几个容易被忽略的操作细节最后补充一些我在排查过程中总结的操作细节这些内容不一定在官方文档里写得明确但对于快速定位问题有很大帮助。第一vCenter 的 SSH 端口默认不是 22而是 22 端口没错但 root 用户登录默认会被禁用如果你没有在 vCenter 里手动启用 SSH 和 root 访问权限遇到登录故障时会非常被动。我的习惯是在 vCenter 部署完成后就开启 SSH 服务但严格控制访问来源只允许管理网段的地址连接。第二vmon 配置文件的修改不要乱来。/usr/lib/vmware/vmon/vmon.d/下的 JSON 如果修改不当会导致 vmon 直接启动失败变成更大的事故。我修改前一定先备份并且只修改确认过体积的参数比如 HealthCheck 的 TimeoutMs 和 IntervalMs其他字段看不懂就不要动。第三定期检查/etc/hosts文件。vCenter 对于主机名的解析方式很挑剔如果/etc/hosts里主机名解析记录被改写或者 DNS 里 vCenter 的解析结果指向了错误 IP所有依赖本机身份的组件都会异常。这个原因在很多时候是坑中之坑因为 vCenter 本身能 ping 通表面看网络没问题但身份组件就是起不来。第四不要在登录故障时反复刷新浏览器页面。这不是说浏览器会弄坏 vCenter而是大量并发请求会加重已经处于亚健康状态的 vsphere-ui 和 nginx 的负担导致问题更加复杂。我一般建议先停一停在 SSH 命令行把服务状态弄清楚再打开浏览器验证。根据我自己的操作经验这种“500 获取身份提供程序时出错”加 no healthy upstream 的组合报错八成以上都和服务健康检查有关而深层原因又离不开磁盘、内存、时间、证书这几个底座因素。只要按照日志驱动的思路先确认 no healthy upstream 具体指向哪个服务再逐层检查依赖通常能在半小时内定位到根本原因。调试过程中别急着改配置多看一眼日志很多答案就写在里面。
返回列表