【问题标题】:Upstream sent too big header while reading response header from upstream in Keycloak上游在 Keycloak 中从上游读取响应标头时发送了太大的标头
【发布时间】:2019-12-21 12:51:57
【问题描述】:

我正在尝试使用我正在构建的 Android 应用对 keycloak 服务器进行 OIDC 身份验证/授权。

我收到以下错误,这导致我在我的应用程序中收到 502:

2019/08/15 00:29:04 [error] 31921#31921: *64410338 upstream sent too big header while reading response header from upstream, client: 192.168.4.61, server: stage.example.com, request: "GET /auth/realms/master/protocol/openid-connect/auth?client_id=example-mobile-android&redirect_uri=http%3A%2F%2Flocalhost%3A53978%2F%23%2Flogin&state=a627edff-c1a2-43d3-8c6e-e5635bcc2252&response_mode=fragment&response_type=id_token%20token&scope=openid&nonce=69967773-36ba-49b2-8dd8-a31fd36f412b&prompt=none HTTP/1.1", upstream: "http://192.168.4.147:8080/auth/realms/master/protocol/openid-connect/auth?client_id=example-mobile-android&redirect_uri=http%3A%2F%2Flocalhost%3A53978%2F%23%2Flogin&state=a627edff-c1a2-43d3-8c6e-e5635bcc2252&response_mode=fragment&response_type=id_token%20token&scope=openid&nonce=69967773-36ba-49b2-8dd8-a31fd36f412b&prompt=none", host: "www.example.com", referrer: "http://localhost:53978/"

这两个我都试过了:

proxy_buffer_size          128k;
proxy_buffers              4 256k;
proxy_busy_buffers_size    256k;

以及完全禁用代理缓冲区。

会发生什么?我是否进一步扩大缓冲区?还有其他一些我没有发现的错误吗?

【问题讨论】:

    标签: nginx oauth-2.0 keycloak openid-connect


    【解决方案1】:

    对于这个错误,应该归咎于proxy_buffer_size

    我对此有详细的记录here。本质上,如果您没有为 NGINX 分配足够的缓冲区来读取响应标头,那么它将失败并出现此错误。

    如果您可以完整地重构请求 URL/headers,则可以计算此参数所需的值,例如:

    curl -s -w \%{size_header} -o /dev/null https://example.com
    

    无论哪种方式,您都会提高它的默认值,并将其与增加的proxy_busy_buffers_sizeproxy_buffers 结合起来。

    如果您无法确定响应标头/正文的大小,那么可以 - 逐渐增加内容,直到解决问题为止。

    不要只是将缓冲区设置为任意高的值,因为这些缓冲区是针对每个连接的,并且会占用更多的 RAM。

    出于同样的原因,最好在 NGINX 中创建一个单独的位置并调整缓冲区值,以便仅在此处使用更大的缓冲区,而不会影响 NGINX 的整体 RAM 使用量。

    附:禁用代理缓冲无济于事,因为 NGINX 总是 缓冲响应标头:)

    【讨论】:

      【解决方案2】:

      这取决于添加到访问令牌的内容。我见过大小约为 1MB 的令牌;这是极端情况,其中令牌包含许多用于授权的用户组/角色。尝试配置更大的缓冲区大小。

      【讨论】:

      • Hrm,但是iOS应用没有这个问题,理论上是在做类似的动作。什么可能导致 Android 应用程序出现这种情况?你推荐什么缓冲区大小? 1M? 2M?那么代理缓冲区可以是任意值吗?
      • 我在上面的所有项目中都添加了 0。验证时仍然是 502 错误,但它没有显示在 nginx 日志中。我完全糊涂了。
      • 如果你不需要它,你可以删除 nginx 组件,keycloak 可以直接服务请求。检查您的 iOS 应用 - 也许它不请求令牌,只请求 id_token,因此它没有达到基础设施标头大小限制。
      • 如何将我在 Android 应用中的请求更改为只需要 id_token?这会涉及切换身份验证流程吗?
      • 参数response_type=id_token 而不是response_type=id_token%20token
      猜你喜欢
      • 2017-04-09
      • 2020-01-15
      • 2015-10-26
      • 2014-11-03
      • 2019-12-09
      • 2021-02-04
      • 2018-12-14
      • 1970-01-01
      相关资源
      最近更新 更多