2010-08-13 8 views
2

J'utilise nginx avec this script comme emballage FastCGI, que je commence par:Lors de l'exécution de Perl avec wrapper FastCGI dans nginx, est-ce que j'obtiens un gain de vitesse?

spawn-fcgi -F 3 -u www-data -s /var/run/perl-fcgi.sock -P /var/run/perl-fcgi.pid -- ./perl-fcgi.pl 

Maintenant, supposons que j'ai un script simple:

#!/usr/bin/perl 

print "Content-type: text/plain\r\n\r\n"; 
print "hello\n"; 

Le script fonctionne très bien, et je vois la "bonjour" quand je demande /text.pl. Mais comme vous pouvez le voir dans la ligne 106 de l'encapsuleur FastCGI, le script est exécuté avec exec(), donc il s'exécute dans son propre environnement Perl. Cela ne gâche-t-il pas tout le concept de FastCGI, quand je n'ai pas de script déjà initialisé, mais que je l'appelle indépendamment?

Quelle serait la manière préférée d'interagir via FastCGI sur nginx?

Vive, --polemon

PS: spawn-fcgi est le programme de lighttpd qui commence enveloppes FCGI et les relie à une prise de courant.

Répondre

4

Oui, ça ruine tout le concept de FCGI, mais par conception.

Le script que vous utilisez est un adaptateur FCGI à CGI, conçu pour contourner l'incapacité délibérée de ngnix à traiter les scripts CGI. Pour utiliser FCGI "correctement", pointez ngnix sur votre script compatible FCGI. À la hausse, si ngnix peut parler à cet adaptateur FCGI-CGI, vous savez qu'il peut parler à un autre script FCGI. La configuration spécifique du serveur est probablement une question pour serverfault.

+0

Le problème est, je voudrais utiliser Perl comme n'importe quel autre langage de script avec nginx. J'ai des hooks de travail pour Lua et PHP, tous deux exécutés avec FastCGI. Si j'exécutais tous les autres scripts Perl pendant l'exécution de l'encapsuleur, je ne pourrais appeler aucune application Perl comme je le souhaite, je devrais raccorder chaque script Perl avec son propre socket à nginx, ce qui n'est pas préférable. N'y a-t-il pas d'autre solution? – polemon

+0

@polemon, à droite. Vous avez besoin d'un courtier ou d'un gestionnaire de processus FCGI, qui soit fait tourner vos scripts individuels en tant que démons FCGI, soit est lui-même l'interpréteur FCGI et peut, par exemple, compiler dynamiquement des scripts perl autonomes dans des sous-routines la demande. – pilcrow

+0

@polemon Parmi les problèmes, beaucoup de programmes CGI Perl ne sont pas conçus pour s'exécuter plus d'une fois par processus. Ils jouent vite et en vrac avec des données globales parce que normalement ils sont jetés à la fin. Les mettre dans une boucle FCGI peut causer des bogues étranges. Vous pouvez vous procurer des performances sans mal de tête en écrivant un wrapper FCGI qui précharge des modules courants et coûteux, comme Moose, avant de lancer et d'exécuter l'application CGI. Cela permettra d'économiser au démarrage, ce qui représente une grande partie du coût d'utilisation de CGI vanille. – Schwern