nginx - 在 Keycloak 中从上游读取响应 header 时,上游发送的 header 太大

标签 nginx oauth-2.0 keycloak openid-connect

我正在尝试使用我正在构建的 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;

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

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

最佳答案

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

我有一篇关于它的详细文章here .本质上,如果您没有为 NGINX 分配足够的缓冲区来读取响应 header ,那么它将因此错误而失败。

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

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

无论哪种方式,您都将从默认值提高它,并将其与增加 proxy_busy_buffers_size 结合起来。 , 和 proxy_buffers以及。

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

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

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

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

关于nginx - 在 Keycloak 中从上游读取响应 header 时,上游发送的 header 太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57503590/

相关文章:

nginx - 如何在没有网络连接的CentOs7上以root权限安装Nginx?

node.js - 如何将 HTTP 流转换为 HTTPS?

Keycloak 使用管理 cli 创建身份提供者映射器

keycloak - 如何通过 REST API 为 Keycloak 中的每个用户属性创建映射器?

mysql - PDO异常 : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known

ruby-on-rails - NGINX 和配置文件中的环境变量

android - Android 的 Spring : request authorization headers (not basic)

java - 是否有 OAuth 2 服务器端 PHP 或 Java 实现?

java - 如何管理休息服务中的 session ?

keycloak - Keycloak 中的 "Welcome"字母的 "Finish registration"