上游从Keycloak的上游读取响应标头时发送了太大的标头

时间:2019-08-15 00:32:47

标签: nginx oauth-2.0 keycloak openid-connect

我正在尝试使用正在构建的Android应用程序对密钥斗篷服务器进行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;

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

可能会发生什么?我是否可以进一步扩展缓冲区?我没有发现其他错误吗?

2 个答案:

答案 0 :(得分:0)

这取决于添加到访问令牌的内容。我已经看到了约1MB大小的令牌;在极端情况下,令牌包含许多用于授权的用户组/角色。尝试配置更大的缓冲区大小。

答案 1 :(得分:0)

对于此错误,应归咎于proxy_buffer_size

我对此here进行了详细的介绍。本质上,如果您没有为NGINX分配足够的缓冲区来读取响应头,那么它将因该错误而失败。

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

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

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

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

不要仅仅将缓冲区设置为任意高的值,因为这些缓冲区是每个连接的,并且会增加RAM的使用量。

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

P.S。禁用代理缓冲将无济于事,因为NGINX 总是缓冲响应标头:)