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

Как обновить кеш обратного прокси-сервера Nginx с помощью поля ETag / Last-Modified серверной части?

Я пытаюсь настроить обратный прокси-сервер Nginx должным образом. Однако я обнаружил, что после кэширования файла он никогда не будет обновляться / повторно проверяться даже при изменении внутреннего файла, что можно определить по ETag или LAST-Modified поле. Может кто-нибудь любезно помочь мне в этом вопросе?

Вот моя настройка:

proxy: proxy.test.com
backend: back.example.com

Настройки nginx:

proxy_cache_path /home/cache levels=1:2 keys_zone=cache_rev:16m inactive=14d max_size=12g;
proxy_cache_key "$scheme://$host$request_uri";
server {
    listen 80 default_server;

    resolver 74.82.42.42;
    server_name proxy.test.com;

    location ~ ^/ {
        proxy_pass http://back.example.com$request_uri;
        proxy_redirect off;
        proxy_buffering on;
        proxy_cache_revalidate on;
        proxy_pass_header Set-Cookie;

        proxy_cache cache_rev;
        proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
        proxy_cache_valid 200  1d;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        add_header X-Cache-Status $upstream_cache_status;
    }
}

Вот информация о завиткахbefore и after бэкэнд-файл изменен.

До смены index.html :

$ curl -I http://proxy.test.com/index.html
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Sat, 12 Dec 2015 14:30:18 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 18283
Connection: keep-alive
Last-Modified: Sat, 12 Dec 2015 14:09:14 GMT
ETag: "261e044-476b-526b3fc1b6983"
Content-Language: zh-TW
X-Cache-Status: HIT
Accept-Ranges: bytes

$ curl -I http://back.example.com/index.html
HTTP/1.1 200 OK
Date: Sat, 12 Dec 2015 14:30:32 GMT
Server: Apache
Last-Modified: Sat, 12 Dec 2015 14:30:32 GMT
ETag: W/"261e044-476d-526b44eb57c31"
Accept-Ranges: bytes
Content-Length: 18285
Content-Type: text/html; charset=utf-8

После смены index.html:

$ curl -I ttp://proxy.test.com/index.html
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Sat, 12 Dec 2015 14:30:54 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 18283
Connection: keep-alive
Last-Modified: Sat, 12 Dec 2015 14:09:14 GMT
ETag: "261e044-476b-526b3fc1b6983"
Content-Language: zh-TW
X-Cache-Status: HIT
Accept-Ranges: bytes

$ curl -I http://back.example.com/index.html
HTTP/1.1 200 OK
Date: Sat, 12 Dec 2015 14:30:53 GMT
Server: Apache
Last-Modified: Sat, 12 Dec 2015 14:30:53 GMT
ETag: W/"261e044-476b-526b450fe6a03"
Accept-Ranges: bytes
Content-Length: 18283
Content-Type: text/html; charset=utf-8

Одни только Etags вам не помогут. Etag используется для условных запросов со стороны клиента (браузера) для управления собственным кешем.

Nginx не попадет в восходящий поток, если найдет ресурс в своем кеше. Смысл обратного прокси-сервера в том, чтобы ускорить работу, не подключаясь к апстредму каждый раз. Вы должны либо установить Expires: DATE/TIME или Cache-control: max-age=XXX заголовки (а лучше то и другое, чтобы быть уверенным) на вышестоящем сервере, чтобы кэш знал, как долго он может хранить файлы в кэше. Для динамического контента лучше всего использовать cache-control: no-cache.

Проверьте эти ссылки для более подробного объяснения того, как HTTP/1.1 кеширование работает:

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