3 votes

Mise en cache des pages PHP, Varnish, nginx, autre ?

J'ai une application web fonctionnant sur un ordinateur bas de gamme (1 Go de RAM), qui sert un mélange de pages statiques et dynamiques (php). Ces pages PHP interrogent une base de données MYSQL qui ne change pas souvent du tout - une fois par semaine ?

Je cherche à faire une bonne quantité de cache pour que tout soit agréable et rapide. J'ai des pages qui, bien qu'elles soient en php, changent rarement d'informations (j'obtiens une liste d'éléments qui pourraient changer une fois tous les quelques mois ). Quelques pages peuvent contenir jusqu'à 400 enregistrements.

J'ai installé Varnish, nginx, PHP-FPM, APC, MYSQL. Je "pense" avoir tout configuré correctement. Les pages sont servies, et j'ai des hits qui apparaissent dans Varnish... Génial ! Cependant, en raison de la nature du site, je ne suis pas sûr qu'il soit aussi optimisé qu'il pourrait l'être.

Une recherche récente a suggéré un certain nombre de choses qui peuvent aider avec mes pages php :

  • nginx FastCGI caching
  • memcached
  • Mise en cache des requêtes MYSQL

Un exemple : Une page PHP récente, où il y a beaucoup d'enregistrements (200+) : 2 secondes Après un rafraîchissement, 1,5 seconde (environ). edit : Suis-je irréaliste si je m'attends à ce que cette page soit mise en cache quelque part et soit fournie beaucoup plus rapidement après avoir été visitée ?

Quelle serait ma meilleure option ? Une ou toutes les options ci-dessus ?

5voto

tmac Points 21
  • Memcached nécessite votre code pour l'utiliser réellement. Mais si vous avez écrit ce code, cela devrait être facile à faire :)
  • La mise en cache MySQL fonctionne dans une certaine mesure. Idéalement, passez à des disques SSD si pas encore.
  • Je n'ai jamais entendu parler de la mise en cache FastCGI. Faites-vous référence à la mise en cache des pages dynamiques en tant que statiques ?

Honnêtement, si vous avez tout réglé du mieux que vous pouvez, j'envisagerais des mises à niveau matérielles. Si vous avez le temps, regardez les recherches de Facebook comme HipHop ( https://github.com/facebook/hiphop-php/wiki ). Ils ont effectué des recherches et des développements étonnants pour créer des pages dynamiques à chargement rapide.

Bonne chance !

3voto

Dave Mateer Points 163

Soyez prudent avec le cache de requêtes de MySQL - il utilise un verrou global, donc lorsque vous commencez à avoir trop d'activité, vous verrez des blocages périodiques. Le cache de requêtes n'est utile que pour les requêtes qui sont exactement la même chose Si vous en avez beaucoup, c'est que vous n'utilisez pas correctement la mise en cache au niveau de l'application.

La première étape du travail sur les performances consiste toujours à établir un profil ; l'optimisation basée sur l'intuition est un très bon moyen de perdre son temps.

Au travail, nous utilisons Graphite comme magasin de données, avec une version modifiée de StatsD y tuyau à graphite comme principales méthodes d'envoi de données. Ces deux outils permettent d'envoyer très facilement des données, et Graphite dispose ensuite d'une multitude d'outils d'analyse.

Par exemple, en utilisant le vernis pipe-to-graphite script nous récupérons toutes les statistiques de varnishstats . Cela nous permet de créer facilement des graphiques de type "hit/miss" dans Graphite, comme ceci :

Varnish hit-percentage graph

Vous pouvez faire la même chose avec memcached, et ajouter des crochets dans votre propre application pour enregistrer... eh bien, tout et n'importe quoi !

Vous pouvez également trouver des outils d'analyse d'une seule page comme xhprof y YSlow utile.

Une fois que vous disposez de paramètres, non seulement vous savez sur quoi vous devez travailler, mais vous serez en mesure de mesurer l'amélioration lorsque vous aurez terminé. Tout le monde aime la validation !

3voto

Lorsque vous n'avez pas besoin des fonctionnalités spéciales de varnish, vous pouvez le laisser tomber et utiliser le fastcgi_cache de nginx . mais attention, contrairement au proxy_cache, vous ne pouvez avoir qu'une seule cache_zone dans toute votre configuration.

Peut-être que votre installation est un peu sur-optimisée ... je penserais à utiliser soit nginx soit varnish uniquement.

en ce qui concerne memcache : selon le nombre de requêtes/seconde que vous avez, memc peut être un vrai coup de pouce, mais peut-être pas nécessaire dans votre cas. quand vous avez un bon frontside-cache, vous n'avez pas besoin d'activer memcache, mais YMMV. ce que je comprends : vous livrez des pages qui ne sont pas changées souvent, non ?

J'ai toujours essayé d'optimiser de la façon suivante :

  1. essayez d'éviter que les demandes soient traitées par votre pile d'applications -> interceptez les demandes par le cache du frontenend (nginx/varnish) et le serveur statique, si possible
  2. si php, utiliser un opcode-cache comme APC
  3. Optimisez votre base de données
  4. surveiller votre système (load, mem, ram, netio, hdio, netconns, netconns:http, site_stats)
  5. répétition de l'accord

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X