
En lugar de vincular imágenes externas desde mi aplicación, me gustaría almacenarlas en caché en mi servidor donde reside mi aplicación web, por ejemplo, en lugar de
<img src="http://api.domain.com/image/1234.jpeg" />
Me gustaría llamar a un caché, por ejemplo
<img src="http://dev:3128/myapp/image?href=http://api.domain.com/image/1234.jpeg">
Entonces, Squid tiene la imagen por la que la pasará; de lo contrario, la recuperará y luego la almacenará en caché para la próxima vez. es posible?
Instalé squid, lo configuré como un proxy inverso frente a Apache. Mi configuración está a continuación (el nombre de host es 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
En este punto, el proxy Squid parece funcionar http://dev:3128/myapp
ya que funciona bien para mi aplicación PHP. Pero tengo que comentar las ALL
líneas acl (de lo contrario no obtengo respuesta) y las solicitudes <img src="http://dev:3128/myapp/image?href=http://api.domain.com/image/1234.jpeg">
todavía se muestran en el registro de acceso de Apache (mientras que estoy buscando Squid para almacenarlas en caché/servirlas).
http://dev:3128/myapp/image
es en realidad un script PHP que recupera y entrega la imagen a través de fopen
y fpassthru
.
Respuesta1
Probaría la siguiente configuración. Limpié el tuyo (eliminé cosas a las que no se hace referencia) y lo obligué a almacenar en caché cualquier cosa durante un año y no fallas en el caché.
Tenga en cuenta que las configuraciones de squid son muy específicas de la versión, entonces, ¿qué versión está ejecutando?
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
Respuesta2
Si squid está ubicado frente al servidor web, puede configurar una ACL con una expresión regular (aunque esto requeriría que configure una expresión regular para todos los dominios externos), ya sea usando url_regex
, urlpath_regex
podría funcionar, pero excluye el nombre de host. lo cual puede ser importante si la ruta a los archivos es la misma que la alojada en su 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
No sé exactamente en qué situación usarás Squid aquí, así que agregué la clásica línea reenviar todo lo demás. Si no estás representando todo el acceso a Internet, es posible que desees redefinir ese alcance.
Respuesta3
Si desea que Squid se comporte como un caché, debe configurar su script php para generar un encabezado que permita el almacenamiento en caché.
El mínimo para que Squid almacene en caché cualquier cosa es:
- Fecha: (generada automáticamente por php, así que no te molestes)
- Última modificación: fecha GMT
- Control de caché: poner aquí: "public, max-age="
La manera más fácil es no emitir un encabezado "Etag:" para que solo tenga que manejar la solicitud "If-Modified-Since:" (si emite Etag: también tendrá que manejar If-None-Match).
Y aquí tienes.
Si quieres profundizar más deberías leer.rfc 2616.
Si desea reducir eficientemente el tráfico entre squid y su backend, implemente correctamente "If-Modified-Since" en su script. También puede eliminar/reescribir numerosos encabezados de clientes que evitarán el almacenamiento en caché, pero este es sólo un segundo paso.
Respuesta4
De forma predeterminada, Squid no almacena en caché las URL con el símbolo ? firmar. Prueba con:
cache allow JPEG
También preste atención a lo que menciona @Oliver S, porque su aplicación debe mostrar el contenido como almacenable en caché para funcionar.