как настроить nginx в качестве кеширующего обратного прокси?

<p>недавно я слышал, что nginx добавил кеширование в функцию обратного прокси. я оглянулся, но не смог найти много информации об этом.</p><p>я хочу настроить nginx в качестве обратного прокси-сервера для кэширования перед apache/django: иметь прокси-запросы nginx для некоторых (но не всех) динамических страниц к apache, затем кэшировать сгенерированные страницы и обслуживать последующие запросы этих страниц из кэша.</p><p>в идеале я хотел бы аннулировать кеш двумя способами:</p><ol> <li>установить срок действия для кэшированного элемента</li> <li>явно аннулировать кэшированный элемент. например. если мой django бэкэнд обновил определенные данные, я бы хотел, чтобы nginx аннулировал кэш затронутых страниц)</li> </ol><p>можно ли настроить nginx для этого? как?</p>

<p>я не думаю, что есть способ явно аннулировать кэшированные элементы, но вот пример того, как сделать все остальное. <strong> обновление: </strong> как уже упоминал петр в другом ответе, есть <a href="http://labs.frickle.com/nginx\_ngx\_cache\_purge/">модуль очистки кэша</a> , который вы можете использовать. вы также можете принудительно обновить кэшированный элемент, используя progin\_cache\_bypass от nginx - для получения дополнительной информации см. <a href="https://serverfault.com/a/334924/15314">ответ чериана</a> .</p><p>в этой конфигурации элементы, которые не кэшируются, будут извлечены из example.net и сохранены. кэшированные версии будут предоставляться будущим клиентам до тех пор, пока они не станут недействительными (60 минут).</p><p>ваши http-заголовки cache-control и expires будут учтены, поэтому, если вы хотите явно установить дату истечения срока действия, вы можете сделать это, установив правильные заголовки в том, к чему вы используете прокси.</p><p>существует множество параметров, которые вы можете настроить - см. документацию модуля прокси-сервера nginx для получения дополнительной информации обо всем этом, включая сведения о значении различных настроек/параметров: <a href="http://nginx.org/r/proxy\_cache\_path">http://nginx.org/r/proxy\_cache\_path</a> </p><pre><code>http { proxy\_cache\_path /var/www/cache levels=1:2 keys\_zone=my-cache:8m max\_size=1000m inactive=600m; proxy\_temp\_path /var/www/cache/tmp; server { location / { proxy\_pass http://example.net; proxy\_cache my-cache; proxy\_cache\_valid 200 302 60m; proxy\_cache\_valid 404 1m; } } } </code></pre>

<p>вы можете конкретно <a href="http://wiki.nginx.org/httpproxymodule#proxy\_cache\_bypass">сделать недействительными кэшированные</a> страницы через</p><pre><code>proxy\_cache\_bypass </code></pre><p>скажем, вы хотите кешировать страницу, установите кеш таким образом</p><pre><code>location = /pageid { proxy\_pass http://localhost:82; proxy\_set\_header host $host; proxy_set_header x-real-ip $remote\_addr; proxy\_set\_header x-forwarded-for $proxy_add_x_forwarded_for; proxy_ignore_headers set-cookie; proxy_ignore_headers cache-control; proxy_cache_bypass $http\_secret\_header; add\_header x-cache-status $upstream_cache_status; } теперь, когда вы хотите <strong>  аннулировать эту страницу и снова кэшировать </strong>сделайте секретный вызов curl с заголовкомcurl "www.site.com/pageid" -s -i -h "secret_header:true" это сделает недействительным и кеширует его.работает от nginx 0.7.в качестве дополнительного бонуса add_header x-cache-status можно использовать для проверки, находится ли страница в кэше или нет.

я предлагаю вам дать <a href="http://varnish.projects.linpro.no/">лак попробовать. varnish специально разработан как кеш обратного прокси. он учитывает все заголовки управления кэшем, отправленные вами с сервера origin, что удовлетворяет вашему первому запросу.для вашего второго запроса явная недействительность. я настоятельно рекомендую изменить имя url ресурса, который вы хотите аннулировать, либо переименовав файл, либо воспользовавшись какой-либо формой разгона кэша строки запроса. в varnish есть операция purge, которая удалит ресурс из кеша varnish, но не даст вам контроля над другими кешами между вами и пользователем. как вы сказали, что хотите явно очистить ресурс, тогда стандартные заголовки управления http вам не помогут. в этом случае самый надежный способ обойти кеширование ресурса - это переименовать его.

для аннулирования выбранных страниц вы можете использовать патч "cache_purge" для nginx-0.8.x, который делает именно то, что вы хотите;)это доступно <a href="http://labs.frickle.com/nginx_cache_purge/">здесь .

большинство инструментов кэширования (citrix) позволяют принудительное обновление (ctrl + r) для повторного заполнения кэшированной страницы.вот трюк, который я нашел, чтобы сделать что-то подобное в nginx.server { # other settings proxy_pass_header set-cookie; # i want to cache logged-in users proxy_ignore_headers x-accel-redirect; proxy_ignore_headers x-accel-expires expires cache-control; if ($http\_cache\_control ~ "max-age=0") {set $eac 1;} proxy_cache_bypass $eac; } </code></pre><p>это предполагает, что когда вы делаете ctrl + r в вашем браузере, заголовок cache-control имеет max-age = 0 в своем запросе. я знаю chrome делает это, но я не пробовал в других браузерах. добавить больше полей заголовка можно легко, просто добавив больше операторов if, которые устанавливают <code>$eac переменная к 1.

кэширование - довольно новая функция в nginx (и пока не очень хорошо документированная), но достаточно стабильная для использования в производстве.  используйте <a href="http://wiki.nginx.org/nginxhttpproxymodule#proxy_cache">английская документация    спросите в <a href="http://wiki.nginx.org/mailinglistsubscribe">списки рассылки    translate <a href="http://sysoev.ru/nginx/docs/http/ngx_http_proxy_module.html#proxy_cache">русская документация с чем-то вроде google translate   используйте <a href="http://varnish.projects.linpro.no/">лак   

я считаю, что <a href="http://wiki.nginx.org/nginxhttpproxymodule">nginxhttpproxymodule способен обрабатывать http-запросы. ищите директивы, начинающиеся с:proxy_cache да, можно контролировать поведение кэша с помощью таких директив:proxy_cache_valid 

исходя из того, что вы не можете найти на нем документы, я бы немного опасался полагаться на него в процессе производства. вы рассматривали лак? это мой "nginx обратных прокси", маленький, легкий, выполняющий одну работу и выполняющий ее хорошо.

если вы используете etags в своем приложении и ставите nginx перед ним, тогда он позаботится об истечении срока действия, потому что, если etag изменится, это сделает кеш недействительным.

вы можете контролировать срок действия кэша nginx с помощью нескольких директив/параметров: proxy_cache_valid 200 302 10m; добавление одного из заголовков http ниже (приоритет важен - проверьте <a href="http://czerasz.com/2015/03/30/nginx-caching-tutorial/">мой пост в блоге ):  expires cache-control x-accel-expires    параметр inactive в proxy_cache_path директива: proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;  я рекомендую <a href="http://czerasz.com/2015/03/30/nginx-caching-tutorial/">мое сообщение в блоге , если вы хотите узнать больше о кэшировании nginx.тема чистки действительно интересна, поскольку эта функция существует только в nginx plus (коммерческое издание nginx). мне очень нравится ответ @ randy-wallace. но есть и другие возможности, такие как <a href="https://github.com/frickle/ngx_cache_purge">модуль ngx_cache_purge .самое простое, что вы можете сделать, это удалить кэшированный файл вручную:  сгенерируйте свой хэш-ключ: echo -n ‘httpczerasz.com/time.php’ | md5sum   удалить файл из файловой системы: rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271  

для будущих посетителей: тем временем обратный прокси-сервер nginx имеет встроенное кэширование, и документы доступны по адресу:  <a href="https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache">https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache  <blockquote> синтаксис: зона proxy_cache | выкл; по умолчанию: proxy_cache выключен; контекст: http, сервер, местоположение определяет зону разделяемой памяти, используемую для кэширования. одну и ту же зону можно использовать в нескольких местах. значение параметра может содержать переменные (1.7.9). параметр off отключает кэширование, унаследованное от предыдущего уровня конфигурации. </blockquote>

 уровни fastcgi_cache_path/opt/nginx-cache = 2: 2 keys_zone = img: 50m; location/img/{ fastcgi_pass $ backend; include fcgi\_params; fastcgi\_intercept\_errors off; fastcgi\_cache\_key $ server_addr $ request\_uri; fastcgi\_cache img; fastcgi\_cache\_valid any 1m; fastcgi\_hide\_header set-cookie; } </pre><p>это создает кеш для/img/location. он находится в/opt/nginx-cache. объекты кэшируются на 1 минуту.</p><p>вы можете написать разные коды ответов вместо любых.</p><p>теперь вы не можете аннулировать кеш для выбранных страниц. возможно, в 0.8.x это будет возможно.</p>

<p>существует плагин nginx под названием <a href="http://code.google.com/p/ncache/">ncache</a> , который утверждает, что является "системой веб-кеша, основанной на веб-сервере nginx. быстрее и эффективнее, чем squid".</p>