2009-11-02 11 views
2

J'ai plusieurs applications Web en production qui utilisent des montages NFS pour partager des ressources (généralement des fichiers d'actifs statiques) entre des têtes Web. Dans le cas où un montage NFS devient indisponible, Apache se bloque un transfert de fichiers qui ne sont pas accessibles, le noyau se connectera:Récupération d'Apache à partir d'un montage NFS monté non disponible

Nov 2 14:21:20 server2 kernel: nfs: server server1 not responding, still trying

Je reproduit le comportement dans RHEL5 en cours d'exécution NFS v3 et Apache 2.2.3:

  1. Créer un montage NFS sur Server1 (contenu de mon/etc/exports)

    /srv/test_share server2(rw)

  2. monter le partage NFS sur Server2 (contenu de mon/etc/fstab)

    server1:/srv/test_share /mnt/test_share nfs defaults 0 0

  3. Installation d'un hôte virtuel dans Apache avec un fichier HTML simple référencement des fichiers d'images stockées sur les sharen NFS

  4. Chargez le site, le code html et fichiers image tout retour 200

  5. Démontez le partage NFS, chargement de la page retourne 404s pour les images référencées

  6. Remonter le partage NFS

  7. Simule un plantage NFS en désactivant NFS sur Server1 - le rechargement du site se bloque en récupérant les fichiers référencés.

Les recherches Internet jusqu'à présent n'ont pas abouti à une bonne solution. Fondamentalement, le comportement souhaité serait pour le serveur Web de retourner 404 et ne pas se bloquer jusqu'à ce que le montage NFS récupère.

Cheers,

Ben

Répondre

2

deux options:

  • obtenir votre nfs options de montage à droite, vous devez faire un accès doux montage si fs peut être interrompu. essayez soft,intr,timeo=10 au lieu de default
  • synchronisez vos racines de document avec autre chose comme rsync, ou écrivez vous-même une extraction semi-atomique/export depuis votre SCM, si vous en utilisez une.l'utilisation SCM est recommandé de toute façon, vous donne la possibilité de revenir à la dernière version de travail, par exemple
  • utiliser un vrai système de fichiers distribué (faute de préférence tolérante comme coda) ou même un système de dispositif de bloc distribué comme drdb

Les options 2 et 3 vous donnent une opération déconnectée et sont donc beaucoup plus robustes que nfs. drdb est sexy, mais mon conseil serait l'option 2 avec quelque chose comme git ou svn, simple et robuste

+1

Le montage en douceur et la définition de la valeur du délai d'expiration permettent à Apache de renvoyer 404s. Prochaine étape: surveiller le montage ... J'ai mis mon timeout un peu plus bas à 2. Quand le montage NFS est devenu disponible, les choses ont été servies correctement à nouveau. – benr75

+0

a fonctionné pour moi, aussi, mais j'ai aussi dû ajouter 'proto = udp' pour éviter d'avoir de gros décalages dans les délais. Avec 'proto = tcp' (par défaut sur ma machine) les délais d'attente sont arrivés suffisamment rapidement, mais surtout sous charge, ils ont tendance à empirer, ne venant qu'après 20 secondes environ. Je suis content d'avoir testé la configuration (avec un simple appel 'ab'), sinon je n'aurais pas remarqué ce comportement étrange. –

0

Je ne servirais pas directement de la montagne NFS, mais au lieu de votre système de fichiers local.

Il ne serait pas trop difficile de configurer un travail cron qui synchronise le montage NFS sur le système de fichiers local toutes les quelques minutes. Apache servirait son contenu à partir de là, ne dépendant pas de la monture NFS. Si la monture tombe en panne, Apache sera toujours en mesure de servir les actifs, bien qu'ils pourraient être périmés jusqu'à ce que la monture NFS revienne.

+0

Ce serait idéal, et une solution que nous avons utilisée, mais ne fonctionnera pas dans la situation où la tête web a une petite Disque dur de 50 Go et il y a 250 Go d'actifs. Nous avons également utilisé S3 comme alternative, mais beaucoup de fichiers doivent être manipulés et sont plus que de simples actifs statiques. – benr75