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

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

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

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

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

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

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

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