nginxcachingnginx-cache

What does Nginx take into account when caching a request?


What attributes(headers, cookies) besides url does Nginx take into account when caching a request?

I was trying to find out this information in nginx/log/access.log file. I have found only information about what type of request had been made(GET) and its status(404, 200, etc.).

Here my nginx.conf file:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid logs/nginx.pid;
    
events {
    worker_connections  1024;
}

# MY TEST SERVER
http {
    # CACHE
    proxy_cache_path "C:\data\cache" levels=1:2 keys_zone=all:32m;

    server {
        listen 80;
        location / {
            proxy_pass http://127.0.0.1:81/;
            proxy_cache all;
            proxy_cache_valid 404 502 503 1s;
            proxy_cache_valid any 10s;
        }
      
    server {
        listen 81;
        location / {
            root "C:\data\www";
        }
        location /images/ {
            root "C:\data";
        }
    }
}

Solution

  • What does Nginx take into account when caching a request?

    The full URL

    The relevant config for what Nginx uses when caching a request is proxy_cache_key

    Syntax: proxy_cache_key string;

    Default: proxy_cache_key $scheme$proxy_host$request_uri;

    Context: http, server, location

    Defines a key for caching, for example

    proxy_cache_key "$host$request_uri $cookie_user"; 
    

    By default, the directive’s value is close to the string

    proxy_cache_key $scheme$proxy_host$uri$is_args$args;
    

    So by default Nginx does not take into account any headers when caching a request, only the full url (with get Args)

    How to customize the cache key

    To customize the cache key only requires using the proxy_cache_key directive.

    To cache based on a cookie value, there's already an example in the documentation - but I suggest:

    proxy_cache_key "$host$request_uri:u:$cookie_user";
    

    Why add more text to the key? Consider what happens if you use multiple cookies like so:

    proxy_cache_key "$host$request_uri:u:$cookie_user:g:$cookie_group";
    

    It avoids the possibility of a request with only $cookie_group colliding with the cached content for something with the same value only in $cookie_user. It also makes it easier to understand what the files on disk contain, if you have the need to look.

    If you want to use an arbitrary header - just include the variable for that header e.g.:

    proxy_cache_key "$host$request_uri:n:$http_name";