首页 > 解决方案 > Nginx 入口控制器的自定义错误后端配置

问题描述

我在我的 kubernetes 集群的 Nginx 命名空间中部署了 Nginx Ingress 控制器。我正在构建一个自定义后端映像并将其部署在 Nginx 命名空间中作为 nginx 默认后端。现在它应该提供自定义 http 错误页面,如 404、500 和 503 等。

我构建了一个并使用带有以下 default.conf 文件的 helm-chart 进行部署,但它为 index.html 提供 404 错误并且仅提供默认 503 错误(不是我的自定义 503.html 页面)

server {
listen 8080 default_server;
root /var/www/html;
index index.html;
location / {
}
location /healthz {
    access_log off;
    return 200 "healthy\n";
}
location /metrics {
    stub_status on;
}
error_page 404 /404.html;
location = /404.html {
    internal;
}
error_page 500 /500.html;
location = /500.html {
    internal;
}
error_page 503 /503.html;
location = /503.html {
    internal;
}

}

Dockerfile

FROM nginxinc/nginx-unprivileged
USER root
RUN rm /etc/nginx/conf.d/default.conf && \
ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dev/stderr /var/log/nginx/error.log
COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY content/ /var/www/html/
CMD ["nginx", "-g", "daemon off;"]

如果您需要更多信息,请询问我。您的帮助将不胜感激,谢谢。

标签: kubernetesdockerfiledevopsnginx-confignginx-ingress

解决方案


要更新默认错误页面,请编辑 nginx-ingress-controller 的配置映射。插入一个新的 key custom-http-errors ,其中包含您要更改其错误页面的 HTTP 状态代码,例如:

apiVersion: v1  
kind: ConfigMap  
data:  
  custom-http-errors: 404,413,503 
  enable-vts-status: "false"  
metadata:  
  labels:  
    app: nginx-ingress  
    chart: nginx-ingress-1.6.0  
    component: controller  
    heritage: Tiller  
    release: nginx-ingress  
  name: nginx-ingress-controller  
  namespace: Nginx

现在,再次触发测试命令,

curl -i "[http://err-test.192.168.64.5.nip.io/err?code=413](http://err-test.192.168.64.5.nip.io/err?code=413)"  
HTTP/1.1 404 Not Found  
Server: nginx/1.15.10  
Date: Sun, 05 May 2019 11:36:04 GMT  
Content-Type: text/plain; charset=utf-8  
Content-Length: 21  
Connection: closedefault backend - 404

不是 你想要的。Nginx 入口控制器正确捕获我们想要自定义的 HTTP 状态代码。然而,默认的 Nginx “default-backend” (图片:k8s.gcr.io/defaultbackend:1.4)只是简单地返回 404 状态,而不管应用程序打算返回的实际状态代码如何。如果将状态码用于其他目的,这将导致问题。

Nginx Ingress Controller文档中,您可能会看到:

自定义后端应返回正确的 HTTP 状态代码,而不是200. NGINX 不会更改来自自定义默认后端的响应。

然后在 Dockerfile 中,您必须将路径添加到您定义的自定义后端错误:

ADD custom-error-pages /  
CMD ["/custom-error-pages"]

构建镜像并推送到 docker hub。在 K3s 中重新部署 Nginx helm chart 如下所示:

apiVersion: k3s.cattle.io/v1  
kind: HelmChart  
metadata:  
  name: nginx-ingress
  namespace: Nginx
spec:  
  chart: stable/nginx-ingress  
  targetNamespace: kube-system  
  valuesContent: |-  
    defaultBackend:  
      enabled: true  
      name: default-backend  
      image:  
        repository: your-image/custom-error-page  
        tag: latest

在 k8s 中只需执行:

helm upgrade nginx-ingress stable/nginx-ingress --set defaultBackendService.enabled=true --set defaultBackend.image.repository=your-image/custom-error-page --set defaultBackend.image.tag=latest

然后再次测试,执行同样的curl命令:

➜ curl -i "[http://err-test.192.168.64.5.nip.io/err?code=413](http://err-test.192.168.64.5.nip.io/err?code=413)"  
HTTP/1.1 413 Request Entity Too Large  
Server: nginx/1.15.10  
Date: Sun, 05 May 2019 12:09:21 GMT  
Content-Type: */*  
Transfer-Encoding: chunked  
Connection: close4xx html

您将获得带有正确 HTTP 状态代码的自定义错误页面。

由于您捕获 503 状态,因此请缩小副本。

执行命令:

$ kubectl scale deploy err-status-test --replicas=0

如果您将再次访问该应用程序,您将看到自定义错误页面,其状态代码显示为 503,这是预期的。

您可以在此处找到更多信息:custom-backend-errors


推荐阅读