Configure o Squid para armazenar as imagens explicitamente chamadas de img src = “”

1

Em vez de criar links para imagens externas do meu aplicativo, gostaria de armazená-los em cache no meu servidor em que meu aplicativo da web reside, por exemplo, em vez de

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

Gostariadechamarumcache,porexemplo

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

Então, o Squid tem a imagem que será transmitida, caso contrário, ele será recuperado e armazenado em cache pela próxima vez. Isso é possível?

Eu instalei o squid, configurei-o como um 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 em http://dev:3128/myapp , já que ele serve meu aplicativo php. Mas tenho que comentar as linhas ALL acl (caso contrário, não obtenho resposta) e as solicitações de <img src="http://dev:3128/myapp/image?href=http://api.domain.com/image/1234.jpeg"> ainda estão sendo exibidas no log de acesso do apache (enquanto estou procurando o squid para armazenar em cache / atendê-las). p>

http://dev:3128/myapp/image é, na verdade, um script PHP que recupera e veicula a imagem por meio de fopen e fpassthru .

    
por DaveO 19.05.2013 / 08:05

5 respostas

1

Eu tentaria a seguinte configuração. Eu limpei o seu (removi coisas não referenciadas) e forcei a armazenar em cache qualquer coisa por um ano e não falhas de cache.

Note 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
    
por 01.06.2013 / 22:49
0

Se o squid estiver na frente do servidor web, você pode configurar um ACL com um regex (embora isso exija que você configure um regex para todos os domínios externos) usando url_regex , urlpath_regex trabalho, mas exclui o nome do host .. o que pode ser importante se o caminho para os arquivos é o mesmo que aqueles hospedados no 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

Eu não sei exatamente qual situação você usará o Squid aqui, então eu adicionei o clássico forward all else line, se você não está usando proxies de todo o acesso à internet, você pode querer redefinir esse escopo.

    
por 29.05.2013 / 14:17
0

Se você quiser que o squid se comporte como um cache, você precisa configurar o seu script php para gerar o cabeçalho que permite o armazenamento em cache.

O mínimo para o squid realmente fazer cache de qualquer coisa é:

  • Data: (gerada automaticamente pelo php, então não se incomode)
  • Última modificação: data de gmt
  • Cache-Control: coloque aqui: "public, max-age="

A maneira fácil é não emitir um cabeçalho "Etag:" para que você tenha apenas que manipular o pedido "If-Modified-Since:" (se você emitir Etag: você terá que lidar com If-None-Match também ).

E aqui vai você.

Se você quiser ir mais fundo, leia rfc 2616 .

Se você deseja reduzir de maneira eficiente o tráfego entre o squid e o back-end, implemente corretamente "If-Modified-Since" no seu script. Além disso, você pode descartar / reescrever vários cabeçalhos de clientes que impedirão o armazenamento em cache, mas isso é apenas uma segunda etapa.

    
por 31.05.2013 / 21:21
0

Se com imagens 'externas' você quer dizer imagens que não estão no seu próprio servidor (então não imediatamente atrás do squid), você precisará fazer alguns truques, fazer proxy e armazenar em cache as imagens você mesmo. Então, vamos configurar um exemplo para ter certeza de que entendi corretamente:

  • Seu website é www.example.org, que é squid na frente do apache
  • As imagens estão em api.example.com, que está em outro servidor
  • Você deseja incorporar essas imagens de forma que as solicitações sejam direcionadas para o seu servidor

Se as imagens estiverem apenas em api.example.com, isso é fácil e nem precisa do squid. Você pode fazer isso com mod_proxy e mod_cache para o apache. Faça com que a tag <img ..> pareça com <img src="http://www.example.org/images/api/path/to/image/here" /> e use ProxyPass no apache para passar /images/api para o proxy em api.example.com e na configuração mod_cache para armazená-la em cache.

Se você realmente quiser usar o squid, você precisará tornar o squid mais inteligente. Eu ainda deixaria a tag <img ..> igual à anterior e usaria um auxiliar ICAP para reescrever as solicitações de / images / api / para ir para api.example.com. O Squid pode solicitar e armazenar em cache.

    
por 01.06.2013 / 10:56
0

Por padrão, o Squid não faz cache de URLs com o? placa. Experimente com:

cache allow JPEG

Preste também atenção ao que o @Oliver S menciona, porque o seu aplicativo deve servir o contantível como cacheável para o trabalho.

    
por 01.06.2013 / 21:11