1 votes

Configurer Squid pour mettre en cache les images explicitement appelées depuis img src=""

Au lieu d'établir des liens directs vers des images externes à partir de mon application, j'aimerais les mettre en cache sur le serveur où réside mon application web, par exemple au lieu de

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

J'aimerais appeler un cache, par ex.

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

Si Squid a l'image, il la transmet, sinon il la récupère et la met en cache pour la prochaine fois. Est-ce que c'est possible ?

J'ai installé Squid, je l'ai configuré comme un proxy inverse devant Apache. Ma configuration est la suivante (le nom d'hôte est 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

A ce stade, le proxy squid semble fonctionner à http://dev:3128/myapp car il sert bien mon application php. Mais je dois commenter l'élément ALL lignes acl (sinon je n'obtiens aucune réponse) et les demandes de <img src="http://dev:3128/myapp/image?href=http://api.domain.com/image/1234.jpeg"> sont toujours affichés dans le journal d'accès d'apache (alors que je cherche à ce que squid les cache/serve).

http://dev:3128/myapp/image est en fait un script PHP qui récupère et sert l'image par l'intermédiaire de fopen y fpassthru .

1voto

R. S. Points 1604

J'essaierais la configuration suivante. J'ai nettoyé la vôtre (en supprimant les éléments non référencés) et je l'ai forcée à mettre tout en cache pendant un an et à ne pas mettre en cache les échecs.

Notez que les configurations de Squid sont très spécifiques à la version, donc quelle version utilisez-vous ?

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

0voto

NickW Points 10133

Si squid se trouve devant le serveur web, vous pouvez mettre en place une ACL avec une regex (bien que cela vous oblige à mettre en place une regex pour tous les domaines externes) en utilisant soit url_regex , urlpath_regex pourrait fonctionner, mais il exclut le nom d'hôte ce qui pourrait être important si le chemin d'accès aux fichiers est le même que ceux hébergés sur votre serveur.

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

Je ne sais pas exactement dans quelle situation vous allez utiliser Squid ici, donc j'ai ajouté la ligne classique forward everything else, si vous n'utilisez pas de proxy pour tous les accès internet, vous pouvez vouloir redéfinir cette portée.

0voto

Evan Pon Points 101

Si vous voulez que Squid se comporte comme un cache, vous devez configurer votre script php script pour générer des en-têtes qui permettent la mise en cache.

Le minimum pour que Squid mette en cache quelque chose est :

  • Date : ( générée automatiquement par php, donc pas besoin de s'en soucier )
  • Dernière modification : date gmt
  • Cache-Control : à mettre ici : "public, max-age="

La solution la plus simple consiste donc à ne pas publier d'en-tête "Etag :" afin de n'avoir à traiter que la demande "If-Modified-Since :" (si vous publiez Etag :, vous devrez également traiter If-None-Match).

Et voilà.

Si vous voulez aller plus loin, vous devriez lire rfc 2616 .

Si vous voulez réduire efficacement le trafic entre squid et votre backend, implémentez correctement "If-Modified-Since" dans votre script. Vous pouvez également supprimer / réécrire de nombreux en-têtes client qui empêcheront la mise en cache, mais ce n'est qu'une deuxième étape.

0voto

jowi Points 111

Si, par images "externes", vous entendez des images qui ne se trouvent pas sur votre propre serveur (et donc pas immédiatement derrière Squid), vous devrez faire preuve d'un peu d'astuce, en utilisant un proxy et en mettant en cache les images vous-même. Mettons donc en place un exemple pour être sûr de bien comprendre :

  • Votre site web est www.example.org, ce qui signifie que Squid est devant Apache.
  • Les images sont sur api.example.com, qui est sur un autre serveur.
  • Vous voulez intégrer ces images de manière à ce que les requêtes aillent à votre serveur.

Si les images sont uniquement sur api.example.com, c'est facile et ne nécessite même pas Squid. Vous pouvez le faire avec mod_proxy et mod_cache pour apache. Faites en sorte que le <img ..> ressemble à <img src="http://www.example.org/images/api/path/to/image/here" /> et utiliser ProxyPass dans apache pour passer /images/api pour le proxy vers api.example.com et la configuration mod_cache pour le mettre en cache.

Si vous voulez vraiment utiliser Squid, vous devez le rendre plus intelligent. Je ferais quand même en sorte que le <img ..> le même tag que ci-dessus et utiliser une aide ICAP pour réécrire les requêtes pour /images/api/ pour aller à api.example.com. Squid peut ensuite les demander et les mettre en cache.

0voto

Chris Simmons Points 1460

Par défaut, Squid ne met pas en cache les URLs avec le signe ? Essayez avec :

cache allow JPEG

Faites également attention à ce que @Oliver S mentionne, car votre application doit servir le contenu comme étant cachable pour fonctionner.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X