
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 location
blocos, mas isso não é muito elegante e realmente fez meu site parecer muito mais lento ...
Também tentei mover os dois location
blocos 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 server
bloco:
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_control
a variável terá um valor vazio e o nginx não adicionará Pragma
nenhum Cache-Control
cabeç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 include
para incluir o arquivo em sua configuração.
Você digitaria o seguinte para proxy_header.conf
arquivar:
add_header Pragma "public";
add_header Cache-Control "public";
E na sua configuração:
location ~* ... {
include /path/to/webroot;
expires 365d;
}