Лак, похоже, работает, но max-age = 0

isvarnishworking.com дает мне знать, что

Кажется, что лак отвечает на этот url, но Cache-Control значение заголовка "max-age" меньше 1, что означает, что никогда не обслуживайте контент из кеша на этом URL-адресе.

Значение максимального возраста: 0

И этот заголовок info

The url we checked: myDomainHere.com
    HTTP/1.1 200 OK
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By:   PHP/5.5.9-1ubuntu4.5
Set-Cookie: PHPSESSID=vgk7db66kh7nce8lpe5789u105; path=/
Expires:    Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control:  max-age=60, private, proxy-revalidate
Pragma: no-cache
Vary:   Accept-Encoding,User-Agent
Content-Encoding:   gzip
Content-Type:   text/html
Content-Length: 14192
Accept-Ranges:  bytes
Date:   Sat, 18 Jul 2015 09:31:55 GMT
X-Varnish:  324589322
Age:    0
Via:    1.1 varnish
Connection: keep-alive

У меня это в .htaccess

 <FilesMatch "\.(js|css)$">
    Header set Cache-Control "max-age=604800, public"
</FilesMatch>
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
    Header set Cache-Control "max-age=604800, public"
</FilesMatch>
<FilesMatch "\.(html|htm|php)$">
    Header set Cache-Control "max-age=60, private, proxy-revalidate"
</FilesMatch>

Итак, мой вопрос: мне действительно нужно изменить, что max-age = 0, чтобы лак работал лучше? Если да, где бы я это сделал? Я использую apache2 на капли ubuntu digitalocean

-edit -

Это мой /etc/varnish/default.vcl

# This is a basic VCL configuration file for varnish.  See the vcl(7)
# man page for details on VCL syntax and semantics.
#
# Default backend definition.  Set this to point to your content
# server.
#
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}
#
# Below is a commented-out copy of the default VCL logic.  If you
# redefine any of these subroutines, the built-in logic will be
# appended to your code.
# sub vcl_recv {
#     if (req.restarts == 0) {
#       if (req.http.x-forwarded-for) {
#           set req.http.X-Forwarded-For =
#               req.http.X-Forwarded-For + ", " + client.ip;
#       } else {
#           set req.http.X-Forwarded-For = client.ip;
#       }
#     }
#     if (req.request != "GET" &&
#       req.request != "HEAD" &&
#       req.request != "PUT" &&
#       req.request != "POST" &&
#       req.request != "TRACE" &&
#       req.request != "OPTIONS" &&
#       req.request != "DELETE") {
#         /* Non-RFC2616 or CONNECT which is weird. */
#         return (pipe);
#     }
#     if (req.request != "GET" && req.request != "HEAD") {
#         /* We only deal with GET and HEAD by default */
#         return (pass);
#     }
#     if (req.http.Authorization || req.http.Cookie) {
#         /* Not cacheable by default */
#         return (pass);
#     }
#     return (lookup);
# }
#
# sub vcl_pipe {
#     # Note that only the first request to the backend will have
#     # X-Forwarded-For set.  If you use X-Forwarded-For and want to
#     # have it set for all requests, make sure to have:
#     # set bereq.http.connection = "close";
#     # here.  It is not set by default as it might break some broken web
#     # applications, like IIS with NTLM authentication.
#     return (pipe);
# }
#

Ответ 1

Нужно ли мне изменять этот макс-возраст = 0, чтобы выполнить лак лучше?

Да. Вам нужно сделать это, если вы хотите, чтобы он вообще выполнялся.

Если да, то где бы я это сделал?

Кажется, у вас все в порядке для кэширования статического контента, но вам также кажется, что нужно кэшировать ответы на выполнение PHP script:

Вам просто не хватает session_cache_limiter и session_cache_expire, который должен быть первым строком, выполненным на запрошенном PHP script, даже до session_start().

Если, например, возвращенный контент является закрытым, и вы хотите обновлять его каждую минуту, попробуйте что-то вроде:

session_cache_limiter('private');
session_cache_expire(1);

После этого вы должны увидеть правильное значение Cache-Control: max-age=60, private для ответов на лак для запросов на сгенерированный PHP контент, включая те строки в начале script.

[обновление] Увидев, что ваша проблема еще не решена, возможно, вам стоит попробовать использовать Apache mod_expires вместо ручной настройки заголовка Cache-Control: http://httpd.apache.org/docs/2.4/mod/mod_expires.html

Это должно ответить на ваши вопросы, но позвольте мне дать вам несколько дополнительных заметок, которые могут вам пригодиться, и помочь вам лучше понять, как заголовок и заголовок Cache-Control относятся друг к другу:

  • При конфигурации по умолчанию max-age=0 в ответе указывается как для лака, так и для браузера, что ответ не кэшируемый. Если в запросе клиента не задано иное или явно разрешено, Larn не будет показывать устаревший контент:

Элемент устаревшего кеша не будет возвращен никаким кешем (кэш-прокси или клиентский кеш).

От https://tools.ietf.org/html/rfc7234#section-5.3:

Если ответ включает в себя поле Cache-Control с max-age (раздел 5.2.2.8), получатель ДОЛЖЕН игнорировать Expires
поле. Аналогично, если ответ включает директиву s-maxage
(Раздел 5.2.2.9), общий получатель кэша ДОЛЖЕН игнорировать Expires
поле. В обоих случаях значение в Expires предназначено только для целей для получателей, которые еще не реализовали поле Cache-Control.

От http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3:

Если кеш возвращает устаревший ответ, либо из-за макс-устаревания директивы по запросу или из-за того, что кеш настроен на переопределение время истечения ответа, кэш ДОЛЖЕН присоединяться к предупреждению заголовок к устаревшему отклику, используя Предупреждение 110 (Ответ прост).

Кэш МОЖЕТ быть сконфигурирован для возврата устаревших ответов без валидация, но только если это не противоречит какому-либо "ДОЛЖНО" -уровню требования, касающиеся валидации кэш-памяти (например, "обязательная переоценка" ) директива кэширования).

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

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

  • Лак не будет служить устаревшим контентом при запросе нового содержимого (наиболее распространенный сценарий), и даже если бы это было сделано, браузер не будет сохранить его и будет генерировать новый запрос для новой страницы каждый время, когда пользователь запрашивал этот контент, излишне ударяя кеш (при всей сетевой активности) вместо того, чтобы локально сохраненная копия, которая была бы весьма неэффективной и заметно медленнее!

max-age Указывает, что клиент готов принять ответ возраст которого не превышает указанного времени в секундах. Если не также включена максимальная директива, клиент не желает принять застойный ответ.

Теперь, если вы все еще видите, что браузер отправляет новый запрос каждый раз при загрузке содержимого (проверьте вкладку сети инструментов разработчика браузера или лаковые журналы), перепроверьте все. В качестве последнего средства вы также можете установить правильные метатеги html, хотя html5 осуждает их, и они не должны быть необходимы для любого современного браузера, и это не лучшая практика, поэтому я бы посоветовал это сделать.

Также здесь некоторое хорошее чтение о правильном управлении кешем контента, сгенерированного PHP-скриптами, которые могут вас заинтересовать.

Ответ 2

Недостаточно вашего Varn VCL. Найдите и используйте соответствующий шаблон VCL 3 или VCL 4 в соответствии с версией вашего лака.

Проверьте версию вашего лака: varnishd -V

Если вы используете версию 2, обновите ее до версии 3 или 4.

VCL для лака 3: https://github.com/dreamhost/varnish-vcl-collection

VCL для лака 4: https://github.com/mattiasgeniar/varnish-4.0-configuration-templates/blob/master/default.vcl