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

NGINX: кэширование при установленном X-Accel-Expires

Я добавил X-Accel-истекает заголовок моего статического содержимого, а также Последнее изменение заголовок. Я хотел бы знать, как правильно кэшировать эти элементы без кеширования чего-либо еще.

Это то, что у меня есть на данный момент, но ничего не кеширует:

http {
include       /etc/nginx/mime.types;

access_log  /var/log/nginx/access.log;

sendfile        on;
client_max_body_size 2000m; 
keepalive_timeout  65;
tcp_nodelay        on;

gzip  on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

ssl_certificate /etc/nginx/chain.pem; 
ssl_certificate_key /etc/nginx/key.key;

proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=cache:30m max_size=1G;
proxy_temp_path /var/lib/nginx/proxy 1 2;
proxy_cache_use_stale error timeout invalid_header http_502;

server {
    listen       80;
    server_name domain;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_read_timeout 700;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Чтобы кэшировать материал, сначала вам нужно создать путь к кешу прокси в пределах http контекст, например:

proxy_cache_path    /var/cache/nginx/site1    levels=1:2    keys_zone=site1:10m max_size=1G;

Затем вы также можете дополнительно определить ключ кеширования прокси. Любой запрос, который имеет тот же ключ кеша, что и кешированная запись, получит кешированный ответ, если он есть. Но по умолчанию уже может быть достаточно, поэтому это совершенно необязательно.

Затем, чтобы включить кеш в заданном контексте, просто укажите, какой кеш следует использовать, например:

proxy_cache    site1;

Согласно описанию прокси-кеш действителен директива, nginx уже уважает X-Accel-Expires и действует в соответствии с этим, так что на этом вы в основном закончили. Поскольку вы не хотите кэшировать ничего, что не включает X-Accel-Expires, то вы, вероятно, захотите добавить значение 0 в качестве допустимого времени по умолчанию (настройка X-Accel-Expires в вашем контенте следует перезаписать это значение по умолчанию).

proxy_cache_valid    0m;

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

Затем, в основном, все, что вам нужно сделать, чтобы исправить свою конфигурацию, - это добавить следующее в свой http, server или location контекст:

proxy_cache    cache;
proxy_cache_valid    0m;

(Кроме того, вы можете убедиться, что путь кеша существует и, конечно, имеет правильные разрешения.)


Что касается упомянутого хабрахабр article / example, я не думаю, что на самом деле правильно включать $http_if_modified_since в ключе кеша, потому что вы потенциально можете получить много многокэшированных записей, эффективно расходуя кеш.


Также обратите внимание, что nginx, скорее всего, не прокси X-Accel-Expires заголовок - он использует его только внутри, и IIRC не может пересылать этот заголовок вперед. Чтобы изменить такое поведение, вы также должны явно попросить его проксировать (если вы хотите отлаживать свой контент через nginx и посмотреть, как ваше приложение устанавливает заголовок и т. Д.):

proxy_pass_header "X-Accel-Expires";

Eсть хорошо как об использовании X-Accel-Expires заголовок в nginx в российском ИТ-блоге. Думаю, в вашем случае это может быть очень полезно.

Я думаю, причина в том, что кеш определен, но не включен - proxy_cache cache; пропал, отсутствует.