快取 nginx auth_request

快取 nginx auth_request

我正在嘗試配置 nginx1.12.2反向代理來使用微服務auth_request並對請求進行身份驗證。proxy_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 資料夾已創建,但其中沒有寫入任何內容,並且不會快取對我們的 auth 端點的請求。

僅供參考,我們的身份驗證端點的結果非常少:

< 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 不快取它。

再次抱歉,我無法發表評論,但如果可以的話我確實想提供幫助。

相關內容