Cache Nginx partagé entre plusieurs serveurs


9

Nous avons 8 serveurs API REST-ish avec Nginx utilisant FastCGI avec PHP-FPM pour gérer les demandes. Nous utilisons actuellement la mise en cache FastCGI de Nginx (directives comme fastcgi_cache_path). Cela signifie que les réponses API sont mises en cache, mais il existe un cache distinct pour chaque serveur.

Existe-t-il un bon moyen de partager le stockage du cache entre les huit serveurs?

Nous avons envisagé d'utiliser Redis comme stockage partagé, mais les modules disponibles semblent nécessiter des changements d'application. Dans certains cas, nous souhaitons peut-être mettre en cache les réponses hors de notre contrôle (via HTTP vers des API externes). Idéalement, un remplacement direct de la mise en cache intégrée Nginx des réponses FastCGI et HTTP serait disponible.


Pourquoi ne faites-vous pas de mise en cache non pas sur la couche frontend (Nginx), mais sur la couche backend (application PHP)?
Max Kochubey

@hangover, je ne vois aucune raison de réinventer la roue. Le cache Nginx fonctionne bien et rapidement. Si nous pouvons éviter la surcharge de l'exécution des demandes via l'application, nous pouvons garder les choses agréables et rapides. Nginx répond aux demandes mises en cache pour nous en moins de 5 millisecondes. Le lancement de notre application PHP, même pour qu'elle fournisse une réponse en cache, sera probablement 10 fois plus lent que cela. La mise en cache Nginx fonctionne bien pour nous maintenant, nous avons juste besoin de distribuer ce cache sur de nombreux serveurs.
Brad

1
ok, vous pouvez essayer d'utiliser le module Nginx SRCache tiers pour stocker le contenu mis en cache dans Memcached od Redis dédié.
Max Kochubey

1
@Brad C'est hacky donc je ne le mettrai pas comme réponse: nous avons actuellement un script exécuté tous les soirs qui utilise rsync entre les répertoires de cache nginx sur nos serveurs pour garder chacun à jour avec les derniers fichiers de cache de tous les autres. Le script se termine par un redémarrage et une vérification du succès gracieux de nginx. Comme je l'ai dit, c'est hacky, mais cela fonctionne pour nous sur un système à haut débit.
mVChr

@mVChr Intéressant. Avez-vous essayé de lancer rsync ou similaire en continu? En fin de compte pour mon utilisation, j'ai finalement réussi à faire fonctionner Redis, mais cela ne permet pas un très grand cache car la collection Redis entière doit être en mémoire. 16 Go se remplit rapidement sur mon application.
Brad

Réponses:


1

Il semble y avoir un article de blog plutôt nouveau sur https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-1/ sur ce problème. Ce premier exemple pourrait être utile si vous exécutez plus de deux serveurs de cache nginx.

En particulier, la deuxième partie de l'article semble intéressante pour mon cas d'utilisation actuel, où je veux ré-analyser automatiquement les éléments modifiés dans mes caches.

Cela devrait également fonctionner avec la version open source de NGINX. Fondamentalement, cela fonctionne en mandatant la demande en cascade via chaque serveur NGINX (Nginx-Cache1-> NGinx-Cache2-> Origin-Server), chaque serveur cache de l'amont pertinent et si vous le souhaitez, vous pouvez également créer un cluster HA. https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-2/

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.