Faire fonctionner python avec apache

Yop,

Aujourd’hui j’ai eu la subite envie de me lancer dans la programmation internet avec python. Non pas que je ne sais pas coder en PHP, mais je me suis dis qu’un peu de python serait plus approprié dans mon cas.

J’ai donc entrepris une installation LAMP (Linux Apache MySQL Python, et non pas PHP), jusque là tout va bien. Avec Debian comme socle.

Je vous épargne les détails de l’installation de Debian (assez long et puis chacun sa merde :D) et je n’ai pas réellement envie de me refader une installation de Debian pour expliquer.

Commençons par l’installation des paquets nécessaires.

Installation des prérequis

On va tout d’abord s’occuper du socle de votre futur serveur web. Avec uniquement de l’apt-get install

Python

Pas de surprise, on installe python et le support MySQL. Bien sûr, n’oubliez pas le « sudo » si vous n’êtes pas root.

apt-get install -y python python-mysqldb

Vous pouvez utiliser l’interpreteur python pour vous faire la main si vous n’êtes pas habitué à ce langage. Il suffit de taper dans une console :

python

Le manuel de référence est ici

Apache

Bon, toujours pas de surprise mis à part l’intégration du module python.

apt-get install -y apache2 libapache2-mod-python

Ca va installer apache et le module python, pour le support de python.

MySQL

Tonton bartoua aurait pu faire le sadique et vous inviter à aller chercher les sources sur le site officiel de MySQL mais on va faire ça de manière plus rapide.

apt-get install -y mysql-server

Un prompt va vous demander un mot de passe root, gardez le bien au chaud, vous en aurez besoin. Et voila, vous avez un serveur MySQL tout neuf.

Configuration de tout ce bordel

MySQL

Nous allons créer un utilisateur de service MySQL (on va quand même pas mettre le mot de passe root en dur dans du code :D faut pas déconner non plus).

Là deux alternatives :

  • PMA (PhpMyAdmin, il faudra vous habituer) une interface complète pour administrer votre base MySQL
  • ou la console MySQL

On va utiliser PMA pour ne pas perdre les petits et en apt (histoire d’avoir toutes les dépendances … et oui je suis fainéant).

apt-get install -y phpmyadmin

Et là on va avoir le droit à php et tout ses petits copains, mais c’est pour la bonne cause :D. On vous demandera vos informations de connexion à la base de données, c’est pour établir un premier fichier de conf.

On va maintenant éditer la conf de PMA, parce que sur un serveur de prod avoir une adresse « http://monsite.fr/phpmyadmin » ça craint sérieusement pour la sécurité.

nano /etc/apache2/conf.d/phpmyadmin.conf

J’utilise nano, mais utilisez ce que vous voulez. A la troisième ligne, vous avez une ligne comme ça :

Alias /phpmyadmin /usr/share/phpmyadmin

Et vous changerez l’alias en un truc que vous voulez, pour l’exemple, il y aura pmadb à la place (je vous rassure il n’existe pas sur bartoua.fr :D et même si il y en avait un il y aurait une restriction IP).

Alias /pmadb /usr/share/phpmyadmin

Et voila on a un nouvel alias sur PMA, il faut juste recharger Apache :

/etc/init.d/apache2 reload

Vous pouvez désormais utiliser PMA avec l’alias que vous lui avez donné :  »http://monsite.fr/pmadb » Après avoir mis vos identifiants root de MySQL, nous allons nous dirigé directement vers « Privilèges » (dans les onglets de la partie de droite) et on ajoute un utilisateur de service avec uniquement une base à son actif (on en aura pas besoin de plus).

Ajout d'un utilisateur PMA

Ajout d'un utilisateur PMA

Les petits cacas rouges sur le dessin servent à montrer les points essentiels.

  1. un nom d’utilisateur MySQL
  2. d’où peut on se connecter avec cet utilisateur
  3. mot de passe (un niveau de sécurité correct hein)
  4. la confirmation du mot de passe
  5. on lui donne sa base de données
  6. j’ai tout coché par fleme, mais il faut trier en fonction de ce qu’on veut faire avec ce user.
  7. On envoie le pâté !

On peut maintenant passer à autre chose.

Apache

On va créer notre Virtualhost, (ceux pour qui ça ne parle pas se réfèrent à la doc apache :D) à mettre dans /etc/apache2/sites-available

nano /etc/apache2/sites-available/monsite.fr

Ensuite on entre un truc simple :

<VirtualHost *:80>
        ServerName monsite.fr

        DocumentRoot "/var/www/monsite"

        <Directory "/var/www/monsite">
                DirectoryIndex index.py
                Options Indexes FollowSymLinks
                AllowOverride All
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>

Bon pas si simple que ça, mais ça va vous permettre de ne pas modifier la conf, si vous décidez de faire une grosse appli python :) La directive DocumentRoot, va déterminer à apache dans quel répertoire se trouve les fichiers à exécuter.

Maintenant on va dire à apache de bien lire exécuter les fichiers python. On va créer un fichier .htaccess à la racine du virtualhost.

nano /var/www/.htaccess

Et on lui rentre les deux lignes suivantes :

Options +ExecCGI

AddHandler cgi-script .py

Ca évite de surcharger le Virtualhost si vous utilisez des langages divers et variés dans le même virtualhost.

On va vérifier maintenant que le module python est bien activé :

a2enmod python

Si apache vous dit que python est déjà activé c’est pas grave :) Sinon c’est fait maintenant :D.

On a plus qu’à activer le Virtualhost :

a2ensite monsite.fr

Ah oui, et on oublie pas de redémarrer ou de recharger apache (ça dépend de ce que vous a dit apache tout à l’heure à propos de l’activation du mod_python).

Bon bah il ne reste plus qu’à coder un petit truc pour voir si tout fonctionne bien :)

Développement en python web

Un petit bout de code pour tester si tout est OK :

#!/usr/bin/python
#tres important, permet de determiner l'executable a utiliser

import datetime

# le type de fichier que le navigateur interprete
print "Content-Type: text/html\n"
# debut du HTML
print """<html>
        <head>
                <title>Merci tonton bartoua :)</title>
        </head>
        <body>
                <h1>It works ?</h1>
                <p>hu ? Amazing</p>
                <p>Oh WTF ? on peut appeler des fonctions pythons
</p><p>datetime.datetime.now() : """
# execution d'une methode python
print datetime.datetime.now()
# fin du HTML
print """</p><p>et en plus on peut faire n'importe quoi, en
respectant les regles hein :D</p>
        </body>
</html>"""

Le truc un peu chiant, c’est le « Content-Type: text/html\n« . Parce que sinon votre navigateur ne saura pas comment afficher le résultat.
Bon maintenant que vous avez un serveur qui peut accueillir du python, et bah au boulot hein, je vais pas vous coder votre appli non plus >_<

Si vous avez des questions, n’hésitez pas à les posez en commentaire.

Big UP !

12 réflexions au sujet de « Faire fonctionner python avec apache »

  1. J’utilise mod_wsgi pour mon site web et je n’arrive pas à exécuter mes scripts python correctement.
    Saurais-tu m’aider?

    • Yop,

      Qu’entends tu par « je n’arrive pas à exécuter mes scripts python correctement » ?

      Que disent les logs de ton virtual host ?

      Tu viens de me donner une idée de tuto :D

      • Je crois qu’il me manque des commandes pour que Apache interprète le code python.C’est visible parce qu’il n’y a que le code html qui est interprété et le reste du code python s’affiche sur ma page (pas cool -_-)
        voilà ce que me sort mon fichier error.log:
        script not found or unable to stat: C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/python27,
        P.S: C’est une bonne idée de faire un tuto sur Apache mod_wsgi.Il ya tellement peu de docs là dessus….

    • Est ce que tu as bien permis à apache d’accéder au répertoire où se trouve les binaires de python ?

      Par exemple :

      <directory « C:/python27/ »>
      AllowOverride none
      Order allow,deny
      Allow from all
      </directory »>

      • j’ai bien peur que oui ^^
        Voilà un aperçu de ce que j’ai ajouté au httpd.conf
        LoadModule wsgi_module modules\mod_wsgi.so

        ServerName
        ServerAlias localhost
        ServerAdmin

        DocumentRoot c:\Python27

        AllowOverride none
        Order allow,deny
        Allow from all

        WSGIScriptAlias /test c:\python27\test.wsgi
        WSGIScriptAlias /showMessage c:\python27\message.py

        Options +FollowSymlinks
        RewriteEngine on
        RewriteRule ^inconnu\.html$ test.html [L]

        Options +FollowSymlinks
        RewriteEngine on
        RewriteRule message.py [L]

        Options +ExecCGI
        AddType text/html py

        • Un petit conseil pour gagner en visibilité : mets tes règles de rewrite dans un .htaccess

          Bon je vais faire une install wsgi. Je te tiendrai au courant dès que j’aurais release le tuto step-by-step

          Big Up!

          PS: tu peux déjà me réécrire ton httpd.conf pour que je puisse le comprendre, parce que wordpress interprète les balises :D

          • LoadModule wsgi_module modules\mod_wsgi.so

            VirtualHost *:80

            ServerName
            ServerAlias
            ServerAdmin

            DocumentRoot c:\Python27

            Directory c:/Python27
            AllowOverride none
            Order allow,deny
            Allow from all
            Directory

            WSGIScriptAlias /test c:/python27/test.wsgi
            WSGIScriptAlias /message c:/python27/message.py

            Options +FollowSymlinks
            RewriteEngine on
            RewriteRule ^inconnu\.html$ test.html [L]

            Options +FollowSymlinks
            RewriteEngine on
            RewriteRule test.py [L]

            Options +FollowSymlinks
            RewriteEngine on
            RewriteRule message.py [L]

            Options +ExecCGI
            AddType text/html py

            /VirtualHost

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Image CAPTCHA

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>