Estoy intentando configurar un 1.12.2
proxy inverso nginx para usar auth_request
y proxy_cache
autenticar solicitudes en un microservicio. Los usuarios finales envían un token simple Bearer
con su solicitud y el servidor intenta obtener un recurso con él para determinar si pueden continuar. Esa recuperación de recursos debe almacenarse en caché para un token determinado para aliviar la carga del punto final de autenticación. Aquí está mi configuración hasta el momento:
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;
}
}
Desde la perspectiva del cliente, esto funciona muy bien, pero cuando miro el servidor nginx, nunca se escribe nada en la carpeta de caché. La carpeta /var/cache/nginx/auth_cache
se crea, pero siempre está vacía. ¿Qué podría faltarme?
actualizar
Al intentar esto con el nginx más nuevo ( 1.17.9
actualmente), todavía nunca vemos nada escrito en la carpeta de caché. En otra parte vi la sugerencia de que las cookies podrían bloquear el almacenamiento en caché; esta aplicación no usa cookies, pero lo intentamos de todos modos:
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 "";
}
Sigue siendo el mismo comportamiento; Se crea la carpeta auth_cache, pero nunca se escribe nada allí y las solicitudes a nuestro punto final de autenticación no se almacenan en caché.
Solo como referencia, los resultados de nuestro punto final de autenticación son extremadamente mínimos:
< HTTP/1.1 200 OK
< Date: Sun, 12 Apr 2020 18:04:08 GMT
< Server: Kestrel
< Content-Length: 0
También hemos simplificado el punto final de autenticación remota desde que hice esta pregunta originalmente. Ahora, es un http
recurso simple que se ejecuta dentro del mismo clúster que el proceso nginx. Actualicé el ejemplo anterior para reflejar eso.
actualización final
En caso de que alguien más intente usar esto como referencia, además de las dos respuestas útiles a continuación, necesitábamos corregir la clave de caché en el ejemplo anterior:
proxy_cache_key "$http_x_auth_token$request_uri";
Solo tiene sentido si realmente lo estás usando X-Auth-Token
como encabezado y no solo Authorization
. La clave anterior funcionará, pero significa que la primera respuesta de autenticación proxy para cualquier uri se almacenará en caché y se ignorará el token real. Realmente necesitábamos:
proxy_cache_key "$http_authorization$request_uri";
Respuesta1
Intente actualizar NGINX.
Tuve el mismo problema con 1.14.0, donde las solicitudes manuales a /auth con curl se almacenaban en caché, pero las subsolicitudes auth_request no.
Después de actualizar a NGINX 1.16.1, comenzó a funcionar.
Respuesta2
No puedo dejar comentarios porque soy nuevo, pero proxy_ignore_headers pueden ayudarte.
proxy_ignore_headers Expires Cache-Control;
Según los documentos de Nginx; Deshabilita el procesamiento de ciertos campos del encabezado de respuesta del servidor proxy.
Si su servidor de aplicaciones devuelve instrucciones "sin almacenamiento en caché", Nginx las respetará; al ignorar estos encabezados, se ignoran todas las instrucciones de almacenamiento en caché.
Además, ¿cuál es el estado de la caché en los encabezados de respuesta http de Nginx en la máquina del cliente? BYPASS hará que nginx no lo almacene en caché.
Una vez más, lamento no poder dejar un comentario, pero quería ayudar si pudiera.