Nginx 在KeyClope中从上游读取响应头时,上游发送了太大的头

Nginx 在KeyClope中从上游读取响应头时,上游发送了太大的头,nginx,oauth-2.0,keycloak,openid-connect,Nginx,Oauth 2.0,Keycloak,Openid Connect,我正在尝试使用我正在构建的Android应用程序对KeyClope服务器进行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, re

我正在尝试使用我正在构建的Android应用程序对KeyClope服务器进行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;
以及完全禁用代理缓冲区


会发生什么事?我是否进一步扩展缓冲区?是否有其他错误我没有捕获?

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

对于此错误,应归咎于代理缓冲区大小

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

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

curl -s -w \%{size_header} -o /dev/null https://example.com
无论哪种方式,您都将从默认值提高它,并将其与增加
proxy\u busy\u buffers\u size
proxy\u buffers
相结合

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

不要只是将缓冲区设置为任意高的值,因为这些缓冲区是每个连接的缓冲区,将有助于更高的RAM使用率

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


另外,禁用代理缓冲不会有帮助,因为NGINX总是缓冲响应头:)

Hrm,但iOS应用程序没有这个问题,理论上正在执行类似的操作。是什么原因导致Android应用程序出现这种情况?你推荐什么样的缓冲区大小?一百万?2米?那么代理缓冲区可以是任意值吗?我在上面的所有项目中都添加了一个0。身份验证时仍然存在502错误,但它没有显示在nginx日志中。我完全搞糊涂了。如果你不需要nginx组件,你可以删除它,keydepeat可以直接为请求服务。检查你的iOS应用程序-可能它不请求令牌,只请求id_令牌,因此它没有达到基础结构标头大小限制。我如何在Android应用程序中将我的请求更改为只需要id_令牌?这是否涉及转换身份验证流?参数
response\u type=id\u token
而不是
response\u type=id\u token%20token