Nginx не обновляет max-age

Если я сделаю запрос к прокси-серверу Nginx, настроенному для кэширования восходящего потока, я получу следующие заголовки ответа:

{'content-length': '13200000', 'x-cache-status': 'MISS', 'server': 'nginx/1.9.9', 'connection': 'keep-alive', 'cache-control': 'max-age=45', 'date': 'Fri, 27 Jan 2017 10:57:55 GMT'}

Через пару секунд я делаю тот же запрос снова, я получаю следующие заголовки:

{'content-length': '13200000', 'x-cache-status': 'HIT', 'server': 'nginx/1.9.9', 'connection': 'keep-alive', 'cache-control': 'max-age=45', 'date': 'Fri, 27 Jan 2017 10:58:18 GMT'}

Вышеуказанный сервер задает заголовок максимального возраста до 45 секунд. Разве второй заголовок ответа не должен иметь обновленный заголовок максимального возраста? То есть max-age=45-(время между запросами)?

редактировать

Пример конфигурации, воспроизводящей поведение:

http {
    include       mime.types;
    default_type  application/octet-stream;

    upstream backend {
        server localhost:8080;
    }

    proxy_cache_path /etc/nginx/wwwroot/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
            proxy_cache my_cache;
            add_header X-Cache-Status $upstream_cache_status;
        }
    }

    server {
        listen 8080;
        root /etc/nginx/wwwroot;
        expires 60s;
    }
}

Результат:

root@ubuntu:/home/parallels# curl -I localhost/testfile.txt
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 28 Jan 2017 19:08:45 GMT
Content-Type: text/plain
Content-Length: 12
Connection: keep-alive
Last-Modified: Fri, 27 Jan 2017 14:45:39 GMT
ETag: "588b5d13-c"
Expires: Sat, 28 Jan 2017 19:09:45 GMT
Cache-Control: max-age=60
X-Cache-Status: MISS
Accept-Ranges: bytes

root@ubuntu:/home/parallels# curl -I localhost/testfile.txt
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 28 Jan 2017 19:08:48 GMT
Content-Type: text/plain
Content-Length: 12
Connection: keep-alive
Last-Modified: Fri, 27 Jan 2017 14:45:39 GMT
ETag: "588b5d13-c"
Expires: Sat, 28 Jan 2017 19:09:45 GMT
Cache-Control: max-age=60
X-Cache-Status: HIT
Accept-Ranges: bytes

1 ответ

В вашей конфигурации Nginx просто обратный прокси. Он ничего не переписывает, потому что вы не сказали ему переписывать что-либо. Он просто хранит страницы, сгенерированные вышестоящим сервером, и доставляет их, когда ему говорят.

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

Я не думаю, что есть какой-то способ, чтобы Nginx отслеживал, когда вышестоящий сервер отправил страницу, и переписал заголовки страницы перед ее передачей клиенту. Это должно быть сделано на сервере приложений.

Согласно этой статье срок действия истекает http/1.0, контроль кэша - http/1.1. Вы можете использовать любой из них, но они конфликтуют, поэтому я думаю, что браузеры обновят страницу, когда либо скажут.

ИМХО, вам нужно решить, что вы хотите, а затем настроить сервер приложений или Nginx для его использования. Nginx может переписать заголовки, если у вас есть модуль headers_mod из вашего дистрибутива или скомпилированный. Если есть время, когда страница не должна быть кэширована после того, как я предлагаю вам использовать Expires. Если вы просто хотите, чтобы в браузерах были достаточно свежие страницы, лучше контролировать кеш, поскольку вы можете определять такие вещи, как кеширование прокси-серверами и CDN. Вы всегда можете указать Expires для указания времени, а для управления кэшированием указать поведение CDN и прокси-кэша, включая повторную проверку.

Предложите больше мыслей и исследований, а все остальное вы разработаете сами. Полезная ссылка о контроле кеша здесь.

Другие вопросы по тегам