我在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;"]
请问我是否需要更多信息。 非常感谢您的帮助, 谢谢。
答案 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。