2017-07-03 7 views
0

Je ne comprends pas le comportement de Varnish en cas d'erreur 500 de backend. - Pourquoi incrémente le compteur MAIN.n_object? Je pense qu'il devrait mettre en cache seulement 20x et redirige. - Si la première requête est terminée avec une réponse de 500 à partir du backend, toutes les requêtes suivantes vers la même URL ne sont pas mises en cache, même si backend commence à renvoyer la réponse 200. Aide-moi à comprendre cette logique.Pourquoi Varnish arrête la mise en cache 200 réponse après 500 erreur

Répondre

1

Si vous utilisez réellement la VCL par défaut, la logique par défaut est celle que vous décrivez. Mais vous manquez qu'il commence à le mettre en cache après un certain temps. Typiquement 2 minutes.

  1. Varnish voit 500 état -> pourparlers back-end et ne cache pas la page pendant 2 min
  2. plus tard voit Varnish 200 état -> Varnish met en cache la page et le livre plus loin du cache.

Il est nécessaire de mettre en œuvre hit-for-pass - Ma compréhension de c'est le suivant: Varnish sera par carambolage par défaut Requets à backend et pas les envoyer à leur arrivée pour l'optimisation. Quand Varnish voit que quelque chose n'est pas cacheable (statut 500, etc.) il ne fera pas le comportement d'empilement et parlera directement au backend (hit-for-pass). Si vous souhaitez réduire la durée de validation des pages, vous devez ajouter une VCL. Cela s'assurera que la VCL intégrée avec la valeur 120s n'est pas exécutée. Ce qui suit va marquer une page avec 500 statut comme inaccessible pendant 10 secondes:

sub vcl_backend_response { 
    if (beresp.status == 500) { 
     set beresp.ttl = 10s; 
     set beresp.uncacheable = true; 
     return (deliver); 
    } 
} 
+0

vous avez 100% raison! récemment mesuré avec minuterie moi-même - sa période de problème de 2min. Si juste après l'erreur 500, le backend est à nouveau OK, pourquoi sa réponse ne peut-elle pas être mise en cache avant cette passe de 2m? – Molfar

+0

Si le backend est correct après 10 secondes après 500 erreur, comment éviter de le chercher encore et encore dans les 110 prochaines secondes? – Molfar

+0

Voir la mise à jour de la réponse. Quelque chose comme ça devrait fonctionner (code non testé). –