
Em vez de vincular imagens externas do meu aplicativo, gostaria de armazená-las em cache no servidor onde reside meu aplicativo da web, por exemplo, em vez de
<img src="http://api.domain.com/image/1234.jpeg" />
Eu gostaria de chamar um cache, por exemplo
<img src="http://dev:3128/myapp/image?href=http://api.domain.com/image/1234.jpeg">
Então, o Squid tem a imagem pela qual irá passar, caso contrário, ele irá recuperá-la e armazená-la em cache para a próxima vez. Isso é possível?
Instalei o squid, configurei-o como proxy reverso na frente do Apache. Minha configuração está abaixo (nome do host é 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
Neste ponto, o proxy squid parece funcionar, http://dev:3128/myapp
pois atende bem ao meu aplicativo php. Mas eu tenho que comentar as ALL
linhas acl (caso contrário, não recebo resposta) e as solicitações <img src="http://dev:3128/myapp/image?href=http://api.domain.com/image/1234.jpeg">
ainda estão aparecendo no log de acesso do Apache (enquanto estou procurando o squid para armazená-las em cache/servi-las).
http://dev:3128/myapp/image
é na verdade um script PHP que recupera e exibe a imagem por meio de fopen
e fpassthru
.
Responder1
Eu tentaria a seguinte configuração. Limpei o seu (removi coisas não referenciadas) e forcei-o a armazenar qualquer coisa em cache por um ano e não a falhas de cache.
Observe que as configurações do squid são muito específicas da versão, então qual versão você está executando?
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
Responder2
Se o squid estiver na frente do servidor web, você pode configurar uma ACL com uma regex (embora isso exija que você configure uma regex para todos os domínios externos) usando url_regex
, urlpath_regex
pode funcionar, mas exclui o nome do host. o que pode ser importante se o caminho para os arquivos for o mesmo daqueles hospedados em seu servidor.
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
Não sei exatamente em que situação você usará o Squid aqui, então adicionei a clássica linha forward all else, se você não estiver fazendo proxy de todo o acesso à Internet, você pode querer redefinir esse escopo.
Responder3
Se você deseja que o squid se comporte como um cache, você precisa configurar seu script php para gerar um cabeçalho que permita o armazenamento em cache.
O mínimo para o squid armazenar qualquer coisa em cache é:
- Data: (gerada automaticamente pelo php, então não se preocupe)
- Última modificação: data gmt
- Cache-Control: coloque aqui: "public, max-age="
A maneira mais fácil é não emitir um cabeçalho "Etag:" para que você tenha apenas que lidar com a solicitação "If-Modified-Since:" (se você emitir Etag: você terá que lidar com If-None-Match também).
E aqui está.
Se você quiser se aprofundar, leiaRFC 2616.
Se você deseja reduzir de forma eficiente o tráfego entre o squid e seu backend, implemente corretamente "If-Modified-Since" em seu script. Além disso, você pode descartar/reescrever vários cabeçalhos de cliente que impedirão o armazenamento em cache, mas este é apenas um segundo passo.
Responder4
Por padrão, o Squid não armazena URLs em cache com o ? sinal. Experimente com:
cache allow JPEG
Preste atenção também ao que @Oliver S mencionou, pois seu aplicativo deve servir o contato como armazenável em cache para funcionar.