【问题标题】:Custom Errors Backend Configuration for Nginx Ingress ControllerNginx 入口控制器的自定义错误后端配置
【发布时间】:2020-08-13 22:21:49
【问题描述】:

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

我使用 helm-chart 构建了一个并部署了下面的 default.conf 文件,但它正在为 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;"]

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

【问题讨论】:

    标签: kubernetes dockerfile devops nginx-config nginx-ingress


    【解决方案1】:

    要更新默认错误页面,请编辑 nginx-ingress-controller 的配置映射。插入一个新的密钥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

    【讨论】:

    • 我没有启用后端服务,因为我部署了我的自定义后端来代替默认后端。现在我希望它能够为自定义页面提供服务,因为我已经添加了带有自定义错误的配置映射。它不提供除索引页面以外的自定义页面。
    • 我也不明白你的dockerfile,你能用你的方式修改我上面的dockerfile吗。
    • 您是否仔细阅读了我添加的文章? itnext.io/…我的回答和这篇文章应该对你有所帮助。
    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2020-01-08
    • 2021-10-16
    • 2020-03-01
    相关资源
    最近更新 更多