Bug avanzado: CDN e imagecache con default image

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
ywarnier's picture

Hola a todos,

Tengo un problema de nivel avanzado para los que estén en este tema (imagino que muy pocos, pero por si a caso...).

Estoy usando los módulos CDN e ImageCache para una configuración avanzada de optimización de un sitio web en Drupal 6. El módulo CDN requiere parches al core de Drupal así que al módulo ImageCache (uno de los cuales tuve el gusto de mejorar un poco). Estos han sido aplicados y en general funciona bien: el CDN redirige las imágenes, css y js a un dominio distinto: http://cdn.midominio.com

Esto separa efectivamente la carga de los scripts PHP (se encarga Apache) y la carga de los estáticos (se encarga NGinx). Hasta ahí todo genial.

El único problema ocurre cuando se usa una imagen por defecto dentro del imagecache. Al parecer, el comportamiento de imagecache es que, cuando se pide una imagen de un tamaño específico y esta imagen no existe, imagecache devuelve una imagen "predeterminada" que llena el espacio en este tamaño.
El problema es que, para que imagecache haga este proceso de remplazo, se tiene que cargar la URL de la imagen no-existente y ahí (al parecer) Drupal se da cuenta de que no existe (seguramente a través de la traducción de URLs con Rewrite), llama a imagecache y este último verifica la existencia de la imagen, ve que no está en el disco, y la remplaza por una de substitución.

Esto funciona bien en el caso de que sea Apache quien gestione la entrega de la imagen (porque al fallar la URL, está en el contexto PHP y puede ejecutar el remplazo). A cambio, cuando se usa solo NGinx (sin procesamiento PHP), esta traducción no puede ser ejecutada, y la llamada devuelve un 404.

Las dos soluciones que veo son:

  1. implementar php-fastcgi a nivel de NGinx para poder gestionar estar llamando a imagecache (pero en este caso tengo que pasar todas las llamadas a fastcgi y por lo tanto pierdo la ventaja de la rapidez de tratamiento de estáticos por NGinx)
  2. hackear el Varnish que tengo al frente para que, en caso de que la URL sea parecida a /imagecache/ y que el backend me devuelva 404, reejecute la llamada usando el backend Apache y no el backend NGinx (pero la verdad es que por ahora por lo menos solo tengo una pequeña idea de como hacer esto y no estoy seguro de que realmente se pueda).

Finalmente, una duda que tengo es de saber como y donde realmente el imagecache llama a esta imagen de remplazo, para analisar mejor el proceso.

Como mencioné, esto es nivel avanzado ya, y no espero una solución perfecta, más bien me parece interesante como tema de analisis en conjunto.