我在Kubernetes集群的Nginx命名空间中部署了Nginx Ingress控制器,我正在构建一个自定义的后端镜像,并将其部署在Nginx命名空间中作为nginx默认后端。现在它应该提供自定义的http错误页面,如404,500和503等。
我建立了一个,并使用 helm-chart 部署了下面的 default.conf 文件,但它正在为 404 错误提供 index.html,而只提供默认的 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;
}
}
Docker文件
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;"]
如果你需要更多的信息,请问我,你的帮助将是非常感激的,谢谢。
更新默认错误页面,编辑nginx-ingress-controller的配置图。插入一个新的键 自定义http错误 与你想改变其错误页面的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.iodefaultbackend:1.4) 只是简单地返回404状态,而不考虑应用程序打算返回的实际状态码。如果状态码要用于其他目的,这将会导致一个问题。
在 Nginx入口控制器 的文档。
自定义后端将返回正确的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,这是预期的。
更多信息你可以在这里找到。自定义黑客错误.