Я добавил 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;
пропал, отсутствует.