2010-10-23 27 views
19

Un choix très populaire pour l'exécution des applications web Perl de nos jours semble être derrière un serveur web nginx demandant des requêtes à un démon FastCGI ou à un serveur web compatible PSGI (par exemple Starman) .nginx et Perl: FastCGI vs proxy inverse (PSGI/Starman)

Il y a eu beaucoup de questions pour lesquelles on pourrait le faire en général (par exemple Why use nginx with Catalyst/Plack/Starman?) et les réponses semblent appliquer dans les deux cas (par exemple, permettre nginx au service de contenu statique, redémarrage facile du serveur d'applications, l'équilibrage de charge , etc.)

Cependant, je suis particulièrement intéressé par les avantages/inconvénients de l'utilisation de FastCGI par rapport à une approche par proxy inverse. Il semble que Starman soit largement considéré comme le serveur/application Web Perl PSGI le plus rapide et le meilleur, et j'ai du mal à voir des avantages à utiliser FastCGI. Les deux approches semblent soutenir:

  • sockets de domaine UNIX aswell comme les sockets TCP
  • serveurs de style gestionnaire de fourche/processus Aswell en tant que serveurs basés sur des événements non-bloquant (par exemple AnyEvent).
  • Traitement des signaux/redémarrage en douceur
  • PSGI

De même, la configuration nginx pour l'une des options est très similaire.

Alors pourquoi choisir l'un plutôt que l'autre?

Répondre

15

Une configuration de proxy inverse (par exemple nginx la transmission des requêtes HTTP à Starman) présente les avantages suivants:

  • choses sont un peu plus facile à déboguer, puisque vous pouvez facilement frapper directement le serveur principal; Si vous avez besoin de mettre à l'échelle votre serveur dorsal, vous pouvez facilement utiliser quelque chose comme pound/haproxy entre le serveur HTTP (statique) et vos backends (Zope est souvent déployé comme ça);

  • il peut être un acolyte sympa si vous utilisez également une sorte de proxy vers l'extérieur, de cache, de reverse proxy (comme Varnish ou Squid) car il permet de le contourner très facilement.

Cependant, il a les inconvénients suivants:

  • le serveur back-end doit comprendre le vrai IP d'origine, car tout ce qu'il verra est l'adresse du serveur frontend (généralement localhost); il y a presque un moyen facile de trouver l'adresse IP du client dans les en-têtes HTTP, mais c'est quelque chose de plus à comprendre; Le serveur dorsal ne connaît généralement pas l'en-tête HTTP "Host:" orignal et, par conséquent, ne peut pas générer automatiquement une URL absolue pour une ressource locale. Zope aborde cela avec des URL spéciales pour intégrer le protocole original, l'hôte et le port dans la requête au backend, mais c'est quelque chose que vous n'avez pas à faire avec FastCGI/Plack/...; Le frontal ne peut pas générer automatiquement des processus backend, comme cela pourrait être le cas avec FastCGI par exemple.

Choisissez vos favoris avantages/inconvénients et faire votre choix, je suppose ;-)

+11

adresse IP du client d'origine est passé en-tête X-Forwarded-For et en-tête d'hôte d'origine est passé dans X-Forwarded- En-tête de l'hôte, les deux premiers inconvénients ne sont donc pas importants. – marpetr

+0

+1 merci pour la comparaison. Comme on peut exécuter un processus maître pour gérer les processus et les threads principaux, le point 3 est sans problème. Vous avez soulevé un point intéressant concernant Zope et la façon de connaître l'adresse IP et le nom d'hôte du client original pour construire des URL valides – Viet

0

HTTP est bien compris par la plupart des administrateurs système et il est facile de déboguer. Il y a presque toujours une sorte de proxy inverse déjà déployé, donc c'est un jeu d'enfant d'ajouter simplement une autre strophe de configuration à sa configuration afin de faire fonctionner votre application en quelques secondes. Jamais testé les différences de vitesse avec les deux paramètres, mais d'un autre côté, je n'ai jamais eu de problèmes dans ce domaine, donc ça ne peut pas être si mauvais.