Servir des fichiers statiques avec nginx sur NFS?

9

J'ai un site Web qui reçoit environ 7 000 requêtes par seconde sur un serveur nginx. Ce serveur gère à la fois les réécritures sur un serveur Apache et sert directement les fichiers statiques, les images, etc. Les fichiers statiques sont la plus grande partie avec environ 5 000 demandes.

Avec une mise à niveau de l'architecture, je pense à utiliser un serveur de fichiers central qui exporte un répertoire contenant ces fichiers statiques via NFS. Il n'y aura pas d'accès en écriture à ces fichiers, le répertoire pourrait donc être monté en lecture seule sur la machine nginx. Ma principale préoccupation est:

NFS est-il assez rapide pour cela? Y a-t-il une limite au nombre de demandes que NFS peut gérer? Existe-t-il des options "incontournables" lorsque vous procédez de cette façon?

Bonus: existe-t-il d'autres alternatives pour cette configuration que NFS?

Merci!

j0nes
la source
Pas d'accès en lecture, ou "seulement" en accès en lecture?
pauska
Merci! Accès en lecture uniquement, pas d'accès en écriture.
j0nes
2
7k requêtes par seconde, c'est ~ 6,048,00,000 requêtes par jour, si vous exécutez cela sur un seul serveur NGINX, nous (et les entreprises qui utilisent des clusters de serveurs pour la moitié de cette charge) aimerions connaître votre configuration.
Smudge

Réponses:

2

En configurant un serveur NFS central, vous introduisez un point de défaillance unique dans votre conception. Cela seul devrait être un facteur de rupture. Sinon, NFS peut être suffisamment rapide pour une charge comme celle-ci. Les facteurs critiques seront d'avoir suffisamment de RAM pour mettre en cache les fichiers, les interconnexions à faible latence (Gig-E ou mieux) et le réglage (moins que le précédent).

Vous devriez également envisager sérieusement d'utiliser rsync ou un outil similaire pour conserver des copies locales des mises à jour des fichiers statiques sur chaque serveur Web individuel. Une autre option pourrait être une solution de serveur SAN ou NFS redondante (qui seront toutes deux beaucoup plus compliquées et coûteuses que l'idée rsync).

Chris S
la source
2
NFS n'a pas besoin d'être un SPoF
gWaldo
@gWaldo Comment pouvez-vous exactement configurer "un serveur NFS central" et que ce ne soit pas un SPoF?
Chris S
Vous le faites en se rendant compte que, comme vous le dites, un centre serveur NFS est un SPOF et choisissez plutôt de mettre en œuvre un cluster NFS. Je ne suis pas en désaccord avec vous ....
gWaldo
Merci - d'accepter cette solution car je pense que je vais suivre la voie rsync, en évitant le point de défaillance unique (ce qui devrait être ma principale préoccupation).
2011
Il est assez simple d'implémenter un serveur NFS répliqué double haute disponibilité à l'aide de GlusterFS et CTDB. En termes de performances, mon cluster recevait environ 10 000 requêtes par seconde et il fonctionne très bien. Le seul problème est que les serveurs NFS auront besoin de beaucoup de RAM.
Alpha01
2

J'utilise cachefilesd (et un noyau Linux récent, avec cachefs) pour mettre en cache les fichiers NFS sur un disque dur local. De cette façon, chaque lecture dans le nfs copiera le fichier dans un répertoire / var / cache / fs et les prochaines lectures seront livrées à partir de là, le noyau vérifiant dans le nfs si le contenu est toujours valide.

De cette façon, vous pouvez avoir un NFS central, mais sans perdre les performances des fichiers locaux

Cachefilesd se chargera du nettoyage des anciens fichiers lorsque la taille / les noeuds libres atteindront un niveau configuré, afin que vous puissiez servir des données rares du NFS et des requêtes courantes du HD

Bien sûr, utilisez également un vernis pour mettre en cache les demandes les plus courantes et éviter que le nginx / NFS ne soit alors utilisé.

Voici un petit guide de cachefilesd

higuita
la source
1

La vitesse dépend de nombreux facteurs:

  • Comment vos serveurs vont-ils être connectés à la cible NFS? Un seul disque SAS à double port peut utiliser une vitesse de transfert de 6 Gbit / s. Gardez cela à l'esprit si vous prévoyez d'utiliser 1gig Ethernet (dont vous pouvez soustraire 20% de surcharge TCP).
  • Quel type de cache le serveur NFS va-t-il obtenir? Utilisez-vous un contrôleur de baie de niveau entreprise avec beaucoup de cache? Le cache de lecture est la clé de cette configuration
  • Combien de serveurs vont accéder simultanément au même fichier? Le verrouillage NFS peut faire mal - gravement

La limite des fichiers ouverts via NFS est une limitation du système d'exploitation hôte. FreeBSD a par exemple de nombreuses options de réglage différentes pour prendre en charge un grand nombre de fichiers ouverts, mais cela dépend de la quantité de RAM de votre serveur.

Une alternative à un serveur de fichiers central consiste à utiliser la synchronisation / réplication entre vos serveurs Web (comme le suggère Chris S). rsync ou DRBD pourrait être un excellent choix et rentable.

pauska
la source
1

Je déconseille NFS à moins que vous ne mettiez de la mise en cache là-dedans. Le cache nginx est meilleur que rien, mais Varnish est meilleur.

Cela dit, si votre charge change pour être un contenu plus dynamique que statique, il deviendra plus important de servir les fichiers d'applications à partir du disque local.

Si vous insérez NFS, assurez-vous d'avoir une redondance.

gWaldo
la source
Cela peut nécessiter un peu de changement d'architecture. En plus d'utiliser une couche de mise en cache comme Varnish, c'est également une bonne idée d'utiliser une configuration CDN d'origine pour tous les fichiers statiques qui seront sur le partage NFS. Cela allégera la charge frappant le backend NFS.
Alpha01