Nginx можно настроить как кеширующий прокси перед облачным хранилищем. Часто запрашиваемые файлы будут отдаваться с сервера, что снижает количество обращений к хранилищу и ускоряет загрузку для посетителей.
Когда это нужно
Схема подходит сайтам с большим количеством статики: изображениями товаров, медиафайлами, документами. Для редко запрашиваемых архивов кеширование пользы не даёт.
Что понадобится
Сервер с Nginx и правами root, бакет с публичным доступом на чтение.
Шаг 1. Создание зоны кеша
В файл /etc/nginx/nginx.conf в секцию http добавьте:
proxy_cache_path /var/cache/nginx/s3 levels=1:2 keys_zone=s3_cache:10m max_size=10g inactive=7d use_temp_path=off;
Параметр max_size задаёт максимальный размер кеша на диске, inactive — срок хранения файлов, к которым не было обращений.
Создайте каталог и выдайте права:
mkdir -p /var/cache/nginx/s3
chown -R www-data:www-data /var/cache/nginx/s3
В CentOS и Rocky Linux вместо www-data используется пользователь nginx.
Шаг 2. Настройка прокси
В конфигурации сайта добавьте блок location:
location /static/ {
proxy_pass https://s3.hostflyby.net/имя-бакета/;
proxy_set_header Host s3.hostflyby.net;
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_cache s3_cache;
proxy_cache_valid 200 302 7d;
proxy_cache_valid 404 1m;
proxy_cache_revalidate on;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
add_header X-Cache-Status $upstream_cache_status;
expires 7d;
}
Директива proxy_cache_use_stale позволяет отдавать файл из кеша, если хранилище временно недоступно.
Шаг 3. Проверка конфигурации
nginx -t
systemctl reload nginx
Проверьте работу кеша запросом к файлу:
curl -I https://вашсайт.by/static/имя-файла.jpg
В заголовках ответа появится X-Cache-Status. Значение MISS означает первое обращение, HIT — отдачу из кеша.
Шаг 4. Очистка кеша
Для полной очистки удалите содержимое каталога и перезагрузите Nginx:
rm -rf /var/cache/nginx/s3/*
systemctl reload nginx
Частые ошибки
502 Bad Gateway. Проверьте адрес в proxy_pass и заголовок Host: он должен совпадать с адресом хранилища.
X-Cache-Status всегда MISS. Хранилище отдаёт заголовки, запрещающие кеширование. Добавьте директиву proxy_ignore_headers Cache-Control Expires;
403 Forbidden. Бакет закрыт на чтение. Откройте публичный доступ к объектам или настройте политику на чтение.
