Repensando a Geração de Cache no Nginx Usando a Diretiva map

9 min

language: ja bn en es hi pt ru zh-cn zh-tw

Olá, sou um incompetente.
Quando atualizo artigos de blog com frequência, não quero que o cache antigo seja carregado junto com as atualizações dos artigos.
No entanto, quero entregar o conteúdo do cache o máximo possível, então vou pensar sobre isso.

Parar de usar 'if' para determinar o cache

Parece que a abordagem de definir um sinalizador como $do_not_cache (conforme introduzido em artigos como este) e depois usar uma instrução if para alterar o conteúdo a ser armazenado em cache está agora obsoleta.
Introdução a uma arquitetura (OpenResty+Redis) que permite o uso comum do cache de proxy do Nginx para acelerar o WordPress, mesmo com redundância

Dito isso, onde devemos determinar o cache?

A diretiva map avalia o conteúdo de uma variável Nginx e atribui o resultado como um valor a outra variável.

2022-03-01 Tentando filtrar os logs do Nginx

Enquanto pesquisava, encontrei uma sintaxe muito simples postada.
Adding location-block to cache files makes those files return 404

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;
    ...
}

Entendi, é fácil de entender.

Cache Desejado

Basicamente, quero que todos os arquivos, exceto os html, tenham um cache longo, e os arquivos html podem ter um cache um pouco menor.
Isso porque, em caso de ataques DoS ou de inundação, quero que o servidor Nginx responda o máximo possível...
Por enquanto, vou tentar configurar da seguinte forma.

map $uri $expire {
    ~\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2)(\?.*)?$ 365d;
    ~\.html$ 5m;
}

map $uri $cache_control {
    ~\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2)(\?.*)?$ public;
    ~\.html$ public;
}

Com isso, vou executar nginx -t, service nginx restart e testar com curl.

Se o URI da requisição não contiver 'html', ele não fará cache...

Aparentemente, como estou configurando o cache usando arquivos html como chave, ele não tenta armazenar em cache por domínio.

alleycat:[haturatu]:~/git$ curl -I https://soulminingrig.com
HTTP/2 200 
server: nginx/1.27.0
date: Sat, 23 Nov 2024 12:20:55 GMT
content-type: text/html
content-length: 15699
vary: Accept-Encoding
last-modified: Sat, 23 Nov 2024 12:08:31 GMT
etag: "3d53-627935ba8f789"
accept-ranges: bytes
vary: Accept-Encoding
content-security-policy: upgrade-insecure-requests
alt-svc: h3=":443"; ma=86400
x-content-type-options: nosniff

alleycat:[haturatu]:~/git$ curl -I https://soulminingrig.com/index.html
HTTP/2 200 
server: nginx/1.27.0
date: Sat, 23 Nov 2024 12:21:00 GMT
content-type: text/html
content-length: 15699
vary: Accept-Encoding
last-modified: Sat, 23 Nov 2024 12:08:31 GMT
etag: "3d53-627935ba8f789"
accept-ranges: bytes
vary: Accept-Encoding
expires: Sat, 23 Nov 2024 12:26:00 GMT
cache-control: max-age=300
content-security-policy: upgrade-insecure-requests
alt-svc: h3=":443"; ma=86400
x-content-type-options: nosniff
pragma: public
cache-control: public

O fato de as informações de cache-control estarem faltando ao executar curl -I https://soulminingrig.com significa que não foram incluídas nesta determinação de cache.
Na verdade, ele está exibindo index.html, mas o Nginx não o reconhece como tal para a determinação, então vou tentar desta forma agora.

map $uri $expire {
    ~\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2)(\?.*)?$ 365d;
    ~\.html$ 5m;
    ~\.*$ 5m;
}

map $uri $cache_control {
    ~\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2)(\?.*)?$ public;
    ~\.html$ public;
    ~\.*$ public;
}

Dessa forma, ele manterá o cache para qualquer coisa por 5 minutos, sem exceção, usando expressões regulares.
Vamos tentar curl -I novamente.

alleycat:[haturatu]:~/git$ curl -I https://soulminingrig.com
HTTP/2 200 
server: nginx/1.27.0
date: Sat, 23 Nov 2024 12:44:43 GMT
content-type: text/html
content-length: 15699
vary: Accept-Encoding
last-modified: Sat, 23 Nov 2024 12:08:31 GMT
etag: "3d53-627935ba8f789"
accept-ranges: bytes
vary: Accept-Encoding
expires: Sat, 23 Nov 2024 12:49:43 GMT
cache-control: max-age=300
content-security-policy: upgrade-insecure-requests
alt-svc: h3=":443"; ma=86400
x-content-type-options: nosniff
pragma: public
cache-control: public

alleycat:[haturatu]:~/git$ curl -I https://soulminingrig.com/top.png
HTTP/2 200 
server: nginx/1.27.0
date: Sat, 23 Nov 2024 12:44:47 GMT
content-type: image/png
content-length: 46584
vary: Accept-Encoding
last-modified: Sat, 23 Nov 2024 12:08:31 GMT
etag: "b5f8-627935ba12787"
accept-ranges: bytes
expires: Sun, 23 Nov 2025 12:44:47 GMT
cache-control: max-age=31536000
content-security-policy: upgrade-insecure-requests
alt-svc: h3=":443"; ma=86400
x-content-type-options: nosniff
pragma: public
cache-control: public

alleycat:[haturatu]:~/git$ curl -I https://soulminingrig.com/index.html
HTTP/2 200 
server: nginx/1.27.0
date: Sat, 23 Nov 2024 12:44:51 GMT
content-type: text/html
content-length: 15699
vary: Accept-Encoding
last-modified: Sat, 23 Nov 2024 12:08:31 GMT
etag: "3d53-627935ba8f789"
accept-ranges: bytes
vary: Accept-Encoding
expires: Sat, 23 Nov 2024 12:49:51 GMT
cache-control: max-age=300
content-security-policy: upgrade-insecure-requests
alt-svc: h3=":443"; ma=86400
x-content-type-options: nosniff
pragma: public
cache-control: public

Conseguiu armazenar tudo em cache com sucesso.

Com este método de cache, a sintaxe do arquivo de configuração ficou consideravelmente mais curta, e agora, ao querer alterar as configurações de cache, basta modificar a diretiva map, tornando-o muito mais conveniente.
Então é isso. Até a próxima.

Related Posts