2024年9月25日星期三

nginx + oauth2-proxy cookie too large

原因:

通常是因为 OAuth2 Proxy 生成的 Cookie 太大,超出了 Nginx 默认允许的大小限制。

这个问题可以通过调整 Nginx 的配置或修改 OAuth2 Proxy 的配置来解决


1. 增加 Nginx 允许的 Cookie 大小

Nginx 默认的 client_header_buffer_sizelarge_client_header_buffers 设置可能太小,可以通过增加这些参数来允许更大的请求头(包括 Cookie)。

修改 Nginx 配置文件 (nginx.conf 或者相应的虚拟主机配置文件):

http {
# 其他配置... # 增加单个 header 的大小限制(包括 Cookie) client_header_buffer_size 16k; # 增加请求头的最大总大小限制 large_client_header_buffers 4 32k; # 其他配置... }

详细解释:

  • client_header_buffer_size:这个参数定义了 Nginx 为处理客户端请求头分配的初始缓冲区大小。它主要影响单个 HTTP 请求头的大小,比如用户代理字符串、Cookie 等,并不会影响上传文件的主体部分(HTTP body)。

  • large_client_header_buffers:这个参数用于定义当请求头超过 client_header_buffer_size 时,Nginx 允许分配的更大缓冲区数量大小。它也是专门针对处理 HTTP 请求头的,和文件上传的内容(主体)无关。

文件上传的大小和速度主要由以下参数控制:

  • client_max_body_size:这个参数定义了 Nginx 可以接收的 HTTP 请求主体的最大大小,直接影响上传文件的大小。如果需要上传大文件,请确保设置这个参数为足够大的值。例如:

    http { client_max_body_size 100M; }

    这个例子允许上传文件的最大大小为 100 MB。

  • 上传速度控制:可以通过 limit_rate 等参数来限制上传速度,或者通过网络本身的带宽来控制上传速度。Nginx 本身并不会限制上传速度,除非明确配置了相关的限制。

2. 调整 OAuth2 Proxy 的 Cookie 设置

如果调整 Nginx 配置后问题依然存在,可以考虑通过减少 OAuth2 Proxy 生成的 Cookie 大小来进一步解决问题。

可能的调整选项:

  • 减少 Cookie 的大小:如果你启用了 JWT token,并且这个 token 较大,可以尝试启用 OAuth2 Proxy 的 --cookie-refresh--cookie-expire 选项,缩短 token 的有效期,或者尽量减少保存到 Cookie 中的信息。

  • 使用 Redis 或其他外部存储:OAuth2 Proxy 支持使用 Redis 等外部存储来保存会话数据,从而减小 Cookie 大小。你可以通过添加以下参数来启用 Redis:

    --session-store-type=redis \ --redis-connection-url=redis://your_redis_host:6379

1. --cookie-refresh 选项

--cookie-refresh 选项用于控制 Cookie 刷新的间隔时间。每当用户的 Cookie 过了刷新时间,OAuth2 Proxy 会生成一个新的 Cookie,并将其发送回客户端,而不会重新进行身份验证。这个设置有助于减少老旧的、较大的 Cookie 对系统的负担。

  • 默认行为:如果未设置此参数,Cookie 刷新将不会进行,直到用户重新登录。

  • 如何启用:你可以通过设置一个时间值(如 1h 表示 1 小时)来启用 Cookie 刷新。例如:

    --cookie-refresh=1h

    这意味着每小时会刷新用户的 Cookie。

2. --cookie-expire 选项

--cookie-expire 选项用于设置 Cookie 的有效期。有效期到了之后,用户将需要重新登录。这有助于防止 Cookie 长期存活,减轻服务器负担。

  • 如何启用:你可以通过设置一个时间值(如 12h 表示 12 小时)来启用 Cookie 的过期时间。例如:

    --cookie-expire=12h

    这样,OAuth2 Proxy 会设置 Cookie 的有效期为 12 小时,之后用户需要重新进行身份验证。

完整的配置示例

假设希望将 Cookie 刷新间隔设置为 1 小时,Cookie 的有效期设置为 12 小时,并将会话数据存储在 Redis 中,完整的启动命令可能如下:


/oauth2-proxy \ --cookie-refresh=1h \ --cookie-expire=12h \ --session-store-type=redis \ --redis-connection-url=redis://your_redis_host:6379 \ --provider=gitlab \ --email-domain=example.com \ --upstream=http://127.0.0.1:8080

其他优化建议

  • 最小化 Cookie 数据:确保你没有在 OAuth2 Proxy 的配置中启用不必要的 Scope 或附加信息(如用户组、角色等),这些都会增大 token 的体积。

  • 使用 JWT 缩减 Cookie 大小:有时 OAuth2 Proxy 使用 JWT Token 时会使 Cookie 变得较大,可以通过优化 token 生成策略,减少保存到 JWT 中的数据。

通过这些步骤,你可以有效减少 Cookie 的大小,同时控制 token 的刷新频率和有效期,从而优化 OAuth2 Proxy 的使用体验。

没有评论: