Quels proxys inverses prennent en charge les en-têtes HTTP / 1.1 ETag et If-None-Match?

8

Je développe un système de mise en cache pour une plateforme de commerce électronique qui utilisera un proxy inverse pour la mise en cache. Je prévois de gérer l'invalidation en utilisant les en-têtes HTTP / 1.1 appropriés. Autrement dit, je vais définir un ETag sur la première génération du contenu et mettre en cache cette valeur ETag dans l'application. L'en-tête Cache-Control spécifiera "must-revalidate", donc le proxy devrait définir l'en-tête If-None-Match lors des requêtes suivantes avec l'ETag. L'application recherchera la valeur ETag mise en cache et si elle correspond, elle enverra une réponse 304, sinon elle générera une réponse complète de 200.

J'espérais utiliser nginx mais je ne peux pas dire avec certitude qu'il prend en charge les ETags (les documents indiquent que ce n'est pas le cas mais peut-être qu'ils sont obsolètes?). Le vernis est une autre option mais je ne suis pas positif ici non plus ..

Quels serveurs proxy inverses prennent en charge pleinement les ETags? Je voudrais qu'il mette en cache plusieurs versions afin que je puisse faire des choses comme des tests fractionnés sans avoir à désactiver le cache. Autrement dit, HTTP / 1.1 spécifie qu'un client peut envoyer If-None-Match avec plusieurs valeurs ETag et le serveur doit répondre avec quel ETag correspond (le cas échéant). Si le proxy inverse conservait plusieurs copies plutôt que juste la dernière valeur vue et laissait le serveur spécifier sur chaque requête laquelle utiliser, ce serait l'idéal.

ColinM
la source

Réponses:

2

Je viens de vérifier dans le code source Varnish et même si il prend en charge If-Modified-Sinceet les en- If-None-Matchtêtes, il ne supporte pas must-revalidatedans Cache-Control. Les seuls attributs pris en charge dans Cache-Controlsont max-ageet s-max-age.

Références:

Jérôme R
la source
Merci. Je ne connais pas grand-chose sur Varnish VCL, mais est-il possible de spécifier l'utilisation de VCL pour toujours revalider étant donné que Varnish semble prendre en charge la revalidation?
ColinM
Je viens de découvrir que la branche "experimental-ims" de Varnish semble ajouter un support complet pour If-None-Match. Espérons qu'il sera finalement fusionné en une version stable. varnish-cache.org/trac/wiki/BackendConditionalRequests
ColinM
2

nginx nécessite des modules tiers pour prendre en charge ETag. Et il y en a deux .

Michael Hampton
la source
Le module statique etags sert à générer des etags, pas à mettre en cache du contenu avec des etags. De même, le module dynamique etags génère des étiquettes pour le contenu dynamique pour une utilisation en amont, et non une utilisation inverse du proxy. Cependant, je pense que nginx 1.3 a ajouté le support officiel pour etags avec des proxys inverses ..
ColinM
1
Juste pour référence future, nginx prend en charge ETag et If-None-Match à partir de 1.7.3, mais il ne peut toujours mettre en cache qu'un résultat pour une URL donnée, donc je n'appellerais pas cette prise en charge complète. Autrement dit, vous ne pouvez pas avoir plusieurs réponses mises en cache et négociées avec le serveur pendant la revalidation. Voir trac.nginx.org/nginx/ticket/101
ColinM
1

Corrigez-moi si je me trompe, et je sais que c'est un vieux post - mais je voudrais commenter pour les nouveaux passants. Je crois qu'un cache de proxy inverse n'aide pas autant que vous le souhaitez lorsque vous utilisez ETags.

Les mécanismes de mise en cache de validation utilisent le serveur d'origine pour valider si l'ETag (ou la date de dernière modification) dans la demande est toujours valide (correspond ou ne correspond pas à l'étag des ressources, selon l'en-tête utilisé, ou n'a / n'a pas été modifié) depuis la date indiquée dans la demande).

Cela signifie qu'un cache de proxy inverse tel que Varnish transmettra toujours cette demande au serveur d'origine. Il peut répondre avec la demande plutôt que de le gérer, mais vous n'avez pas enregistré l'aller-retour sur le serveur d'origine.

Les navigateurs peuvent mettre en cache les réponses et gérer une réponse 304 dans tous les cas, donc le cache privé de l'utilisateur peut être mieux adapté pour gérer cela que d'utiliser un proxy inverse (YMMV, en particulier à grande échelle, et en fonction de votre cas d'utilisation, bien sûr. Je ne le fais pas voulez faire des hypothèses sur vos applications).

De la spécification 13.3 :

Lorsqu'un cache a une entrée périmée qu'il souhaite utiliser comme réponse à la demande d'un client, il doit d'abord vérifier avec le serveur d'origine (ou éventuellement un cache intermédiaire avec une nouvelle réponse) pour voir si son entrée en cache est toujours utilisable . Nous appelons cela "valider" l'entrée du cache. Puisque nous ne voulons pas avoir à payer les frais généraux de retransmission de la réponse complète si l'entrée mise en cache est bonne, et nous ne voulons pas payer les frais généraux d'un aller-retour supplémentaire si l'entrée mise en cache n'est pas valide, le protocole HTTP / 1.1 prend en charge l'utilisation de méthodes conditionnelles.

puis notez 13.3.4 :

Un proxy de mise en cache HTTP / 1.1, lors de la réception d'une demande conditionnelle qui inclut à la fois une date de dernière modification et une ou plusieurs balises d'entité en tant que valideurs de cache, NE DOIT PAS retourner de réponse localement mise en cache au client, sauf si cette réponse mise en cache est cohérente avec tous les champs d'en-tête conditionnels dans la demande.

Ainsi, Varnish peut retourner une réponse pour vous, mais vous avez toujours un aller-retour vers le serveur. Si vous pouvez utiliser un cache d'application tel que APC ou memcache, cela pourrait valoir la peine pour vous. Cependant, la mise en cache de validation est généralement meilleure pour les économies de bande passante que pour les ressources du serveur.

Il est préférable de laisser le cache de validation au client (navigateur ou code API).

L'utilisation du modèle d'expiration pour la mise en cache est l'endroit où un cache de proxy inverse brille vraiment. Cela vous permet de sauter complètement sur le serveur d'origine. En utilisant Expires, Cache-Control, Date, etc, est le meilleur (encore une fois, l' OMI) pour un mécanisme cache proxy inverse que le cache peut retourner la réponse, en supposant la non rassis, sans jamais frapper le serveur d'origine.

fideloper
la source
Le cas d'utilisation que j'avais en tête pour cette question est de faire revalider le proxy avec le serveur d'origine et le serveur d'origine renvoyer 304 si l'ETag correspond à l'ETag qui serait mis en cache pour un enregistrement donné. Autrement dit, l'ETag serait généré de manière aléatoire lors du premier rendu de la page et de son enregistrement avec la clé primaire de cet enregistrement. Si l'enregistrement est modifié, l'ETag est effacé.
ColinM