Adicionar bloco de localização aos arquivos de cache faz com que esses arquivos retornem 404

Adicionar bloco de localização aos arquivos de cache faz com que esses arquivos retornem 404

Quero armazenar em cache alguns arquivos estáticos usando o Nginx. Mas de alguma forma não consigo fazê-lo funcionar.

Este é meu nginx.conf:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    #multi_accept on;
}


http {

    #GZIP
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 256;
    gzip_types application/javascript application/json application/ld+json application/xml font/eot font/otf font/ttf text/css text/javascript text/plain text/xml;

    # SERVERS
    server {
            listen      80;

        server_name example.com;
        if ($http_host ~* ^www\.(.*)$ )
        {
            return 301 https://$1$request_uri;
        }

        return 301 https://$http_host$request_uri;
    }
    server {
        listen 443 ssl;

        if ($http_host ~* ^www\.(.*)$ )
        {
            return 301 $scheme://$1$request_uri;
        }


        #SSL
        ssl_certificate /root/.acme.sh/example.com/fullchain.cer;
        ssl_certificate_key /root/.acme.sh/example.com/example.com.key;

        server_name example.com;

        # Pass all traffic to my webapplication
        location / {
            proxy_set_header Host $host;
            proxy_pass http://localhost:8080;
        }

        #Browser caching
        location ~* \.(js|css)$ {
            expires 180d;
            add_header Pragma "public";
            add_header Cache-Control "public";
        }
        location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
            expires 365d;
            add_header Pragma "public";
            add_header Cache-Control "public";
        }

    }
}

O problema está na parte "Cache do navegador". Ao habilitar este bloco de código, meu site carrega, mas todos os arquivos css, arquivos javascript e imagens retornam um 404. É como se esses arquivos estivessem ignorando meu arquivo location /.

Consegui resolver esse problema copiando/colando

proxy_set_header Host $host;
proxy_pass http://localhost:8080;

em todos os meus locationblocos, mas isso não é muito elegante e realmente fez meu site parecer muito mais lento ...

Também tentei mover os dois locationblocos para o cache do navegador no bloco location \para que o último atuasse como 'pai'. Mas isso não atrapalhou o comportamento das imagens etc. retornando 404.

Como eu configuraria o cache de arquivos estáticos no Nginx?

Editar: Eu adicionei o seguinte ao meu http-block:

  map $uri $cache_control {
                ~/Website/assets/media/images    "public, no-transform";
        }
        map $uri $expire {
            ~/Website/assets/media/images   365d;
        }

Adicionado o seguinte ao meu serverbloco:

 expires $expire;
                add_header Cache-Control $cache_control;

Nada está sendo armazenado em cache.

Responder1

Se você não pode servir seus ativos estáticos diretamente do sistema de arquivos via nginx, como sugere @TeroKilkanen, você pode usar uma técnica semelhante à mostrada emesseresponder:

map $uri $expire {
    ~\.(?:j|cs)s$                      180d;
    ~\.(?:jpe?g|png|webp|woff2?|ttf)$  365d;
    default                            off;
}
map $uri $cache_control {
    ~\.(?:js|css|jpe?g|png|webp|woff2?|ttf)$  public;
}
server {
    ...
    expires $expire;
    add_header Pragma $cache_control;
    add_header Cache-Control $cache_control;
    ...
}

Se o URI da sua solicitação não corresponder ao regex, $cache_controla variável terá um valor vazio e o nginx não adicionará Pragmanenhum Cache-Controlcabeçalho à sua resposta.

Responder2

Na verdade, isso não responde à sua pergunta, mas mostra uma maneira preferida de servir ativos estáticos com o nginx.

Como parece que você está executando o aplicativo da web no mesmo host, recomendo que você forneça os arquivos estáticos diretamente usando o nginx.

root /path/to/webroot;

location ~* \.(js|jss)$ {
    expires 180d;
    add_header Pragma "public";
    add_header Cache-Control "public;

    try_files $uri =404;
}

location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
    expires 365d;
    add_header Pragma "public";
    add_header Cache-Control "public";

    try_files $uri =404;
}

Este ainda possui definições duplicadas para armazenamento em cache. Você pode eliminar algumas duplicações especificando diretivas em um arquivo separado e usando includepara incluir o arquivo em sua configuração.

Você digitaria o seguinte para proxy_header.confarquivar:

add_header Pragma "public";
add_header Cache-Control "public";

E na sua configuração:

location ~* ... {
    include /path/to/webroot;
    expires 365d;
}

informação relacionada