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 и прокси-кэша, включая повторную проверку.
Предложите больше мыслей и исследований, а все остальное вы разработаете сами. Полезная ссылка о контроле кеша здесь.