Kubernetes ingress-nginx通配符_hostname配置前置导致服务404问题咨询
ingress-nginx默认server块导致服务404问题排查与修复
这个问题和主机上独立部署的nginx实例无关,完全是ingress-nginx自身的配置生成逻辑和nginx的路由匹配规则共同导致的,核心逻辑如下:
- nginx的server块匹配优先级和配置顺序无关,会优先匹配和请求Host头完全一致的
server_name,只有当所有明确配置的server_name都匹配失败时,才会命中标记了default_server的兜底server块。你提到的server_name _;是ingress-nginx约定的默认兜底server的占位符,本身没有特殊通配作用,这个默认server默认会被加上default_server标识。 - 你当前遇到的访问全部返回404,本质是这个兜底的默认server没有配置default backend,所有未匹配到明确
server_name的请求都会直接返回404。你删除默认server块后,nginx会自动把排序第一的server块作为兜底,所以之前未匹配的请求会落到这个server块处理。 - 如果你的请求带了和3个ingress配置一致的Host头仍然返回404,说明这3个ingress的路径规则被写到了默认server块里,通常是因为你的ingress yaml没有明确填写
host字段导致的。
修复方案
你可以根据自己的业务需求选择以下任意一种方案修复:
- 给ingress-nginx配置全局default backend,未匹配的兜底请求会走这个backend返回对应内容,匹配到明确Host的请求会正常转发到对应服务,不需要修改现有ingress配置。
- 调整ingress-nginx启动参数,禁用自动生成默认兜底server块,效果和你手动删除默认规则一致,不需要每次重载配置都手动修改。
- 给所有3个ingress资源明确配置
host字段,ingress-nginx会自动给每个host生成独立的server块,只要请求Host头匹配正确,就会直接命中对应server块,不会走到默认兜底规则。
内容的提问来源于stack exchange,提问作者Brayden
相关产品推荐
相关产品推荐

