![快取 nginx auth_request](https://rvso.com/image/717776/%E5%BF%AB%E5%8F%96%20nginx%20auth_request.png)
我正在嘗試配置 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 不快取它。
再次抱歉,我無法發表評論,但如果可以的話我確實想提供幫助。