缓存 nginx auth_request

缓存 nginx auth_request

我正在尝试配置一个 nginx1.12.2反向代理来使用auth_requestproxy_cache验证对微服务的请求。最终用户Bearer在请求中发送一个简单的令牌,服务器尝试使用该令牌获取资源以确定是否允许他们继续。应该为给定的令牌缓存该资源获取,以减轻身份验证端点的负担。这是我目前的配置:

ssl_certificate                 /etc/nginx/ssl/certificate;
ssl_certificate_key             /etc/nginx/ssl/key;
proxy_cache_path                /var/cache/nginx/auth_cache levels=1:2 keys_zone=auth_cache:1m max_size=1g inactive=60m;
server {
    listen                      80;
    listen                      443 ssl;
    server_name                 myapi.mydomain.com;
    location / {
        proxy_pass              http://myapi/;
        auth_request            /auth;
    }
    location = /auth {
        internal;
        proxy_pass              https://authendpoint.mydomain.com/api/user/verify;
        proxy_cache             auth_cache;
        proxy_cache_key         "$http_x_auth_token$request_uri";            
        proxy_pass_request_body off;
        proxy_set_header        Content-Length "";
        proxy_set_header        X-Original-URI $request_uri;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

从客户端的角度来看,这很好,但是当我查看 nginx 服务器时,缓存文件夹中没有任何内容被写入。文件夹/var/cache/nginx/auth_cache已创建,但始终为空。我可能遗漏了什么?

更新

使用较新的 nginx(1.17.9,目前)尝试此操作,我们仍然看不到任何内容写入缓存文件夹。我在其他地方看到了有关 cookie 可能阻止缓存的建议 - 此应用程序不使用 cookie,但我们还是尝试了:

location = /auth {
    internal;
    proxy_pass              http://authservice/api/user/verify;
    proxy_cache             auth_cache;
    proxy_cache_key         "$http_x_auth_token$request_uri";   
    proxy_pass_request_body off;
    proxy_set_header        Content-Length "";
    proxy_set_header        X-Original-URI $request_uri;
    proxy_hide_header       Set-Cookie;
    proxy_ignore_headers    Set-Cookie;
    proxy_set_header        Cookie "";
}

仍然是相同的行为;创建了 auth_cache 文件夹,但其中从未写入任何内容,并且对我们的身份验证端点的请求不会被缓存。

仅供参考,我们的身份验证端点的结果极其少:

< HTTP/1.1 200 OK
< Date: Sun, 12 Apr 2020 18:04:08 GMT
< Server: Kestrel
< Content-Length: 0

自从我最初提出这个问题以来,我们还简化了远程身份验证端点。现在,它是http与 nginx 进程在同一集群内运行的普通资源。我已更新上述示例以反映这一点。

最后更新

万一其他人尝试使用此作为参考,除了以下两个有用的答案之外,我们还需要修复上面示例中的缓存键:

proxy_cache_key         "$http_x_auth_token$request_uri";            

X-Auth-Token仅当您实际使用标头而不仅仅是时才有意义Authorization。上面的密钥将起作用,但这意味着任何 uri 的第一个代理身份验证响应都将被缓存,并且实际令牌将被忽略。实际上,我们需要:

proxy_cache_key         "$http_authorization$request_uri";            

答案1

尝试升级 NGINX。

我在使用 1.14.0 时遇到了同样的问题,其中使用 curl 对 /auth 的手动请求被缓存,但 auth_request 子请求没有被缓存。

升级到 NGINX 1.16.1 后它开始工作。

答案2

由于我是新手,我无法发表评论,但 proxy_ignore_headers 可能会对您有所帮助。

proxy_ignore_headers Expires Cache-Control;

根据 Nginx 文档; 禁用来自代理服务器的某些响应头字段的处理。

如果您的应用服务器返回任何“无缓存”指令,Nginx 将会遵守它们,通过忽略这些标头,任何缓存指令都会被忽略。

另外,客户端计算机上 Nginx 的 http 响应标头中的缓存状态是什么。 BYPASS 将导致 nginx 不缓存它。

再次抱歉,我无法发表评论,但如果可以的话我确实想提供帮助。

相关内容