2009-04-28 3 views
0

Je pense que d'une façon connue de l'ajout PHP à un serveur Web Apache est de le configurer comme ceci:Configurer Apache pour utiliser Python comme CGI PHP

ScriptAlias /php5.3 /usr/local/php5.3/bin 
Action application/php5.3 /php5.3/php-cgi 
AddType application/php5.3 .php 

Maintenant, j'essayé d'écrire une configuration similaire pour Python:

ScriptAlias /python /usr/bin 
Action application/python /python/python 
AddType application/python .py 

J'ai un petit script de test qui ressemble à ceci:

print "Content-Type: text/html\n\n" 
print "Test" 

Mais quelque chose semble s à tort puisque le journal des erreurs apache dit le texte suivant:

Premature end of script headers: python 

Ma première était que si ma réponse python ne va pas. Mais il y a le Content-Type et aussi les deux linebreaks. De plus, la sortie d'un script PHP similaire appelé php-cgi donne exactement la même sortie.

Aussi je n'ai pas trouvé un tutoriel qui montre comment faire fonctionner python de cette façon. Alors peut-être que ce n'est pas possible, mais alors je suis curieux de savoir pourquoi c'est le cas? Ou est-ce que je manque quelque chose?

+0

Juste pour clarifier: je connais les alternatives et comment configurer correctement python. Je me demande juste pourquoi cette configuration ne marche pas ... – okoman

Répondre

5

"Alors peut-être que ce n'est pas possible, mais alors je suis curieux de savoir pourquoi c'est le cas?"

Correct. Ce n'est pas possible. Cela n'a jamais été prévu non plus.

Raison 1 - Python n'est pas PHP. PHP - dans son ensemble - s'attend à être un CGI. Python ne le fait pas.

Raison 2 - Python n'est pas intrinsèquement un CGI. C'est un interprète qui n'a (presque) aucune attente environnementale.

Raison 3 - Python n'a jamais été conçu pour être un CGI. C'est pourquoi Python est généralement intégré dans de petits wrappers (mod_python, mod_wsgi, mod_fastcgi) qui peuvent encapsuler l'environnement CGI sous une forme qui a plus de sens pour un programme Python en cours d'exécution.

+0

Bon, j'ai lu des articles plus détaillés sur CGI maintenant et je pense que je vois le point. – okoman

+0

Python fonctionne parfaitement dans cgi, une fois que vous avez pris en compte le temps de démarrage de l'interpréteur à chaque requête. Certes, je ne ferais pas un site web moderne avec ça, mais ça marche. – JimB

+0

Python fonctionne en CGI, mais pas dans la même configuration que PHP. –

13

Vous pouvez utiliser n'importe quel type d'exécutable en tant que cgi. Votre problème est dans votre config apache, qui ressemble à ce que vous venez de faire. Consultez les documents apache pour plus de détails, mais vous n'avez pas besoin de l'action et AddType.

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" 

basculons alors ce qui suit dans votre cgi-bin:

#!/usr/bin/python 
# test.py 
print "Content-Type: text/html\n\n" 
print "Test" 

Assurez-vous qu'il est exécutable, et voir le résultat à /cgi-bin/test.py

+0

Réponse agréable et concise. –

+0

Bien, mais je ne voulais pas le script cgi 'ordinaire', mais évitez la ligne d'interprète. – okoman

+1

Mais CGI CGI est un cgi "ordinaire". Vous appelez l'interpréteur php d'apache pour exécuter votre script. – JimB

1

L'erreur « prématurée fin des en-têtes de script: "peut se produire si le fichier .py a été modifié dans un programme Windows qui utilise des caractères CRLF pour les sauts de ligne au lieu de la LF Unix.

Certains programmes comme Dreamweaver ont des préférences de type saut de ligne. Le Bloc-notes utilise également CRLF. Si votre hôte dispose d'un éditeur de fichiers, vous pouvez effectuer un test en effectuant un retour arrière sur les sauts de ligne en cours et en les réentrant dans cet éditeur, ce qui ne modifierait que les fichiers CRLF en fichiers LF. Notepad ++ ne peut utiliser que LF.

0

Lorsque vous ouvrez par exemple http://localhost/test.py, vous vous attendez à ce qu'Apache démarre en quelque sorte le processus /usr/bin/python /var/www/test.py (i.e l'interpréteur avec un argument de ligne de commande unique). Mais ce n'est pas ce qui arrive car Apache appelle le script cgi avec aucun argument. Au lieu de cela, il fournit toutes les informations à travers des variables d'environnement normalisées par CGI.

Comme d'autres l'ont fait remarquer en utilisant python comme cgi simple est inefficace, mais si pour des raisons éducatives vous aimeriez toujours le faire, vous pouvez essayer cela.

En supposant que la valeur par défaut Apache paramètres cgi-bin sont actifs, vous pouvez créer une simple enveloppe nommée python (ou tout ce que vous choisissez) dans votre /usr/lib/cgi-bin avec le contenu suivant:

#!/usr/bin/python 
import os 
execfile(os.environ['PATH_TRANSLATED']) 

Ne pas oublier de faire exécutable: chmod a+x /usr/lib/cgi-bin/python

Mettez ces en vous config Apache:

AddType application/python .py 
Action application/python /cgi-bin/python 

maintenant, quand vous ouvrez http://localhost/test.py Apache va exécuter/cgi-bin/python sans argument mais avec des variables d'environnement CGI remplies. Dans ce cas, nous utilisons PATH_TRANSLATED car il pointe directement sur le fichier dans le site Web. L'appel execfile interprète ce script dans le processus Python déjà ouvert.