2008-12-03 8 views
4

Je ne suis pas du monde Perl, donc c'est nouveau pour moi. J'utilise Ubuntu Hardy LTS avec les paquets apache2 et mod_fcgid installés. Je voudrais que MT4 fonctionne sous fcgid plutôt que mod-cgi (il semble fonctionner correctement avec CGI).Pourquoi mon script simple fastCGI Perl échoue?

Je n'arrive pas à obtenir un simple script Perl à exécuter sous fcgid. J'ai créé une application "Hello World" simple et inclus le code de this previous question pour tester si FCGI est en cours d'exécution.

J'ai appelé mon script HelloWorld.fcgi (actuellement, fcgid est configuré pour gérer les fichiers .fcgi uniquement). Code:

#!/usr/bin/perl 

use FCGI; 

print "Content-type: text/html\n\n"; 
print "Hello world.\n\n"; 
my $request = FCGI::Request(); 
if ($request->IsFastCGI) { 
    print "we're running under FastCGI!\n"; 
} else { 
    print "plain old boring CGI\n"; 
} 

Lorsqu'il est exécuté à partir de la ligne de commande, il imprime « bon vieux ennuyeux ... » Quand il est invoqué via une requête http à apache, je reçois une erreur 500 Internal Server et la sortie du script est imprimé vers le journal des erreurs Apache:

Content-type: text/html 

Hello world. 

we're running under FastCGI! 
[Wed Dec 03 22:26:19 2008] [warn] (104)Connection reset by peer: mod_fcgid: read data from fastcgi server error. 
[Wed Dec 03 22:26:19 2008] [error] [client 70.23.221.171] Premature end of script headers: HelloWorld.fcgi 
[Wed Dec 03 22:26:25 2008] [notice] mod_fcgid: process /www/mt/HelloWorld.fcgi(14189) exit(communication error), terminated by calling exit(), return code: 0 

Lorsque je lance la version .cgi du même code, cela fonctionne correctement. Une idée de pourquoi la sortie du script va dans le journal des erreurs? config Apache est la configuration par défaut mod_fcgid plus, dans une directive VirtualHost:

ServerName test1.example.com 
    DocumentRoot /www/example 

    <Directory /www/example> 
    AllowOverride None 
    AddHandler cgi-script .cgi 
    AddHandler fcgid-script .fcgi 
    Options +ExecCGI +Includes +FollowSymLinks 
    </Directory> 

Répondre

3

J'utilise CGI :: rapide plus FCGI, mais l'idée est la même chose, je pense. Le but de cgi rapide est de charger le programme une fois, et itérer en boucle pour chaque requête.

page man FCGI dit:

use FCGI; 

my $count = 0; 
my $request = FCGI::Request(); 

while($request->Accept() >= 0) { 
    print("Content-type: text/html\r\n\r\n", ++$count); 
} 

Ce qui signifie, vous devez Accept la demande avant de pouvoir imprimer quoi que ce soit au navigateur.

+0

Essayé cela, résultat similaire. Également essayé en utilisant un simple CGI :: Fast Hello World - échoue également. Tellement bizarre ... – sstrudeau

2

Type mobile utilise CGI :: Fast pour FastCGI. Le script FastCGI typique s'exécute dans une boucle, comme décrit mat. Une boucle qui utilise CGI :: jeûneraient ressembler à ceci:

#!/usr/bin/perl 

use strict; 
use CGI::Fast; 

my $count = 0; 
while (my $q = CGI::Fast->new) { 
    print("Content-Type: text/plain\n\n"); 
    print("Process ID: $$; Count is: " . ++$count); 
} 

J'ai testé ce script sur un serveur avec les modules :: rapide FCGI et CGI installés et incréments de comptage que vous attendez. Si l'identifiant du processus change, le compte reviendra à 1 puis augmentera dans ce processus. Chaque processus a son propre espace variable bien sûr. Pour MT, activer FastCGI revient à renommer (ou symlinker) les scripts cgi en 'fcgi' (ou à faire le gestionnaire des scripts 'cgi' fcgid, mais ça ne marchera pas pour mt-xmlrpc.cgi 't FastCGI sympathique encore). Vous devrez également ajouter des directives à votre fichier mt-config.cgi afin qu'il connaisse les nouveaux noms de script. Comme ceci:

AdminScript mt.fcgi 
CommentsScript mt-comments.fcgi 

Et ainsi de suite. Plus de documentation spécifique à FastCGI et Movable Type est disponible sur movabletype.org.

3

Le problème est que l'en-tête "Content-Type" est envoyé en dehors de la boucle de requête. Vous devez imprimer l'en-tête "Content-Type" pour chaque requête. Si vous vous déplacez

print "Type de contenu: text/html \ n \ n";

en haut de la boucle de requête, il devrait résoudre le problème.

De plus, vous devez faire une boucle sur les demandes ou vous aurez aucun avantage, si l'exemple de la première affiche:

my $request = FCGI::Request(); 
while($request->Accept() >= 0) { 
    print("Content-type: text/html\n\n"); 
} 
0

Quoi qu'il en soit, en fonction des journaux d'erreurs de votre serveur, il semble que FCGI travaille , et être invoqué correctement, mais votre script ne fonctionne pas en boucle, attendant la prochaine requête. Votre script de test a donc accompli la tâche: signaler si FastCGI est configuré ou non. Donc maintenant vous devriez pouvoir reconfigurer MT pour utiliser FastCGI.

Questions connexes