Qu'est-ce qu'un modèle de serveur Web pré-fork?

94

Je veux savoir ce que cela signifie exactement quand un serveur Web se décrit comme un serveur Web pré-fork. J'ai quelques exemples tels que licorne pour rubis et gunicorn pour python.

Plus précisément, voici les questions:

  • Quel problème ce modèle résout-il?
  • Que se passe-t-il lorsqu'un serveur Web pré-fork est initialement démarré?
  • Comment gère-t-il la demande?

Aussi, une question plus spécifique pour licorne / gunicorn:

Disons que j'ai une application Web que je veux exécuter avec (g) unicorn. Lors de l'initialisation, l'application Web effectuera des tâches d'initialisation (par exemple, remplir des entrées de base de données supplémentaires). Si je configure (g) unicorn avec plusieurs workers, le truc d'initialisation sera-t-il exécuté plusieurs fois?

Hery
la source

Réponses:

102

Le pré-forking signifie essentiellement qu'un maître crée des fourches qui gèrent chaque demande. Un fork est un processus * nix complètement séparé.

Mettez à jour selon les commentaires ci-dessous. L' preentrée pre-forksignifie que ces processus sont fourchus avant qu'une requête n'entre. Ils peuvent cependant généralement être augmentés ou diminués à mesure que la charge augmente et diminue.

Le pré-forking peut être utilisé lorsque vous avez des bibliothèques qui ne sont PAS thread-safe. Cela signifie également que les problèmes dans une demande causant des problèmes n'affecteront que le processus par lequel ils sont traités et non le serveur entier.

L'initialisation exécutée plusieurs fois dépend de ce que vous déployez. Cependant, des pools de connexions et des éléments de cette nature existent généralement pour chaque processus.

Dans un modèle de thread, le maître créerait également des threads plus légers pour distribuer les demandes. Mais si un thread cause des problèmes massifs, cela pourrait avoir des répercussions sur le processus maître.

Avec des outils tels que Nginx, Event MPM d'Apache 2.4 ou gevent (qui peut être utilisé avec Gunicorn), ils sont asynchrones, ce qui signifie qu'un processus peut gérer des centaines de demandes sans bloquer.

Joe Doherty
la source
29
J'avais le même doute sur la signification de "prefork". Je supposais que cela signifiait une sorte de bifurcation, naturellement, mais la partie "pré" me déroutait. J'ai trouvé ici abbreviations.com/prefork que la partie "pré" signifie en fait que les processus de travail sont créés à l'avance, de sorte que le temps n'est pas perdu à bifurquer uniquement lorsqu'un travailleur est nécessaire. Cela a beaucoup de sens pour moi :)
El Ninja Trepador
1
//, @ElNinjaTrepador, pourquoi ne pas ajouter une réponse séparée? C'était au moins beaucoup plus compréhensible pour moi, et cela pourrait aider les autres davantage si ce commentaire occupe une place plus importante.
Nathan Basanese
2
J'ai mis à jour la réponse pour ajouter un peu plus d'informations sur le pré-pré-fork. @ElNinjaTrepador merci d'avoir signalé cela, je ne savais pas que ce n'était pas bien connu.
Joe Doherty
1
@NathanBasanese fera monsieur;)
El Ninja Trepador
4
@JoeDoherty c'est peut-être bien connu, je ne le savais tout simplement pas jusqu'à ce moment-là: DI allait ajouter une autre réponse (à la demande de Nathan), mais puisque vous avez ajouté ce que j'ai dit au vôtre, ce n'est plus nécessaire: )
El Ninja Trepador