Kubernetes nginx 入口控制器返回 502,但仅适用于 AJAX/XmlHttpRequest 请求

2024-05-01

我有一个在 nginx 入口控制器后面运行 Kubernetes 的 Web 应用程序,它对于请求浏览工作正常,但来自浏览器的任何 AJAX/XMLHTTPRequest 都会从 nginx 收到 502 错误。

我捕获了常规请求和 AJAX 请求的 HTTP 标头,它们看起来很好,主机标头、协议等正确。我很困惑为什么只有 XMLHttpRequest 请求从 nginx 获取 502。没有延迟/挂起,502 是立即的。这些请求似乎永远不会到达应用程序,但会被 nginx 本身拒绝。将 nginx 切换为直接负载均衡器,问题就消失了。

我要进一步挖掘,但我想知道是否有其他使用 nginx 入口控制器的人之前见过这个问题并解决了它?

我从 nginx 日志中发现了这个错误,这表明容器返回的响应对于 nginx 缓冲区来说标头太大。但是我检查了 nginx.conf 并禁用了缓冲:“proxy_buffering off;”

2016/10/27 19:55:51 [error] 309#309: *43363 upstream sent too big header while reading response header from upstream, client: 10.20.51.1, server: foo.example.com, request: "GET /admin/pages/listview HTTP/2.0", upstream: "http://10.20.66.97:80/admin/pages/listview", host: "foo.example.com", referrer: "https://foo.example.com/admin/pages"

奇怪的是,仅当 XmlHttpRequest 请求 URL 时才会收到 504 错误。如果我使用curl请求相同的URL,它工作正常,响应头如下所示。同一 URL 的 AJAX/XmlHttpRequest 会使响应标头太大怎么办?

HTTP/1.1 200 OK
Server: nginx/1.11.3
Date: Thu, 27 Oct 2016 20:15:16 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 6596
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
X-Powered-By: PHP/5.5.9-1ubuntu4.19
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: max-age=0, must-revalidate, no-transform, no-cache, no-store
Pragma: no-cache
X-Controller: CMSPagesController
X-Title: Example+Site+-+Pages
X-Frame-Options: SAMEORIGIN
Vary: X-Requested-With,Accept-Encoding,User-Agent
Strict-Transport-Security: max-age=15724800; includeSubDomains; preload

我解决了这个问题。只有 XmlHttpRequests 失败的原因是应用程序在看到 XmlHttpRequest 请求时有一种特殊行为,它将大约 3000 字节的额外标头转储到响应中。这使得总标头大小大于默认的 nginx 标头缓冲区。

nginx 阻塞大型 HTTP 标头有效负载很常见,因为它的默认缓冲区大小比大多数其他 Web 服务器小,只有 4k 或 8k。错误的解决方案是通过添加这些设置将用于标头的缓冲区增加到 16k。

proxy_buffers         8 16k;  # Buffer pool = 8 buffers of 16k
proxy_buffer_size     16k;    # 16k of buffers from pool used for headers

nginx 文档非常模糊,并且这些设置的命名也很模糊。据我了解,每个连接都有一个缓冲区池。在本例中,有 8 个缓冲区,每个缓冲区 16k。这些缓冲区用于从上游 Web 服务器接收数据并将数据传回客户端。

So proxy_buffers决定池。然后proxy_buffer_size确定主机 该缓冲池的大部分可用于从上游服务器接收 HTTP 标头(我认为四舍五入到整个缓冲区大小)。第三个设置proxy_busy_buffer_size确定有多少缓冲池可以忙于发送到客户端(我认为四舍五入到整个缓冲区大小)。默认情况下proxy_busy_buffer_size自动设置为池中缓冲区的数量减 1。

So the proxy_buffers泳池必须足够大以容纳proxy_busy_buffer_size并且仍然有足够的缓冲区剩余以适应至少proxy_buffer_size来自上游 Web 服务器的 HTTP 标头。

净值是如果你增加proxy_busy_buffer_size无论如何,你可能会立即得到令人困惑的错误:"proxy_busy_buffers_size" must be less than the size of all "proxy_buffers" minus one buffer,然后你必须增加池的大小。

And the proxy_buffering off你问设置吗?好吧,这不会禁用代理缓冲!相反,nginx 在将响应发送到浏览器时是否会缓冲整个响应(到缓冲池或磁盘),或者是否仅缓冲适合缓冲池的内容。所以即使你转身off proxy_buffering代理缓冲仍然发生。

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size

http 标头值的最大值? https://stackoverflow.com/questions/686217/maximum-on-http-header-values

我看到了很多关于设置大型缓冲池的建议,例如大数字,例如 8 x 512kb 缓冲区 (= 4MB)。有一个缓冲池每个连接,因此缓冲池越小,可以处理的连接就越多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernetes nginx 入口控制器返回 502,但仅适用于 AJAX/XmlHttpRequest 请求 的相关文章

  • 入口和 SSL 直通

    我最近一直在使用 nginxdemo nginx ingress 控制器 据我了解 该控制器无法执行 SSL 直通 我的意思是 将客户端证书一直传递到后端服务进行身份验证 因此我一直通过标头传递客户端主题 DN 最终 我更喜欢 SSL 直通
  • Kubernetes Web UI(仪表板)缺少图表

    我已经使用 Kubeadm v1 6 安装了 Docker v1 13 和 Kubernetes 然后我安装了 Web UI 仪表板 我可以访问它 但缺少 CPU 内存使用图 为什么会发生这种情况 对我来说 安装后使用图就起作用了heaps
  • Kubernetes 的艰难之路 - 如何设置节点不可调度

    我正在从头开始配置 Kubernetes 集群 原因 它是虚拟机内的本地设置 一切都很好 除了master节点被创建为可调度的 我尝试过分配master通过将所需参数传递给 kubelet 二进制文件来对节点进行标签和适当的污点 不能解决问
  • nginx位置正则表达式,匹配多次

    如何在 nginx 位置正则表达式中多次匹配 看来 x x 语法永远不起作用 例如 location abc w 1 3 从来不工作 您必须引用包含以下内容的位置 or 人物 location abc w 1 3 否则 nginx 将其解析
  • Google Kubernetes Engine 中的存储 ReadWriteMany

    有没有一种方法能够提供 ReadWriteMany 存储而无需实现存储集群 我能够使用 gcsfuse 提供存储 但速度非常慢 我需要接近 GlusterFS 速度的东西 我目前正在使用 GlusterFS 另一种选择 Google Clo
  • Nginx 是否也缓冲来自客户端的 http 请求?

    我知道 Nginx 可以缓冲来自上游服务器的响应 我的问题是 Nginx 是否也缓冲来自客户端的 http 请求 我的意思是 如果 Nginx 从客户端收到 http 请求 它是否立即与上游服务器建立连接 或者它会在收到整个http请求后创
  • Kubernetes 通过基于时间的触发器扩展 Pod

    我有一台在 Kubernetes 上运行的服务器来处理每小时的处理作业 考虑使用服务来公开 pod 并使用 外部 cron 作业来访问负载均衡器 以便 kubernetes 可以根据需要自动缩放以处理更高的负载 然而在实现中 如果 cron
  • 指定命名空间时,无法使用 nginx-stable 中的 helm 安装 nginx ingress

    我有个问题 我正在尝试使用 helm 3 安装 nginx 但当我指定命名空间时它不起作用 知道为什么吗 它无需任何操作即可工作 helm install nginx release nginx stable nginx ingres n
  • 使用 Nginx 在 Docker 容器内部署带有路由器的 Angular2

    我正在尝试部署一个使用框架的路由器功能的 Angular 2 但在 docker 容器内使用 nginx 为其提供服务时遇到一些问题 由 angular cli 构建的 Angular 应用程序具有如下文件结构 dist 08c42df75
  • 如何使用 kubectl 了解有关先前发布版本的更多详细信息?

    有给出的命令here https kubernetes io docs reference kubectl cheatsheet updating resources其中解释了如何使用执行回滚kubectl 列出以前的部署版本的是 kube
  • Nginx merge_slashes 重定向

    我在我的 Java 应用程序中使用 nginx 我的问题是 nginx 正在合并斜杠 我无法将我的网站重定向到正确的版本 例如 http goout cz cs koncerty praha 被合并到 http goout cz cs ko
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • K8s服务无法ping通

    我在 minikube 集群中有一个 k8s 服务 部署 名称amq in default命名空间 D20181472 argo k8s gms kubectl get svc all namespaces NAMESPACE NAME T
  • Kubernetes / kubectl - “必须指定容器名称”,但看起来确实如此?

    我正在调试 kubectl 的日志输出 其中指出 Error from server BadRequest a container name must be specified for pod postgres operator 49202
  • 连接被拒绝:当uwsgi和nginx在不同容器中时

    我正在尝试设置两个 docker 容器 是的 无需 docker compose 分开 一个带有 nginx 另一个带有带有基本 Flask 应用程序的 uwsgi 我在 docker 内的同一网络中运行容器我的 nginx 配置已添加 链
  • 如何从清单文件(通常是清单文件与 kubectl 运行)使用 kubectl port-forward

    我正在尝试在本地使用 Kubernetes 运行我的第一个应用程序 或者我应该说 minikube 我有一个非常基本的 Web 服务器 一个本地 docker 镜像 和官方 mongodb 我想从 dockerhub 中提取 镜像 我并不是
  • 阻止 ingress-nginx 负载均衡器上的特定路径

    我有许多指向入口控制器 IP 的域 我想阻止所有域 站点的 特定路径 有没有办法做到这一点 我可以用nginx ingress kubernetes io configuration snippet 对于每个站点 但正在寻找同时处理所有站点
  • 如何通过 kubectl 代理访问此 Kubernetes 服务?

    我想通过以下方式访问我的 Grafana Kubernetes 服务kubectl 代理服务器 https kubernetes io docs user guide kubectl v1 7 proxy 但由于某种原因 即使我可以使其适用
  • 如何从容器内运行 podman?

    我想跑podman https podman io作为运行 CI CD 管道的容器 但是 我不断从 podman 容器中收到此错误 podman info ERRO 0000 overlay is not supported over ov

随机推荐