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.
nginx nécessite des modules tiers pour prendre en charge ETag. Et il y en a deux .
la source
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 :
puis notez 13.3.4 :
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.la source
Vous pouvez regarder Apache TrafficServer , qui semble avoir ce dont vous avez besoin .
la source
À ce jour, je pense qu'il n'y a toujours pas de proxy qui prennent pleinement en charge cette spécification HTTP. Il y a environ un an, j'ai décidé d'écrire le mien en utilisant Node.js et MongoDb.
https://github.com/colinmollenhour/node-caching-proxy
la source