usar para ignorar ejemplo crear como comando archivos archivo php symfony varnish

php - para - git ignore comando



¿Cómo configurar adecuadamente el barniz para los sitios de Symfony2? (2)

Tengo un sitio web (con ESI) que usa el proxy inverso Symfony2 para el almacenamiento en caché. La respuesta promedio es alrededor de 100 ms. Intenté instalar Varnish en el servidor para probarlo. Seguí la guía del libro de recetas de Symfony paso a paso, http_cache todo en la carpeta de cache , pero la carpeta http_cache aún se creó cuando la probé. Así que pensé que podría intentar comentar $kernel = new AppCache($kernel); de app.php . Eso funcionó bastante bien. http_cache ya no se creó y por varnishstat, Varnish parecía estar funcionando:

12951 0.00 0.08 cache_hitpass - Cache hits for pass 1153 0.00 0.01 cache_miss - Cache misses

Eso fue de alrededor de 14000 solicitudes, así que pensé que todo estaría bien. Pero después de echoping descubrí respuestas elevadas a ~ 2 segundos.

Apache se ejecuta en el puerto 9000 y Varnish en 8080. Por lo tanto, echoping usando echoping -n 10 -h http://servername/ XXXX:8080 .

No tengo idea de qué podría estar mal. ¿Hay alguna configuración adicional necesaria para usar Barniz con Symfony2? ¿O simplemente estoy haciendo algo mal?

Por solicitudes, aquí está mi default.vcl con modificaciones que he hecho hasta ahora.

Encontré 2 problemas con la configuración predeterminada de Varnish:

  • no almacena solicitudes en caché con cookies (y todos en mi aplicación tienen sesión asignada)
  • ignora Cache-Control: no-cache encabezado Cache-Control: no-cache

Así que agregué condiciones para estos casos a mi configuración y funciona bastante bien ahora (~ 175 req / s desde ~ 160 con proxy inverso S2, pero sinceramente, esperaba un poco más). Simplemente no tengo idea de cómo comprobar si todo está bien, así que cualquier entrada es bienvenida.

La mayoría de las páginas tienen caché variada por cookie, con s-maxage 1200. Las s-maxage comunes de ESI no son variadas por cookie, con s-maxage bastante bajo (artículos, listas de artículos). Las páginas de perfil de usuario no se almacenan en caché ( no-cache ) y no estoy seguro de si VERMIN incluso está almacenando ESI en ellas. Solo el ESI que varía con las cookies es el encabezado con información específica del usuario (eso está en el 100% de las páginas).

Todo en este post es específico de Varnish 3.X (personalmente uso 3.0.2).

Además, después de algunas semanas de profundizar en esto, realmente no tengo idea de lo que estoy haciendo, así que si encuentras algo extraño en las configuraciones, házmelo saber.


Me sorprende que esto no haya tenido una respuesta realmente completa en 10 meses. Esta podría ser una página realmente útil.

Usted señaló que:

  • Varnish no almacena en caché las solicitudes con cookies
  • Varnish ignora Cache-Control: encabezado no-cache

Lo primero es, ¿todos en tu aplicación necesitan una sesión? De lo contrario, no inicie la sesión, o al menos espere hasta que sea realmente necesario (es decir, inicie sesión o lo que sea).

Si aún puede almacenar en caché las páginas cuando los usuarios inician sesión, debe tener mucho cuidado de no mostrarle a un usuario una página que fue diseñada para otra persona. Pero si va a hacerlo, edite vcl_recv () para quitar la cookie de sesión de las páginas que desea almacenar en caché.

Puede obtener fácilmente Varnish para procesar la directiva no-cache en vcl_fetch () y de hecho ya lo ha hecho.

Otro problema que encontré es que Symfony establece por defecto max-age en 0, lo que significa que nunca se almacenarán en caché por la lógica predeterminada en vcl_fetch

También noté que tenías configurado el puerto en Varnish para:

backend default { .host = "127.0.0.1"; .port = "80"; }

Usted mismo dijo que Apache se está ejecutando en el puerto 9000, por lo que no parece coincidir. Normalmente configuraría Varnish para escuchar en el puerto predeterminado (80) y establecerá Varnish para buscar el backend en el puerto 9000 o lo que sea.


Si esa es toda su configuración, vcl_recv está configurado dos veces.

En las páginas que desea almacenar en caché, ¿puede enviar los encabezados de almacenamiento en caché? Esto tendría más sentido, ya que las imágenes probablemente ya tienen sus encabezados de caché de apache y la lógica de la aplicación decide las páginas que se pueden almacenar en caché, pero también puede forzar esto en barniz.

Puede usar un vcl_recv como este:

# Called after a document has been successfully retrieved from the backend. sub vcl_fetch { # set minimum timeouts to auto-discard stored objects # set beresp.prefetch = -30s; set beresp.grace = 120s; if (beresp.ttl < 48h) { set beresp.ttl = 48h;} if (!beresp.cacheable) {pass;} if (beresp.http.Set-Cookie) {pass;} # if (beresp.http.Cache-Control ~ "(private|no-cache|no-store)") # {pass;} if (req.http.Authorization && !beresp.http.Cache-Control ~ "public") {pass;} }

Esta almacena en caché, en barniz, solo las solicitudes que se configuran en caché. Además, tenga en cuenta que su configuración no almacena en caché las solicitudes con cookies.