kubernetes - 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;"]
如果您需要更多信息,请询问我。您的帮助将不胜感激,谢谢。
解决方案
要更新默认错误页面,请编辑 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。
推荐阅读
- mysql - 与已删除用户建立的 MySQL 连接是否仍然有效?
- python-3.x - 生成没有模块错误的自定义 python unittest xml 报告
- python - Python Selenium geckodriver 路径
- excel - 使用 contentcontrolsbytitle() 将数据从 Excel 传输到 Word 文档
- vue.js - 在点击事件 vue.js 更新复选框
- excel - 有效更新工作表上的方程式
- python - 为什么我的 py 脚本在终端中运行良好,但在使用 pyinstaller 编译时出现错误?
- node.js - 开玩笑地监视 Node.js 中的承诺子进程
- node.js - 如何在授权代码流 Azure AD B2C 中获取用户配置文件信息?
- integration - Boomi NetSuite Upsert 响应 - 获取 Upserted 记录的外部 ID