Переосмысление генерации кеша в Nginx с использованием директивы map

8 min

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

Здравствуйте, это Муно.
Когда я часто обновляю записи в блоге, я не хочу, чтобы старый кеш загружался при каждом обновлении.
Однако я хочу доставлять контент из кеша, насколько это возможно, поэтому я подумаю об этом.

Прекращение определения кеша с помощью if

Подход, при котором устанавливается флаг, например, с помощью $do_not_cache, как показано в этой статье, а затем изменяется кешируемый контент с помощью оператора if, по-видимому, в настоящее время устарел.
Представляем архитектуру (OpenResty+Redis), которая позволяет использовать прокси-кеш Nginx для ускорения WordPress, даже если он избыточен

Тем не менее, где же тогда определять кеш?

Директива map оценивает содержимое переменной Nginx и присваивает результат этой оценки другой переменной в качестве значения.

2022-03-01 Попытка фильтрации логов Nginx

В ходе исследования я нашел очень простой синтаксис.
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;
    ...
}

Понятно, это ясно.

Целевой кеш

В основном, я хочу, чтобы все файлы, кроме html, имели длительный срок кеширования, а html-файлы кешировались лишь на короткое время.
Причина в том, что в случае DOS или флуд-атаки я хочу, чтобы сервер Nginx отвечал как можно дольше.
Попробую настроить следующим образом.

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

Теперь я выполню nginx -t, service nginx restart и протестирую с помощью curl.

Если в URI запроса нет html, кеш не создается...

Похоже, что кеширование происходит по ключу html-файла, поэтому кеширование на уровне домена не выполняется.

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

Отсутствие информации о cache-control при выполнении curl -I https://soulminingrig.com означает, что этот запрос не был включен в определение кеша.
Хотя фактически отображается index.html, Nginx не распознает это как таковое, поэтому я попробую следующее.

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

Таким образом, кеш будет храниться в течение 5 минут для любого запроса, соответствующего регулярному выражению, без вопросов.
Давайте снова выполним curl -I.

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

Теперь все успешно кешируется.

Благодаря этому кешированию синтаксис файла конфигурации значительно сократился, и теперь для изменения настроек кеша достаточно изменить директиву map, что очень удобно.
На этом все. До новых встреч.

Related Posts