医生说:
当启用自定义- HTTP -错误选项时,宏控制器配置NGINX,以便在出现错误时将多个HTTP头向下传递到其默认后端:https://kubernetes.github.io/ingress-nginx/user-guide/custom-errors/。
我对我的服务进行了健康检查,如果健康检查失败并且服务离线,我希望显示一个自定义错误页面,而不是默认的更简洁的Nginx页面。
我配置了一个默认的后台,并且使用:custom-http-errors: "503"可以工作。如果没有这一行,就会显示默认的Nginx页面。
但是,如果后端服务健康检查正常(即“准备好”),但是服务本身由于任何原因返回503页,则Nginx会拦截它,然后将客户端重定向到默认后端,而不是像往常一样将页面返回给客户端。
医生说:
设置至少一个代码还启用了proxy_intercept_errors,这是处理error_page所必需的。
这不是我想要的。
那么,在服务被破坏并且健康检查失败时,是否有任何方法可以获得友好的自定义响应,而不需要拦截服务中的合法503个响应?
同样的问题也适用于404。我希望入口返回一个友好的404页面,如果有人试图访问一个不存在的服务,同时也不拦截一个有效服务的404响应。
发布于 2021-04-13 17:30:16
我只是花了很长时间来解决这个问题,而且似乎没有任何文档化的解决方案。所以这就是最终对我起作用的东西。
我们真正想要做的是不拦截任何错误,而是更改nginx的错误页面,最好是从我们的默认后端为它们服务,就像我们截获的任何错误一样。
因此,您可以设置一个新的location来处理这个问题,方法是将以下内容添加到入口控制器的ConfigMap中:
server-snippet: |
location @503 {
proxy_set_header X-Code 503;
proxy_set_header X-Format "text/html";
proxy_pass http://default-backend.ingress-nginx;
}(假设在名为default-backend的名称空间中部署了一个名为ingress-nginx的服务的默认后端)。
然后,在“进题”上,您需要这种行为,您可以添加一个注释,将503个错误重定向到我们的新路由:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
error_page 503 = @503;现在,从nginx直接提供的503错误现在是从默认后端提供的,而没有拦截任何可能在应用程序启动和运行时从应用程序的荚中返回的“真正”503。
https://serverfault.com/questions/1021173
复制相似问题