Кэширование ответов POST не работает в nginx - PullRequest
0 голосов
/ 08 мая 2018

Моя задача - реализовать стратегию микрокэширования с использованием nginx, то есть кэшировать ответы некоторых конечных точек POST на несколько секунд.

В http разделе nginx.conf У меня есть следующее:

proxy_cache_path /tmp/cache keys_zone=cache:10m levels=1:2 inactive=600s max_size=100m;

Тогда у меня есть location в server:

    location /my-url/ {
      root dir;
      client_max_body_size 50k;
      proxy_cache cache;
      proxy_cache_valid 10s;
      proxy_cache_methods POST;
      proxy_cache_key "$request_uri|$request_body";
      proxy_ignore_headers Vary;

      add_header X-Cached $upstream_cache_status;

      proxy_pass http://my-upstream;
    }

Приложение, расположенное по адресу my-upstream, выводит Cache-Control: max-age=10, что, если я правильно понимаю, должно сделать ответы кэшируемыми.

Но когда я делаю повторяющиеся запросы с использованием curl в течение короткого времени (менее 10 секунд)

curl -v --data "a=b&c=d" https://my-host/my-url/1573

все они доходят до бэкэнда (по данным бэкэнда). Кроме того, X-Cached всегда MISS.

Запрос и ответ следуют:

> POST /my-url/1573 HTTP/1.1
> Host: my-host
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Length: 113
> Content-Type: application/x-www-form-urlencoded
> 
* upload completely sent off: 113 out of 113 bytes
< HTTP/1.1 200 OK
< Server: nginx
< Date: Tue, 08 May 2018 07:16:10 GMT
< Content-Type: text/html;charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Keep-Alive: timeout=60
< Vary: Accept-Encoding
< X-XSS-Protection: 1
< X-Content-Type-Options: nosniff
< Strict-Transport-Security: max-age=31536000
< Cache-Control: max-age=10
< Content-Language: en-US
< X-Cached: MISS

Так что кеширование не работает.

  1. Что я здесь не так делаю?
  2. Есть ли в nginx средство ведения журнала, которое позволяло бы понять, почему оно решило не кэшировать ответ?

1 Ответ

0 голосов
/ 09 мая 2018

Оказалось, что следующая директива (которая была определена глобально) препятствовала работе кэширования:

proxy_buffering off;

Когда я перезаписываю его в location config с proxy_buffering on;, кэширование начинает работать.

Итак, чтобы кэширование работало с POST-запросами, мы должны сделать следующее:

  1. Вывести Cache-Control: public, max-age=10 заголовок на сервер
  2. Добавить proxy_cache_path config и location config в nginx (примеры приведены в тексте вопроса)
  3. Убедитесь, что proxy_buffering - это on для местоположения, в котором мы хотим включить кэширование.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...