接入后出现 502 的排查案例
某次接入中,公网入口返回 502,随后又出现连接断开、反复跳转和校验失败。逐跳检查后发现,多个代理配置问题叠加,单独改好其中一项并不足以恢复访问。
本文已去除环境标识,只保留可复用的排查方法。域名、端口和部署结构均为说明示例,不对应实际站点。
先定位是哪一跳失败
典型检查顺序是:客户端 → 入口代理(如有)→ WAF → 回源服务 → 应用。部署没有前置代理时,跳过对应一层。
- 在允许访问源站的机器上确认应用自身是否正常。直连正常只能说明这一跳可用,不能证明代理链路正常。
- 检查 WAF 能否连接回源服务,核对地址、端口、HTTP / HTTPS 和证书。
- 检查入口代理到 WAF 的连接,保留真实访问域名作为 Host 进行测试。
- 对照同一时间、同一请求的入口错误日志和 WAF 请求日志,找出最先异常的一跳。
不要仅凭公网看到的 502 就认定应用或数据库故障,也不要把所有 403 都归因于防护误拦。
域名与 Host 不匹配
现象: 内部地址能连接,使用对外域名却断开;WAF 日志出现 444,前置代理记录上游连接关闭或重置。
原因: WAF 站点只配置了内部地址,实际请求携带的 Host 没有包含在站点域名列表中。Nginx 的 444 会直接关闭连接,前置代理可能因此向客户端返回 502。
处理: 在控制台中补齐实际使用的域名,确认别名或通配符范围正确,再保存并发布站点。保留 Host 校验,不要用关闭域名检查来代替正确配置。
下面仅演示如何带 Host 测试。将 example.com 和本机监听端口换成自己的配置;命令行无法完成浏览器校验,返回挑战或拦截时应继续查看日志。
curl -I -H 'Host: example.com' http://127.0.0.1:8080/
服务名解析与网络连通不是同一个问题
现象: 容器内的系统命令能解析服务名,OpenResty 日志却出现 no resolver defined。相关防护还可能报告 Redis 不可用或降级。
原因: 系统解析器可用,不代表 OpenResty 的异步网络请求已经配置了可用的 DNS 解析器。DNS 错误、连接超时和认证失败需要分别检查。
处理: 按部署环境配置 resolver,核对网络连通和服务认证,并确认修改的是实际加载的主配置。Docker 自定义网络、宿主机和其他编排环境的 DNS 配置可能不同,不应照搬地址。
Redis 等防护依赖异常应同时检查降级记录。修复连接后,确认依赖恢复正常,而不只是入口暂时不再返回 502。
回源地址再次跳回公网入口
现象: 连接错误修复后,浏览器仍反复跳转;回源请求不断返回 301 或 302。
原因: WAF 配置的回源端口实际用于“跳转到公网 HTTPS”,并不提供应用响应。请求回到公网入口后再次进入 WAF,形成循环。
处理: 将 WAF 回源地址指向真正提供应用服务的监听端口。检查跳转目标,确保回源链路不会重新指向同一个公网入口。
回源监听还应通过防火墙、私有网络或精确来源限制,只允许必要的 WAF 与运维来源访问,避免形成绕过防护的直连入口。来源范围需要按实际网络确定。
外部 HTTPS 与内部 HTTP 导致校验来源不匹配
现象: 页面停留在安全校验,校验提交持续返回 403,日志原因是 challenge_origin_mismatch。
原因: 前置代理终止 HTTPS 后,以 HTTP 转发给 WAF。浏览器提交的 Origin 使用外部 HTTPS,而 WAF 按自身接收的 HTTP 进行来源校验,两者不一致。
处理: 优先让 WAF 自身终止 TLS,或采用当前版本明确支持、经过可信代理校验的协议传递方式,使访问协议与校验预期一致。仅添加 X-Forwarded-Proto 并不意味着当前版本已经信任或使用该字段。
不要把改写浏览器 Origin、取消来源校验或关闭 CSRF 检查作为通用解决方案。排查时保留原始来源信息,避免修好跳转却破坏应用的安全判定。
入口代理截走静态资源或缓存了验证页面
现象: HTML 能打开,但样式、图片、脚本加载失败,或故障修复后仍反复显示旧的校验与错误页面。
原因: 入口保留了旧的本地静态资源匹配规则,把本应回源的请求转向空目录;也可能继承了不合适的代理缓存配置。
处理: 逐项核对入口的 location、静态目录、错误页回落和缓存规则。动态应用的资源请求应按接入方案继续回源;验证、等待和错误响应不应被长期缓存。修改后检查代表性的 CSS、脚本和图片请求,不只刷新首页。
修改没有落在实际使用的持久配置中
现象: 手动修复后正常,重建容器或更新镜像后再次出现同样错误。
原因: 改动只留在容器临时目录,或编辑的文件并不是启动参数指定的配置。只读覆盖主配置,也可能影响后续默认配置更新的合并流程。
处理: 核对主配置路径、启动参数和挂载关系,将自定义项保存到部署方案支持的持久化位置。先检查配置,再重载服务;最后实际重建容器,确认配置和访问结果都保留。
nginx -t
升级前保留可恢复的配置备份。使用自定义主配置时,对照新版默认配置合并必要变更,不要直接照抄其他环境的挂载方式。
怎样确认恢复,而不只是暂时能打开
- 访问链路: 首页、代表性业务页面与 API 均走预期入口;回源服务没有无保护的公网旁路。
- 浏览器验证: 安全校验能够完成,不再出现重复跳转或来源不匹配。
- 页面资源: CSS、脚本、图片等正常加载,入口没有错误截留或缓存验证响应。
- 防护结果: 日志不再出现本次连接、解析或来源配置错误;预期的策略拦截仍有效。
- 持久化: 重建容器后重新验证,确认恢复不是依赖临时目录中的手动修改。
命令行客户端不能运行浏览器 JS,可能按策略收到挑战或 403。应结合请求原因判断,不能只凭一个状态码认定站点故障。