Nginx入口控制器的自定义错误后端配置

时间:2020-04-29 17:54:39

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

我在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;"]

请问我是否需要更多信息。 非常感谢您的帮助, 谢谢。

1 个答案:

答案 0 :(得分:0)

要更新默认错误页面,请编辑nginx-ingress-controller的配置图。插入带有您要更改其错误页面的HTTP状态代码的新密钥custom-http-errors,例如:

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“默认后端” (Image: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掌舵表重新部署为:

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