Webrick comme serveur de production contre Thin ou Unicorn?

117

Il semble qu'il soit pris pour acquis que vous ne devez pas utiliser Webrick comme serveur de production, mais je ne trouve vraiment nulle part mentionnant pourquoi. Le consensus semble être: "Webrick convient au développement, mais Thin ou Unicorn est le choix pour la production, point final."

J'ai cherché la page d'accueil du serveur Thin et il parle de requêtes / seconde mais je ne comprends pas vraiment le graphique car il n'y a pas d'annotation.

Quelqu'un peut-il me dire pourquoi je devrais utiliser Thin ou Unicorn par rapport à Webrick? Y a-t-il également un avantage à utiliser Webrick pour le développement? J'utilise Webrick depuis qu'il est livré avec des rails, et je pense qu'il devrait y avoir une raison pour laquelle c'est par défaut.

J'utilise Heroku au fait.

Vlad
la source
Son lent par rapport à d'autres comme Mongrel.
uday
38
Ken, je n'ai vraiment pas posé cette question pour débattre de quoi que ce soit. Je veux vraiment connaître la réponse car je ne trouve nulle part de vraies statistiques, alors que tout le monde prend pour acquis que Webrick est inférieur. Je ne suis affilié à aucun de ces partis et les débats que vous avez mentionnés sont des questions que je pose par véritable curiosité. Comment puis-je reformuler la question pour qu'elle ne ressemble pas à ça?
Vlad
24
C'est une bonne question.
justingordon
29
Des questions comme celle-ci ne doivent PAS être fermées. Ils sont utiles et utiles. Toute police de contenu autoproclamée devrait reculer.
Ken Smith
22
J'ai trouvé ceci en recherchant sur Google "Pourquoi ne pas utiliser WEBrick en production?" parce que c'est une question à laquelle je veux répondre. Je ne veux pas utiliser WEBrick en production, mais je trouve ennuyeux que tout le monde dise: "Parce que ce n'est pas pour la production®, évidemment." Ce n'est vraiment pas si évident - si c'était le cas, les gens ne rechercheraient pas la question avant de finalement la poser sur StackOverflow, comme @Vlad l'indique. La réponse acceptée est utile; au moins souligne certaines fonctionnalités manquantes. Tangentiellement, insister pour qu'une question soit close parce que vous pensez qu'elle est sans objet sans fournir votre propre réponse n'est pas utile.
Justin Force

Réponses:

42

Quelques raisons importantes

  1. il est écrit en Ruby (voir http://github.com/ruby/ruby/tree/trunk/lib/webrick )
  2. Modifié, il n'a pas beaucoup de fonctionnalités dont un site Web de production a généralement besoin, comme plusieurs travailleurs (en particulier, pré-forking, gestion du cycle de vie, gestion asynchrone, etc.), des redirections, la réécriture, etc.

Lorsque je mentionne les redirections / réécritures, je fais référence au fait qu'en utilisant Webrick, vous devez gérer les réécritures sur une couche différente (Rack, Sinatra, Rails, code Webrick personnalisé, etc.). Cela vous oblige à faire tourner des «gestionnaires» Ruby supplémentaires pour exécuter votre code de réécriture. Pour un site à faible trafic, cela peut convenir car vous avez peut-être déjà des processus préchauffés qui ne font rien. Cependant, pour un site à trafic plus élevé, il s'agit d'une charge supplémentaire sur le serveur pour quelque chose que les serveurs frontaux (Apache, Nginx, etc.) peuvent gérer sans faire tourner Ruby *, et probablement des ordres de grandeur plus rapides.

* par exemple, si vous utilisez un équilibreur de charge, vous pouvez acheminer tout le trafic de réécriture vers un serveur sur lequel ruby ​​n'est pas installé et laisser vos serveurs principaux gérer uniquement le trafic principal. Ce trafic de réécriture peut être dû à des modifications du site pour le référencement, ou à quelque chose de similaire. Un autre cas serait un site qui a plusieurs composants, et peut-être une section est Rails, une autre est PHP, et des réécritures sont nécessaires pour les deux (c'est-à-dire réécrire les anciens chemins PHP en Rails)

Jim Deville
la source
N'est-il pas possible d'utiliser delay_job pour gérer plusieurs travailleurs sur Heroku, quel que soit le serveur que vous utilisez?
Vlad
Oui, delay_job n'est pas lié à Webrick, à moins que vos travaux n'utilisent les API Webrick (ce qui est honnêtement une odeur de code car il se couple).
Jim Deville
Je fais référence aux redirections en dehors de la pile Ruby. Comme les redirections de style mod_rewrite. Techniquement, vous pouvez rediriger à l'intérieur de Rack, ou Rails, ou, peut-être même Webrick (je peux me tromper), mais cela nécessite de démarrer ruby, ce qui est relativement lent par rapport à Apache ou Nginx
Jim Deville
1
@JimDeville - Unicorn est aussi écrit en Ruby
Yarin
1
github.com/defunkt/unicorn/tree/master/ext/unicorn_http une grande partie de Unicorn est en C
Jim Deville
4

WEBrick ne peut pas non plus gérer des URI plus longs, s'ils dépassent 2083 caractères, vous verrez un plantage. Thin n'a pas ces problèmes, ce qui le rend supérieur - déjà en développement.

Michael Schmitz
la source
De plus, Webrick a perdu la connexion et s'éteint automatiquement lorsque, d'après mon expérience, je développe un logiciel et lorsque j'ai choisi WeBRICK dans Heroku PaaS, l'extinction automatique est compensée par une vitesse d'activation automatique élevée (déclenchée par l'architecture automatique de Heroku )
Daniel Antonio Nuñez Carhuayo
3

Je n'aime pas vraiment compliquer les choses simples et l'optimisation prématurée. WEBrick peut être utilisé en production à condition qu'il s'agisse plutôt d'un site Web à faible trafic. La plupart des applications le sont.

Si votre site fait quelque chose qui prend du temps, par exemple, envoie des e-mails ou génère des fichiers PDF, vous devez rendre WEBrick multi-thread . Vous souhaitez gérer plusieurs demandes à la fois.

Nowaker
la source
1

Il a eu des problèmes de sécurité dans le passé, mais il semble que la principale raison en soit qu'il est vraiment lent par rapport aux serveurs destinés à la production.

Brett Henning
la source
4
Avez-vous vu une comparaison de statistiques? J'entends aussi des gens dire cela (et c'est probablement vrai) mais je ne trouve pas vraiment de comparaison de statistiques réelle nulle part sur le Web ...
Vlad
3
Je ne pense pas que quiconque compare vraiment Webrick car il n'est pas destiné à être un serveur de production. Unicorn, Thin ou Passenger sont bien pris en charge et de bien meilleures options
Jim Deville
0

La plus grande faiblesse de webrick lors de l'exécution en mode production est qu'il s'agit d'un serveur Web à un seul thread et à processus unique, ce qui signifie qu'il est capable de ne servir qu'une seule requête http à la fois.

Artur Beljajev
la source
Ce n'est pas un thread unique. Ou c'est de la même manière que n'importe quel langage de script moderne est implémenté (avec un GIL). Mais l'accès à la base de données et les E / S dans webrick sont entièrement multithread.
Lothar