请求 header 为 "too long" 时 Nginx 入口控制器 400 错误

Nginx ingress controller 400 error when request header is "too long"

NGINX Ingress 控制器版本: 0.18.0 Kubernetes版本(使用kubectl版本):1.11.1 云提供商或硬件配置: Azure (AKS) 安装工具: helm

发生了什么: 当请求 url/header 是 "too long".

时,Ingress 控制器给出了一个特定 GET 的 400 错误

您预期会发生什么: 请求被传递到正确的服务和 pod。

如何重现它(尽可能精简和精确): 我们使用 keycloak 进行身份验证。当用户登录时,GET 是使用由 keycloak 生成的访问令牌完成的。访问令牌赋予用户在应用程序中的某些权限。用户具有授予他们 other/more 权限的角色。当用户有很多角色时,访问令牌会显着变长,这会导致 ingres 控制器上出现 400。对于角色较少的用户,它工作正常,我们可以看到 GET 请求被传递到正确的服务..

我们还需要知道什么: 我们已经尝试将 header 缓冲区大小等从 4k 调整到 8 和 16k,但这没有做任何事情。 我将入口控制器日志级别设置为调试,但它没有提供有关 400 错误的更多信息。

我们还通过设置后端服务解决了这个问题,一个 Spring 带有嵌入式 Tomcat 的引导服务,配置 server.max-http-header-size: 64000。所以Nginx服务和后端服务设置必须提高。