ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

vCenter登录500错误与no healthy upstream故障排查指南

vCenter登录500错误与no healthy upstream故障排查指南 登录vCenter的Web管理界面也就是vSphere Client的时候页面还没完全加载出来先弹了一行红字500 获取身份提供程序时出错。再打开浏览器开发者工具翻一下或者直接上vCenter看nginx日志大概率还能看到一个熟悉的老朋友——no healthy upstream。这个报错组合在vSphere 7.0 Update 3之后的版本里相当典型vSphere 8.0全系也经常遇到。很多运维同行第一次碰见第一反应就是把vmware-sso重启一遍结果等了半天报错原封不动躺在那里。这里不打算给一个“万能重启命令”就完事。我会把这条报错链路拆开讲清楚再按真实排障顺序走一遍最后落到磁盘空间打满、Java进程僵死、身份提供程序配置损坏这三类高频根因的具体处理方式。无论你是刚接手vCenter还是已经被这个500折磨了几个小时跟着这条线走大部分环境都能在半小时到一小时内定位到问题。1. 500与no healthy upstream登录请求卡在哪一环1.1 先分清报错的是“登录动作”还是“登录页加载”这个错误有两种出现方式处理思路完全不同第一步得先分清。第一种打开 https://vcsa_fqdn/ui 之后登录页本身就没加载完整页面上方直接提示“500 获取身份提供程序时出错”这时候你还没输入账号密码。第二种登录页正常显示你输入 administratorvsphere.local 并点击登录之后才报错。本文讨论的主要是第一种也就是登录页加载阶段的报错这种情况最能迷惑人因为看起来像认证失败实际上问题出在更前面的环节。为什么登录页在加载阶段就要去“获取身份提供程序”因为vSphere Client的登录页面默认要把可用的身份提供程序列出来至少得知道当前这台vCenter注册了哪些身份源才能决定认证请求发到哪个服务去处理。这个动作由页面里的JavaScript在后台悄悄发起对应一个后端接口。接口挂了页面就只能把错误抛给你。1.2 这个500到底是谁吐出来的很多人看到500下意识以为是某个Java应用抛了业务异常。但在vSphere Client登录页这个场景里500通常是nginx反向代理层直接吐出来的不是Java应用“有意”返回的。浏览器的请求先到达vCenter的443端口那里站着一个nginx。nginx负责HTTPS加解密、URL路由、把请求转发到合适的后端服务。vCenter的登录页请求会被转发到身份服务那一支nginx给这些后端服务配置了一个upstream池子里面是一个或几个后端节点。每次转发前nginx会判断池子里有没有能用的节点判断依据就是健康检查。如果池子里一个健康节点都没有nginx没法转发就只能自己返回一个错误响应。在nginx的error.log里这个情况通常写作“no live upstreams while connecting to upstream”或者“no healthy upstream”。在vSphere Client界面上你看到的就是HTTP 500 “获取身份提供程序时出错”。划重点接到这个报错不要第一时间怀疑SSO安全策略、账号锁定、证书绑定之类的东西。先搞清楚后端服务到底健不健康。方向对了问题就解决了一半。2. vSphere身份登录的调用链前端、反向代理与身份服务2.1 一条登录链路里都有谁vCenter不是一个单体程序vSphere Client的登录功能由好几个组件协作完成。熟悉这条链路排查才能有的放矢浏览器 [HTTPS 443] vCenter nginx反向代理 /ui -- vsphere-ui (Java/Tomcat Web应用) /websso -- vmware-sso / vmafdd /identity -- identity service (vSphere 8.0)这几个组件分工大致如下vsphere-uivSphere Client这个Web应用本身跑在Tomcat里。前端JS、大部分API都在这里。nginx反向代理vCenter所有对外Web请求的入口负责TLS证书、路由以及把请求转发给后面的Java服务。vmafddVMware认证框架守护进程管理SSO域内本地令牌、身份源探测。vmware-ssoSTS安全令牌服务登录成功后签发SAML或OIDC令牌。identity service / identity sourcesvSphere 8.0里新引入的VMware Identity Services专门管理身份提供程序和身份源。登录页加载“身份提供程序”列表时请求走的不是vsphere-ui而是身份服务这一支。所以当nginx说“no healthy upstream”的时候故障点往往在认证/身份服务相关进程而不是前端静态资源服务。2.2 nginx的upstream和健康检查规则搞懂nginx的upstream机制是这个排障里特别关键的一环。upstream就是一组后端服务器地址。nginx维护着每个节点的健康状态。vCenter内置nginx通常使用被动健康检查也就是通过实际转发请求的结果来判断节点是否健康。如果转发时发生TCP连接失败、超时、或者上游返回502/504这类状态码nginx会把这个节点标记为失败失败次数超过max_fails之后在fail_timeout时间内不再向这个节点转发。“no healthy upstream”的意思是整个upstream池子里每一个节点都被标记成了不可用或者根本没有节点能建立连接导致nginx彻底无法转发。翻译成人话就是nginx想找一个人干活但名单上所有人要么不接电话、要么联系不上于是它两手一摊告诉你——找不到人。2.3 为什么后端不健康登录页立刻就有感觉身份服务属于高频依赖。vSphere Client登录页只要打开就要获取身份提供程序列表。也就是说这个故障不是在你点击登录的那一刻才出现而是页面加载阶段就已经发生了只是界面到很晚才把错误抛出来。身份服务不健康的常见诱因按真实排障中出现的频率排序磁盘空间打满尤其 /storage/log 和 /storage/archive 最容易爆。Java进程OOM或者线程池被耗尽进程“假死”。服务间证书过期、NTP时钟偏移导致内部HTTPS调用TLS握手失败。身份提供程序配置损坏后端组装列表数据时抛异常。这也就是为什么后面所有操作都围绕“服务健康”展开而不是纠结“认证为什么失败”。3. 完整排障链路从服务状态到日志证据链3.1 给vCenter服务做整体体检一开始别急着翻日志先确认vCenter整体服务状态。SSH登录到VCSA执行service-control --status --all重点观察这几个服务vsphere-ui、vmafdd、vmware-sso、identity service8.0、vmon。如果有一大片服务状态异常优先怀疑是不是系统级问题如果只有个别服务DOWN聚焦到那一个组件上。再看更细一层的健康状态/usr/lib/vmware-vmon/vmon-cli --healthvmon-cli的输出比service-control更贴近故障表象能明确告诉你服务是否通过健康检查。注意服务状态显示RUNNING不代表健康检查通过。更常见的是进程还在、端口还开着但服务已经“假死”对外表现就是“no healthy upstream”。3.2 磁盘与资源检查最容易翻车的隐形坑很多排障卡在日志分析半天最后发现是磁盘满了。所以我会把磁盘检查放在日志之前。df -h free -m topVCSA有几个分区要特别留意/storage/log、/storage/archive、/storage/db还有根分区。其中/storage/log和/storage/archive是故障高发区日志和归档日志一旦累积过多使用率直接就冲到100%。磁盘满为什么会导致健康检查失败这里有明确的因果关系Java服务运行时要写日志、创建临时文件磁盘满时写入失败轻则日志丢失重则进程直接退出。就算进程没退出健康检查线程也要依赖线程池正常调度系统资源耗尽时线程池排队健康URL的响应就超时了。nginx去探测后端发现后端根本不响应或者响应超时自然就把节点标记为unhealthy。如果你看到df输出已经100%先不要往下排查优先腾空间否则重启多少次服务都是白搭。3.3 服务日志证据收集磁盘确认没问题之后开始翻日志。我习惯把日志路径和关注点列成一张表方便对照服务日志路径重点关注关键词vsphere-ui/var/log/vmware/vsphere-ui/logs/OutOfMemoryError, Connection refused, No space leftvmafdd/var/log/vmware/vmafdd/vmafdd.logtoken, cert, timeout, errorvmware-sso/var/log/vmware/sso/SAML, STS, health, 500identity service (8.0)/var/log/vmware/identity/ 或 /var/log/vmware/vmidentity/identity provider, metadata, crash先做一次粗粒度检索grep -i OutOfMemoryError\|Connection refused\|No space left /var/log/vmware/vsphere-ui/logs/*.log | tail -n 50如果日志里有java.lang.OutOfMemoryError: Java heap space那基本可以判断是vsphere-ui的堆内存出了问题。如果看到No space left on device那磁盘问题实锤了。如果出现大量Connection refused说明某个后端服务确实没在监听端口。这一步的目的不是直接用日志定案而是把嫌疑范围缩小到一个或两个组件上。3.4 nginx日志还原“500现场”找到nginx日志是还原故障现场的关键一步。vCenter内置nginx日志的位置我记得常见的有两个路径一个是 /var/log/nginx/另一个是在vsphere-ui自己的logs目录下。两个都看一眼根据实际版本确定。grep -i no healthy upstream\|no live upstreams /var/log/nginx/error.log | tail -n 50再看access.log里对应的500请求grep 500 /var/log/nginx/access.log | tail -n 20重点看error.log里upstream失败的具体原因这个细节能区分故障类型connect() failed (111: Connection refused)后端端口根本没监听进程挂了。connect() failed (110: Connection timed out)后端进程可能还在但已经假死无法正常响应。connect() failed (104: Connection reset by peer)后端主动断开连接多半是应用层异常。结合这条信息和前面service-control的输出基本就能判断到底是哪个后端服务不健康了。3.5 时钟同步与证书容易忽略的隐性因素如果上面几步查下来一切正常服务都在、日志也没明显异常这时候就要考虑两个隐性因素时钟和证书。身份认证对时间极度敏感。vCenter内部服务之间走的是HTTPS和令牌机制时钟偏移超过一定范围令牌时间戳校验就会失败。NTP有问题的vCenter最典型的症状之一就是身份服务间歇性不健康。timedatectl chronyc tracking检查NTP同步状态如果时间偏差太大先把时间源修好。修完时钟之后很多诡异的认证报错会自己消失。证书检查稍微重一点但也要会看/usr/lib/vmware-vmca/bin/certool --list查看机器SSL证书、solution user证书和vmdir证书的有效期。如果哪个证书过期了服务间TLS握手就已经开始失败nginx把上游判不健康只是迟早的事。日志里的SSL handshake failure、certificate expired都是线索。3.6 证据链怎么串到这里排障信息基本齐了。把证据串起来就能得出根因。举个例子nginx error.log显示upstream指向127.0.0.1:9443失败说明故障在vsphere-ui这个后端。vsphere-ui日志里出现OutOfMemoryError。再看df -h/storage/log已经100%。这条证据链非常清晰磁盘满导致Java服务OOM或者写日志失败vsphere-ui无法正常响应nginx健康检查判定失败最终登录页报“获取身份提供程序时出错”。这套“串证据链”的思维方式比单看任何一个日志都管用。4. 高频根因与修复实操先给一张总览表三类高频场景一眼看清场景典型现象优先处理动作磁盘空间打满df显示/storage/log或/storage/archive 100%服务反复重启清理日志与归档滚动重启受影响服务Java OOM/僵死日志出现OutOfMemoryErrorvsphere-ui响应超时重启服务评估JVM堆与物理内存身份提供程序配置损坏登录页单独报“获取身份提供程序时出错”服务本身健康修复或删除异常身份源重新加载配置4.1 场景A磁盘空间打满引发的服务雪崩磁盘满导致服务大面积异常的场景我遇到得最多处理顺序也最讲究。先不要急着删文件先定位到底哪些目录占了空间du -xh --max-depth1 /storage 2/dev/null | sort -rh | head -20通常大头就两个/storage/archive和/storage/log。/storage/archive下面全是被压缩归档的旧日志保留价值其实有限。确认保留周期之后直接清理rm -rf /storage/archive/*.tgz清理日志文件时有个细节很多人不知道不要用rm用重定向清空。 /var/log/vmware/vsphere-ui/logs/vsphere-ui-runtime.log /var/log/vmware/vsphere-ui/logs/catalina.out为什么因为Java进程可能还持有这个文件的文件句柄你用rm删掉磁盘空间不会立刻释放反而要等进程重启才回收。用清空空间立刻就回来了。空间释放之后重启受影响的组件service-control --restart vsphere-ui验证方式df -h确认使用率降下来了service-control --status --all确认服务状态正常再回到浏览器刷新登录页身份提供程序应该能正常加载出来了。4.2 场景Bvsphere-ui Java进程OOM或僵死vsphere-ui是个Java应用OOM是这类“no healthy upstream”报错的高发根源。日志里的OutOfMemoryError是最直接的证据。如果没抓到OOM但vsphere-ui日志里频繁出现Full GC耗时过长或者健康检查URL响应超过几十秒也基本可以按僵死处理。先用最直接的方式恢复service-control --restart vsphere-ui服务重启后马上观察vmon健康状态和日志输出。如果重启后很快又OOM说明不是偶发问题需要调整JVM堆内存。vsphere-ui的JVM参数可以在 /etc/vmware/vsphere-ui/vsphere-ui-config.properties 里找到重点是-Xmx参数。根据vCenter物理内存的实际情况适当调大再重启服务。有一点必须提醒JVM堆不是越大越好。vCenter每个服务都有内存规划盲目把-Xmx调到超过物理内存的一半只会让系统更早触发OOM。建议先看top里的实际内存占用再结合官方配置规范来调留足余量。如果是进程死锁导致的僵死而不是单纯的内存不足线程dump需要完整的Java工具链现场不一定有。这种情况下重启是最高效的恢复手段。重启后持续观察vsphere-ui响应速度确认不再复发。4.3 场景C身份提供程序配置损坏这类故障有个非常明显的特征vCenter服务状态全部正常nginx日志里也没有connect失败但登录页就是单独报“获取身份提供程序时出错”。看身份服务日志可能会有failed to load identity provider configuration之类的关键字。这种情况通常和身份提供程序配置有关。管理员在“身份提供程序”页面里添加了自定义OIDC身份源比如Azure AD、Okta之类结果Issuer URL或Client Secret填错了。身份服务在拉取或组装身份提供程序列表时遇到异常前端接口就返回500。处理思路是这样的优先通过vCenter UI里的身份提供程序页面删除或修正异常身份源。但这里有个“蛋生鸡”的困境登录页都报错了怎么进UI你可以在登录页直接输入 administratorvsphere.local 这个本地SSO账户绕过身份提供程序下拉框很多时候是能登录进去的。进去之后立刻去配置页面把坏掉的身份源删掉或者修正。如果本地账户也登录不了还有VAMI兜底也就是5480端口那个管理页面进去看服务状态确认是配置问题还是服务问题。命令行层面能做的事有限vmafdd可以查看SSO域状态/usr/lib/vmware-vmafd/bin/vmafd-cli get-domain --server-name localhost但身份提供程序的完整配置不建议通过命令行直接改更不要手工改vmdir数据库风险太大。最好的路径还是通过UI调整UI进不去就先修服务再修配置。配置修正后让身份服务重新加载配置service-control --restart vmafdd service-control --restart vmware-sso回到登录页刷新身份提供程序列表应该就能正常拉取了。4.4 通用兜底全量服务重启与证书方向如果上面三类场景排查完都没定位到根因还有一个兜底方案但一定要在维护窗口做。全量重启vCenter服务service-control --stop --all service-control --start --all重启过程比较长VCSA服务多等它全部起来可能要十几分钟。起来之后马上检查服务状态不要等服务报错再处理。如果全量重启之后依然报no healthy upstream那就要回到证书方向深挖。重点查machine SSL证书和solution user证书是否过期以及证书链是否完整。证书的问题不是重启能解决的需要走正式的证书续期流程。5. 这类“500no healthy upstream”怎么防巡检与变更纪律5.1 磁盘水位是头号敌人回看那些让我熬夜的vCenter故障磁盘空间打满占了一半以上。所以监控必须前置。我建议给/storage/log和/storage/archive这两个分区单独设告警85%触发警告90%立刻处理。不能等到100%才去看那时候服务已经处在一个非常危险的状态了。清理策略也要做成常态。vCenter日志归档堆积非常快尤其在vSphere 8.0里日志轮转和归档频率比7.0明显更高。定期清理/storage/archive下的旧tgz归档确认logrotate对vsphere-ui等大日志生效别让大文件无限增长。5.2 服务健康巡检脚本化与其等用户报障不如把服务健康巡检写成一个简单的脚本交给定时任务去跑。思路如下#!/bin/bash # vCenter服务健康与磁盘水位巡检 echo Disk Usage df -h | grep -E /storage/(log|archive)$ echo Key Services service-control --status --all | grep -E vsphere-ui|vmafdd|vmware-sso|identity echo vmon Health /usr/lib/vmware-vmon/vmon-cli --health这个脚本不用太复杂能定时输出服务状态和磁盘水位就够了。关键是把“健康检查”纳入监控范围不能只看进程在不在。VAMI的5480页面里也能直接看服务健康状态故障期那是为数不多还能进去的入口。5.3 变更纪律身份提供程序这类认证相关的变更一定要在低峰期操作。修改之前把现有配置完整截图保存或者用导出功能备份。vCenter升级之后第一件事就是打开登录页确认身份提供程序能正常加载确认没问题再让业务用户使用别把验证放到生产出故障之后。NTP配置和证书变更对身份服务的影响也要评估。vCenter内部服务之间大量依赖HTTPS和令牌机制一旦证书或时间基线变了身份服务很容易进入不健康状态。5.4 故障现场的取证习惯排障过程中养成两个习惯能帮你省下后续很多麻烦。第一清理日志之前先备份或者至少copy一份现场日志不要为腾空间把能看的东西全删了不然修好了也不知道问题到底出在哪。第二nginx error.log和vsphere-ui日志建议至少保留7天很多服务故障是间歇性的第一次报错可能只是前兆后续复盘还得靠这些日志。说实话这类500故障我在维护环境里前后遇到不下三次其中两次都是磁盘分区打满最后一次才是身份源配置损坏。复盘下来最有价值的经验不是某个救火命令而是把“登录页500”和“后端服务不健康”这条链路焊死在脑子里。排查时永远先问一句nginx在帮谁转发后端服务健康吗只要抓住这条线绝大多数类似问题都能在半小时内定位。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表