Назад | Перейти на главную страницу

Это ошибка nginx proxy_cache?

У меня очень простая конфигурация прокси:

http {
    proxy_cache_path /var/www/cache levels=1:2 keys_zone=s3-images-cache:50m inactive=1M max_size=1000m;
    proxy_temp_path /var/www/cache/tmp;

    server {
        listen 80;
        server_name images.example.com;

        location / {
            proxy_cache s3-images-cache;
            proxy_cache_key $scheme$proxy_host$uri$is_args$args;
            proxy_cache_bypass $http_purge_cache;
            proxy_cache_valid any 1y;
            proxy_pass http://images-example.s3.amazonaws.com;
            add_header X-Cache $upstream_cache_status;

            proxy_intercept_errors on;
            error_page 404 = @no_image;
        }

        location @no_image {
            return 403;
        }
    }
}

А теперь следуй за мной сюда:

  1. Запросим /image.jpg.
  2. На прокси отправляется запрос для /image.jpg (еще не существует).
  3. Серверная часть отвечает 404.
  4. "proxy_intercept_errors on" срабатывает и вызывается "error_page 404 = @no_image".
  5. Nginx возвращает 403.
  6. Сделайте еще один запрос для того же изображения и убедитесь, что "X-Cache: HIT" установлен. Мы явно попадаем в кеш прокси.

Но, если мы проверим папку / var / www / cache / в это время, мы увидим, что для этого запроса не создан элемент кеша. Значит ли это, что Nginx хранит кеш для него в памяти и забыл записать в файл?

  1. Загрузим /image.jpg в бэкэнд.
  2. Теперь выполните запрос "PURGE-CACHE: 1" к этому изображению. Мы видим, что теперь мы получаем изображение вместо 403 с присутствующим заголовком «X-Cache: BYPASS». Хорошо.

Если мы проверим / var / www / cache /, мы увидим, что файл кеша теперь наконец создан для этого запроса. Заглянув внутрь кешированного файла, мы видим, что это наше изображение.

  1. Вот проблема: давайте снова запросим /image.jpg с помощью обычного запроса GET. Мы должны получить только что загруженное изображение?
  2. Nginx возвращает 403 с «X-Cache: HIT». Зачем? Кажется, что он попадает в кеш, но возвращает что-то еще, а не то, что находится в папке / var / www / cache ?? Как?

Мое единственное объяснение этому - похоже, что Nginx кэширует ответ в памяти и не записывает в файл, когда мы обнаруживаем ошибку с помощью нашей настраиваемой error_page в прокси-ответах. Кроме того, при использовании proxy_cache_bypass он не перезаписывает кеш в памяти, поэтому последующие запросы к тому же элементу будут использовать старый кеш, который хранится в памяти, а не новый, созданный в папке кеша.

Может ли кто-нибудь сообщить мне, если я делаю что-то не так, или это действительно ошибка. Провел последние 3 дня, борясь с этим.

ОБНОВИТЬ: Backend возвращает обычный набор заголовков, который вы ожидаете от S3 в ответах 200 и 404:

404

Connection:close
Content-Type:application/xml
Date:Fri, 20 Nov 2015 07:41:39 GMT
Server:AmazonS3
Transfer-Encoding:chunked
x-amz-id-2:bH8L/1dOVGShsGJdZZ/zS/X6UkHS+KMAxDxnPvOkIalpPphFJXr9zZ1RiV6L2a13NXoZ3QdCOeE=
x-amz-request-id:D66FDBFAA9643252

200

Accept-Ranges:bytes
Connection:keep-alive
Content-Length:10533
Content-Type:image/jpeg
Date:Fri, 20 Nov 2015 07:47:12 GMT
ETag:"061b4dae0b2bbdf4a4fa212951f4ba79"
Last-Modified:Wed, 11 Nov 2015 14:29:09 GMT
Server:AmazonS3
x-amz-id-2:qsSmH/gkvql2jnj67p0vguZBXQJHfS+Yk70llBaDvbgH0xSCbvj9G9JlKn5WhWTdty0+JzApN7k=
x-amz-request-id:8CF04EA869190E63