A configuração expira os cabeçalhos do conteúdo estático veiculado no nginx


96

Estou usando o nginx para servidor do meu conteúdo estático; existe uma maneira de definir os cabeçalhos de expiração para cada arquivo que atenda a uma regra específica? Por exemplo, posso definir o cabeçalho de expiração para todos os arquivos com extensão '.css'?

Respostas:


126

Prefiro fazer um cabeçalho de cache mais completo, além de mais algumas extensões de arquivo. O '?' prefixo é uma marca de 'não captura', o nginx não cria um $ 1. Ajuda a reduzir a carga desnecessária.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

7
Todos os meus arquivos estáticos não foram encontrados depois de adicionar isso.
Jürgen Paul

@ JackSpairow: Eu realmente não posso explicar por que isso aconteceu, pois sempre funcionou para mim. Você está executando o Nginx sem o módulo de fornecimento add_header? Esse tipo de coisa realmente tem escopo limitado, você tem certeza de que outra desaceleração não é um problema combinado?
JM Becker

24
Provavelmente outro bloco tinha definição para os arquivos estáticos com um rootconjunto; nesse caso, você deve adicionar as diretivas a esse bloco. (Eu sei que isto é 2y tarde, mas para os cidadãos futuros)
aularon

1
Pessoalmente, aprecio esclarecimentos, especialmente para futuros pesquisadores, porque eles costumam aparecer muito depois da postagem original. 1: P
JM Becker

usando isso totalmente bagunça meu site wordpress. css e imagens não são exibidas. existe algum outro conflito em algum lugar?
precisa saber é o seguinte


17

Não tenho reputação suficiente para comentar por que a resposta aceita faria com que os arquivos não fossem mais exibidos, mas descobri e gostaria de ajudar!

Versão curta:

Certifique-se de ter um diretório raiz especificado para o seu bloco de localização nas imagens, se você não tiver um conjunto global!

Versão longa abaixo:


Primeiro de tudo, meu método de implementar esta solução foi realmente semelhante a esta resposta , onde você escreve a regra (como na resposta aceita):

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

em um arquivo img-cache.conf

e inclua esse arquivo na sua server {...}diretiva.

Meu exemplo de somesite.com na minha pasta de sites disponíveis:

 #Image Caching
 include /etc/nginx/conf/img-cache.conf;

Dessa forma, você pode adicionar o bloco de local de armazenamento em cache da imagem a vários sites em execução.


Em segundo lugar, tenho uma situação em que meu / var / www / contém duas pastas que eu permito como public_html - seguro e treinamento, por isso tenho que criar blocos de localização específicos na diretiva de servidor do meu site destacando essas pastas.

Como tal, não tenho um diretório raiz global definido .

Portanto, quando você cria os blocos de localização da imagem, pode não estar fornecendo a eles um diretório raiz a partir do qual procurar as imagens!

Minha solução foi então:

location ~ ^/training.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

location ~ ^/.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/secure;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

1
+1 por tornar isso reutilizável .conf. A pasta apropriada em nginx/1.14.0 (Ubuntu)parece ser /etc/nginx/snippets/.
Jan Werkhoven 26/10/10

9

Você também pode definir o prazo de validade para o máximo. Aqui está a diretiva que eu uso para css e js.

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}

1
Eu usaria a diretiva raiz apenas no bloco do servidor {}; ao usá-la em sub-localizações, isso leva a consequências inesperadas. Você não precisa de descanso; ou, como você não está em um bloco se {}
Dave Cheney

Você está certo. Esqueceu de limpar isso. Editado para refletir isso.
Jauder Ho

4

Todas as soluções acima mencionadas negarão a possibilidade de ter aliases diferentes para caminhos diferentes. Também para ter todas as suas diferentes expirações de cache em um só lugar, você deve usar o mapa nginx da seguinte maneira.

...

# Expires mappings
map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     7d;
    ~image/                    max;
}

...

server {
   listen ...;

   expires $expires;
   location /assets/ {
      # It is now possible to serve some resources from different path
      alias /var/www/my_other_path/
   }

   # and have them all have same expirations
   location / {
       try_files $uri $uri/ /index.html;
   }
...
}

Offdesativa o armazenamento em cache, epoch(para a época do unix) resulta no recurso sempre sendo recuperado, maxdefine a data para o valor máximo do navegador.

A imagem ~ corresponde a qualquer tipo de imagem.

Mais sobre os mapas do nginx em http://nginx.org/en/docs/http/ngx_http_map_module.html .


Observe que se $sent_http_content_typefor "text/css;charset=UTF-8"a expressão acima falhará.
Pachanka

2

Se você tiver um local que abriga todos os seus arquivos estáticos, algo como isso servirá ...

 location /static {
            your/location/to/static/files/static;
            expires 30d;
            add_header Cache-Control "public";
    }

A resposta aceita fez com que o nginx não encontrasse nenhum dos meus arquivos estáticos. Não tenho muita certeza do porquê, mas essa é uma alternativa simples.


Votei neste, mas certifique-se de adicionar a /staticpasta (o que você definir no local) no final do alias (logo depois .../filesno exemplo).
Miro J.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.