Reconsiderando la generación de caché en Nginx usando la directiva map
Hola, soy un inútil.
Cuando actualizo artículos de blog con frecuencia, no quiero que se cargue la caché antigua junto con las actualizaciones de los artículos.
Sin embargo, quiero entregar desde la caché tanto como sea posible, así que lo consideraré.
Dejar de determinar la caché con if
Parece que el enfoque de establecer una bandera con $do_not_cache, como se presenta en artículos como este, y luego intentar cambiar el contenido en caché con una sentencia if, ahora está en desuso.
Introducción a una arquitectura (OpenResty+Redis) que permite el uso común de la caché proxy de Nginx para acelerar WordPress, incluso con redundancia
Dicho esto, ¿dónde se debe determinar la caché?
Con la directiva map, se evalúa el contenido de una variable de Nginx y se asigna el resultado como un valor a otra variable.
2022-03-01 Intentando filtrar los logs de Nginx
Mientras investigaba, encontré una sintaxis muy simple publicada.
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;
...
}
Ya veo, es claro.
Caché deseada
Básicamente, está bien mantener una caché larga para archivos que no sean html, y solo una caché corta para los archivos html.
Esto se debe a que, en caso de ataques DoS o de inundación, quiero que el servidor Nginx responda tanto como sea posible...
Por ahora, intentaré configurarlo de la siguiente manera.
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;
}
Ahora, ejecutaré nginx -t, service nginx restart y probaré con curl.
Si no hay html en la URI de la solicitud, no se almacenará en caché...
Al parecer, como está configurado para almacenar en caché usando archivos html como clave, no intentará almacenar en caché a nivel de dominio.
Aunque en realidad está mostrando index.html, Nginx no lo entiende como una determinación, así que esta vez intentaré esto.
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
El hecho de que la información de cache-control falte cuando ejecuté curl -I https://soulminingrig.com significa que no está incluida en esta determinación de caché.
Aunque en realidad está mostrando index.html, Nginx no lo entiende como una determinación, así que esta vez intentaré esto.
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;
}
De esta manera, mantendrá la caché para cualquier cosa durante 5 minutos sin excepción, usando expresiones regulares.
Intentemos curl -I de nuevo.
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
Con éxito, todo está ahora en caché.
Al hacer esto, la sintaxis del archivo de configuración se ha acortado considerablemente, y ahora es más cómodo porque solo necesito modificar la directiva map cuando quiero cambiar la configuración de la caché.
Eso es todo por ahora. ¡Hasta la próxima!