Если я сделаю запрос к прокси-серверу 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 здесь.