2012-02-10 28 views
15

Estoy tratando de almacenar en caché el contenido estático que se encuentra básicamente dentro de las rutas a continuación en la configuración del servidor virtual. Por alguna razón, los archivos no se almacenan en caché. Veo varias carpetas y archivos dentro del directorio de caché pero siempre es algo así como 20mb no más alto, no más bajo. Si fuera el almacenamiento en caché, las imágenes, por ejemplo, tomarían al menos 500 mb de espacio.nginx como proxy de caché no almacena nada en el caché

Aquí es la parte caché nginx.conf:

** nginx.conf ** 
proxy_cache_path /usr/share/nginx/www/cache levels=1:2 keys_zone=static$ 
proxy_temp_path /usr/share/nginx/www/tmp; 
proxy_read_timeout 300s; 

Heres el servidor virtual predeterminado.

**sites-available/default** 
server { 
    listen 80; 

    root /usr/share/nginx/www; 
    server_name myserver; 
    access_log /var/log/nginx/myserver.log main; 
    error_log /var/log/nginx/error.log; 

    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

    location ~* ^/(thumbs|images|css|js|pubimg)/(.*)$ { 
      proxy_pass http://backend; 
      proxy_cache static; 
      proxy_cache_min_uses 1; 
      proxy_cache_valid 200 301 302 120m; 
      proxy_cache_valid 404 1m; 
      expires max; 
    } 

    location/{ 
      proxy_pass http://backend; 
    } 
} 
+0

Ha tou tryed para activar el registro de error? –

+1

sí. nada concluyente –

Respuesta

35

Asegúrese de que el backend no vuelve Set-Cookie cabecera. Si Nginx lo ve, desactiva el almacenamiento en caché.

Si este es tu caso, la mejor opción es arreglar tu back-end. Al fijar el backend no es una opción, es posible indicar Nginx ignorar Set-Cookie cabecera

proxy_ignore_headers "Set-Cookie"; 
proxy_hide_header "Set-Cookie"; 

Véase el documentation

proxy_ignore_header se asegurará de que el almacenamiento en caché se lleva a cabo. proxy_hide_header se asegurará de que la carga útil de Cookie no esté incluida en la carga útil en caché. Esto es importante para evitar la filtración de cookies a través de la memoria caché NGINX.

+4

en realidad no fue set-cookie, pero el control de caché. Descubrí que IIS en realidad almacenaba en caché los archivos estáticos y la respuesta a nginx era no almacenar en caché esos archivos prolly porque ya estaba en caché. Una vez que eliminé esos archivos de iis caché, funcionó. :) –

+1

¡Te amo, me salvaste la noche! – micred

+0

y mi noche ... lo que queda de ella – mkoryak

10

Me gustaría agregar que las múltiples opciones de configuración y combinaciones pueden deshabilitar el caché de proxy en Nginx. Lamentablemente, esto está mal documentado.

En mi configuración configuré proxy_buffering on y habilité el almacenamiento en caché como se esperaba.

+1

Entonces, ¿cómo se relaciona 'proxy_buffering on', puede explicar por favor? – Meglio

+0

Estaba buscando alguna documentación oficial sobre la relación entre el almacenamiento intermedio de proxy y el almacenamiento en memoria caché proxy, pero no pude encontrar ningún buen recurso para citar aquí. Agregué esta respuesta, porque al cambiar 'proxy_buffering' fuera simplemente se desactiva cualquier comportamiento de almacenamiento en caché configurado, sin una advertencia o cualquier otra cosa. Supongo que sin almacenar en el búfer el nginx no tiene forma de almacenar y, por lo tanto, almacenar en caché una respuesta del servidor al que está enviando el proxy. Esta respuesta insinúa algunas cosas, tal vez incluso pregunte a Tero Kilkanen quién dio la respuesta: http://serverfault.com/a/692585/144118 – Overbryd

+0

Hizo mi día. ¡He pasado 3 días! Para descubrir lo que el **** está mal con nuestra configuración. Grande, genial gracias @Overbryd, desde el fondo de mi corazón. –

0

Por lo que vale la pena, mi experiencia es que nginx no siempre almacena en caché las cosas donde se lo dice.

Por ejemplo, en centos7, con la opción de configuración

proxy_cache_path /tmp/my_nginx_cache levels=1:2 keys_zone=my_zone:10m inactive=24h max_size=1g; 

nginx realidad almacena en caché los archivos en:

/tmp/systemd-private-phJlfG/tmp/my_nginx_cache 
+2

Eso podría ser systemd, o un parche de RedHat. Pruebe systemctl cat nginx.service y vea si hay una opción para darle chroot o algo similar – Jason

+0

Lo más probable es que tenga que especificar 'proxy_cache_path/tmp/my_nginx_cache use_temp_path = off ...', de lo contrario, nginx se agrega como prefijo 'proxy_temp_path ', que se establece en'/tmp/systemd-private-phJlfG/'en su caso. – antonbormotov

+0

Confirmado - 'PrivateTmp = true' en el archivo de unidad del sistema nginx.service de RHEL nginx rpm. Si coloca su caché en/tmp, no será persistente en esta configuración (el reinicio de nginx dará como resultado que obtenga un nuevo nuevo directorio de caché). –

0

después de pasar por múltiples respuestas y comentarios, me encontré con esta configuración, finalmente funciona:

10m = 10 MB de caché de clave, max_size a 2 GB, inactivo = 120 m (actualización de la fuente después de 120 minutos de inactividad), use_temp_path = off (para reducir io)

proxy_cache_valid - estado de caché de 200 y 302 para 60 minutos

proxy_cache_path /tmp/cache levels=1:2 keys_zone=default_cache:10m max_size=2g 
       inactive=120m use_temp_path=off; 
proxy_cache_key "$scheme$request_method$host$request_uri"; 
proxy_cache_valid 200 302 60m; 

server { 
    listen  80; 
    server_name example.com; 

    # https://www.nginx.com/blog/nginx-caching-guide 
    location/{ 
     proxy_cache default_cache; 
     proxy_buffering on; 
     proxy_ignore_headers Expires; 
     proxy_ignore_headers X-Accel-Expires; 
     proxy_ignore_headers Cache-Control; 
     proxy_ignore_headers Set-Cookie; 

     proxy_hide_header X-Accel-Expires; 
     proxy_hide_header Expires; 
     proxy_hide_header Cache-Control; 
     proxy_hide_header Pragma; 

     add_header X-Proxy-Cache $upstream_cache_status; 
     proxy_pass http://ip-of-host:80; 

     #set   $memcached_key "$uri?$args"; 
     #memcached_pass 127.0.0.1:11211; 
     # error_page  404 502 504 = @fallback; 
    } 
} 
Cuestiones relacionadas