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

Настройте Squid для кеширования изображений, явно вызванных из img src = ""

Вместо горячей ссылки на внешние изображения из моего приложения я хотел бы кэшировать их на моем сервере, где находится мое веб-приложение, например вместо того

<img src="http://api.domain.com/image/1234.jpeg" />

Я хочу вызвать кеш, например

<img src="http://dev:3128/myapp/image?href=http://api.domain.com/image/1234.jpeg">

Итак, у Squid есть изображение, через которое он его пропустит, иначе он получит его и затем кеширует для следующего раза. Это возможно?

Я установил squid, настроил его как обратный прокси перед Apache. Моя конфигурация ниже (имя хоста - dev):

acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl dev_users dstdomain dev
http_access allow dev_users
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
acl JPEG url_regex -i \.myapp/image?href=http://api.domain.com/image/*.jpeg$
#acl ALL dst 0.0.0.0/0.0.0.0
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all
http_port 3128 accel defaultsite=dev vhost
cache_peer 127.0.0.1 parent 80 0 no-query originserver name=dev
cache_peer_access dev allow dev_users
cache_peer_access dev deny all
cache_dir ufs /var/spool/squid3 100 16 256
coredump_dir /var/spool/squid3
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .               0       20%     4320
never_direct allow JPEG
#always_direct allow ALL

На данный момент прокси-сервер squid, кажется, работает на http://dev:3128/myapp поскольку он отлично обслуживает мое приложение php. Но я должен прокомментировать ALL acl (иначе я не получу ответа) и запросы на <img src="http://dev:3128/myapp/image?href=http://api.domain.com/image/1234.jpeg"> все еще отображаются в журнале доступа к apache (тогда как я ищу squid для их кеширования / обслуживания).

http://dev:3128/myapp/image на самом деле является сценарием PHP, который извлекает и обслуживает изображение через fopen и fpassthru.

Я бы попробовал следующую конфигурацию. Я очистил ваш (удалил вещи, на которые нет ссылок) и заставил его кэшировать что-либо в течение года, а не сбои кеширования.

Обратите внимание, конфигурации squid очень зависят от версии, так какую версию вы используете?

cache_dir ufs /var/spool/squid3 100 16 256
coredump_dir /var/spool/squid3

acl localhost src 127.0.0.1 ::1

acl PURGE method PURGE
http_access allow PURGE localhost

acl manager proto cache_object
http_access allow manager localhost

acl dev_users dstdomain dev
http_access allow dev_users

http_port 3128 accel defaultsite=dev vhost
cache_peer 127.0.0.1 parent 80 0 no-query originserver name=dev
cache_peer_access dev allow dev_users
cache_peer_access dev deny all

# Don't cache 404's
negative_ttl 0

# Cache everything for a year
refresh_pattern . 1440 100% 525949 override-expire ignore-reload ignore-no-cache ignore-no-store ignore-must-revalidate ignore-private ignore-auth 

#cache JPEG but not anything else
acl JPEG url_regex -i .*image\?href=http.*api.discogs.com.*image.*\.jpeg$
acl to_localhost dst 127.0.0.0/8
cache allow JPEG
cache deny to_localhost

Если вы хотите, чтобы squid вел себя как кеш, вам нужно настроить свой php-скрипт на генерацию заголовка, который разрешает кеширование.

Минимум, чтобы squid мог что-либо кэшировать:

  • Дата: (генерируется автоматически php, так что не беспокойтесь)
  • Последнее изменение: дата GMT
  • Cache-Control: поместите сюда: "public, max-age ="

Тогда проще всего не выдавать заголовок «Etag:», чтобы вам оставалось только обрабатывать запрос «If-Modified-Since:» (если вы выдаете Etag: вам также придется обрабатывать If-None-Match).

И вот.

Если вы хотите углубиться, вам следует прочитать RFC 2616.

Если вы хотите эффективно уменьшить трафик между squid и вашим сервером, правильно реализуйте «If-Modified-Since» в своем скрипте. Также вы можете удалить / переписать множество клиентских заголовков, что предотвратит кеширование, но это только второй шаг.

Если squid находится перед веб-сервером, вы можете настроить ACL с помощью регулярного выражения (хотя для этого потребуется настроить регулярное выражение для всех внешних доменов) либо с помощью url_regex, urlpath_regex может работать, но исключает имя хоста ... что может быть важно, если путь к файлам совпадает с путями, размещенными на вашем сервере.

acl JPGS url_regex -i \.somedomain.com/images/*.jpg$   #Matches JPGs from somedomain
acl GIFS url_regex -i \.somedomain.com/images/*.gif$   #Matches GIFs from somedomain
acl ALL dst 0.0.0.0/0.0.0.0                           #Matches Everything else 

never_direct allow JPGS
never_direct allow GIFS
always_direct allow ALL

Я не знаю точно, в какой ситуации вы будете использовать здесь Squid, поэтому я добавил классическую строку «вперед для всего остального», если вы не проксируете весь доступ в Интернет, вы можете захотеть переопределить эту область.

Если под «внешними» изображениями вы имеете в виду изображения не на вашем собственном сервере (то есть не сразу за squid), вам нужно будет проделать некоторые уловки, проксировать и кэшировать изображения самостоятельно. Итак, давайте приведем пример, чтобы убедиться, что я правильно вас понимаю:

  • Ваш веб-сайт www.example.org - это squid перед apache.
  • Изображения находятся на api.example.com, который находится на другом сервере.
  • Вы хотите встроить эти изображения таким образом, чтобы запросы отправлялись на ваш сервер.

Если изображения есть только на api.example.com, это просто и даже не нужно squid. Вы можете сделать это с помощью mod_proxy и mod_cache для apache. Сделать <img ..> тег выглядит как <img src="http://www.example.org/images/api/path/to/image/here" /> и использовать ProxyPass в apache пройти /images/api прокси на api.example.com и конфигурацию mod_cache для кеширования.

Если вы действительно хотите использовать кальмара, вам нужно сделать его умнее. Я бы все равно сделал <img ..> отметьте так же, как указано выше, и используйте помощник ICAP, чтобы переписать запросы для / images / api / для перехода на api.example.com. Squid может чем запрашивать и кешировать те.

По умолчанию Squid не кэширует URL-адреса с? подписать. Попробуйте:

cache allow JPEG

Также обратите внимание на то, что упоминает @Oliver S, потому что ваше приложение должно обслуживать contant как кешируемый для работы.