Outils pour utilisateurs

Outils du site


programmation_serveur_php_python_nodejs

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
programmation_serveur_php_python_nodejs [2020/05/18 20:08] josephprogrammation_serveur_php_python_nodejs [2020/05/19 08:29] (Version actuelle) joseph
Ligne 36: Ligne 36:
 ## Python ## Python
  
-Dans toute la suite, on supposera qu'un classique serveur web Apache tourne sur la machine, et que, pour pouvoir définir des "Handler" directement dans les fichiers `.htaccess`, que le `VirtualHost` soit réglé en `AllowOverride All`. NB: c'est la valeur par défaut pour certaines versions d'Apache.+Dans toute la suite, on supposera qu'un classique serveur web Apache tourne sur la machine. On supposera aussi que le `VirtualHost` soit réglé en `AllowOverride All` (c'est la valeur par défaut pour certaines versions d'Apache ; cela permet de définir des paramètres directement dans les fichiers `.htaccess`, ce qui est pratique):
  
-### Méthode super simple: mod_cgi+``` 
 +<VirtualHost *:80> 
 +    ServerName example.com 
 +    DocumentRoot /home/www/example/ 
 +    <Directory /> 
 +      AllowOverride All 
 +      Require all granted 
 +    </Directory> 
 +  </VirtualHost>  
 +``` 
 + 
 + 
 +### Méthode simple (old-school): mod_cgi
  
 * Installer [mod_cgi](http://httpd.apache.org/docs/current/mod/mod_cgi.html) (mais il est souvent déjà installé) et l'activer avec `a2enmod cgi`. * Installer [mod_cgi](http://httpd.apache.org/docs/current/mod/mod_cgi.html) (mais il est souvent déjà installé) et l'activer avec `a2enmod cgi`.
  
-* Créer un fichier `app.py` (dans un dossier mentionné dans le `<VirtualHost>` Apache correspondant) ayant une permission en exécution:+* Créer un fichier `/home/www/example/app.py` ayant une permission en exécution:
     ```     ```
     #!/usr/bin/python3     #!/usr/bin/python3
Ligne 52: Ligne 64:
     ```     ```
     Options +ExecCGI     Options +ExecCGI
 +    SetEnv PYTHONIOENCODING utf8
     AddHandler cgi-script .py     AddHandler cgi-script .py
     ```     ```
          
-* Visitez http://example.com/path/to/app.py, ça doit marcher!    +* Visitez http://example.com/app.py, ça doit marcher!    
  
-NB: Utiliser CGI revient à démarrer un nouveau process (= un nouvel interpréteur Python) pour chaque requête, ce qui est potentiellement plus lent (dans mes tests 90ms Python 2.7 / 140ms Python 3, au lieu de 34ms avec `mod_python` ou `mod_wsgi`, voir plus bas).+NB: Utiliser CGI revient à démarrer un nouveau process (= un nouvel interpréteur Python) pour chaque requête, ce qui est potentiellement plus lent (dans mes tests 90ms Python 2.7 / 140ms Python 3, au lieu de 34ms avec `mod_python` ou `mod_wsgi`) que les méthodes détaillées ci-après.
  
  
 ### Méthode simple: mod_python ### Méthode simple: mod_python
  
-Il y a une [méthode toute simple](https://stackoverflow.com/questions/58414076/how-to-let-the-webserver-e-g-apache-call-python-directly/58414570#58414570) pour faire de la programmation web en Python, avec une logique similaire à celle détaillée en PHP :+Il y a une [méthode relativement simple](https://stackoverflow.com/questions/58414076/how-to-let-the-webserver-e-g-apache-call-python-directly/58414570#58414570) pour faire de la programmation web en Python, avec une logique similaire à celle détaillée en PHP :
  
 1. Installer le module `mod_python` : 1. Installer le module `mod_python` :
Ligne 68: Ligne 81:
         apt-get install libapache2-mod-python         apt-get install libapache2-mod-python
  
-2. Créer un fichier `.htaccess` à la racine du site, pour indiquer que les fichiers .py doivent être traités par Python (*), contenant ceci :+2. Créer un fichier `.htaccess` à la racine du site, pour indiquer que les fichiers .py doivent être traités par Python, contenant ceci :
  
         AddHandler mod_python .py         AddHandler mod_python .py
Ligne 88: Ligne 101:
 * *"Embedded mod_python embeds Python inside Apache; no process is forked"*, voir [ici](https://stackoverflow.com/questions/219110/how-python-web-frameworks-wsgi-and-cgi-fit-together/520194#520194), ce qui semble donc optimisé niveau performance (l'interpréteur Python n'a pas besoin de redémarrer un nouveau process pour chaque requête !) * *"Embedded mod_python embeds Python inside Apache; no process is forked"*, voir [ici](https://stackoverflow.com/questions/219110/how-python-web-frameworks-wsgi-and-cgi-fit-together/520194#520194), ce qui semble donc optimisé niveau performance (l'interpréteur Python n'a pas besoin de redémarrer un nouveau process pour chaque requête !)
  
-### La méthode classique+### Méthode classique: avec un framework web (Bottle, Flask, etc.)
  
-La méthode "classique" pour faire du web en Python est assez différente des méthodes présentées précédemment.+La méthode la plus courante pour faire du web en Python est assez différente des méthodes présentées précédemment.
  
 Contrairement à avoir, comme précédemment, pour chaque requête, un script qui s'exécute puis se termine, il s'agit ici d'avoir **un process Python qui tourne en permanence**, et attend les requêtes au fur et à mesure, dans une boucle infinie (Event loop). Contrairement à avoir, comme précédemment, pour chaque requête, un script qui s'exécute puis se termine, il s'agit ici d'avoir **un process Python qui tourne en permanence**, et attend les requêtes au fur et à mesure, dans une boucle infinie (Event loop).
Ligne 114: Ligne 127:
 * Django, réputé comme très complet, jamais testé personnellement * Django, réputé comme très complet, jamais testé personnellement
  
-Le code précédent fonctionne bien, mais "écoute" sur le port 8080, donc on peut y accéder avec `https://example.com:8080/`.  Comment donc "relier" ce process Python avec Apache qui écoute, quant à lui, sur le port 80 ?+Le code précédent fonctionne bien, mais "écoute" sur le port 8080, donc on peut y accéder avec `https://example.com:8080/`.  
  
-* soit en faisant un `.htaccess` qui indique à Apache de rediriger les requêtes vers le serveur Python+Comment donc "relier" ce process Python avec Apache qui écoute, quant à lui, sur le port 80 ?
  
-        RewriteEngine On +* **Soit avec une règle de réécriture d'URL pour rediriger les requêtes, d'Apache vers le serveur Python** 
-        RewriteRule /(.*) http://localhost:8080/$1 [P,L] + 
-        +    Mettre ceci dans le `.htaccess` : 
 +    ``` 
 +    RewriteEngine On 
 +    RewriteRule /(.*) http://localhost:8080/$1 [P,L] 
 +    ```
     Il faut aussi se débrouiller manuellement pour que le script Python tourne **sans arrêt**, même si on ferme la fenêtre du terminal / le SSH. Exemple dans Bash :      Il faut aussi se débrouiller manuellement pour que le script Python tourne **sans arrêt**, même si on ferme la fenêtre du terminal / le SSH. Exemple dans Bash : 
-     +    ```     
-        nohup python mysever.py & +    nohup python mysever.py & 
-        +    ``` 
     ou avec `screen` (voir un tuto à ce sujet) : `screen -S pythonserver`, `python myserver.py`, puis CTRL+A+D pour "détacher" le terminal, ou avec `systemd`.     ou avec `screen` (voir un tuto à ce sujet) : `screen -S pythonserver`, `python myserver.py`, puis CTRL+A+D pour "détacher" le terminal, ou avec `systemd`.
          
-soit en ajoutant ça dans la configuration Apache `<VirtualHost>` (méthode appelée "proxy / reverse proxy") :+**Soit en faisant un "reverse proxy"**
  
-        ProxyPass / http://localhost:8080/ +    Ajouter cela dans la configuration Apache `<VirtualHost>` : 
-        ProxyPassReverse / http://localhost:8080/ +    ``` 
-        +    ProxyPass / http://localhost:8080/ 
 +    ProxyPassReverse / http://localhost:8080/ 
 +    ``` 
     De même que pour le point précédent, il faut lancer le script `python` manuellement et s'assurer qu'il tourne continuellement.     De même que pour le point précédent, il faut lancer le script `python` manuellement et s'assurer qu'il tourne continuellement.
          
-soit avec `mod_wsgi` (méthode souvent plébiscitée, voir [ici](https://bottlepy.org/docs/dev/deployment.html#apache-mod-wsgi) pour un exemple complet, mais méthode que je ne recommanderai pas personnellement)+**Soit avec `mod_wsgi`** 
  
-    Faire:+    Cette méthode est souvent plébiscitée, voir [ici](https://bottlepy.org/docs/dev/deployment.html#apache-mod-wsgi) pour un exemple complet avec Bottle + `mod_wsgi`.
  
-        apt-get install libapache2-mod-wsgi +    On installe ce module Apache avec : 
-         +    ``` 
-    Puis remplacer la dernière ligne (`run(host='localhost', port=8080)`) par `application = bottle.default_app()`, puis mettre ça dans la config Apache : +    apt-get install libapache2-mod-wsgi 
-     +    ``` 
-        <VirtualHost *:80> +    On remplace la dernière ligne de l'application Bottle (`run(host='localhost', port=8080)`) par `application = bottle.default_app()`, puis on met cela dans la config Apache : 
-          ServerName example.com +    ``` 
-          WSGIScriptAlias / /var/www/test_wsgi/app.py +    <VirtualHost *:80> 
-          <Directory /> +      ServerName example.com 
-            AllowOverride All +      WSGIScriptAlias / /home/www/example/app.py 
-            Require all granted +      <Directory /> 
-          </Directory> +        AllowOverride All 
-        </VirtualHost>      +        Require all granted 
-     +      </Directory> 
 +    </VirtualHost>      
 +    ``` 
     L'avantage de cette méthode avec `mod_wsgi` est que **c'est Apache** qui va s'occuper tout seul de lancer le script Python et il n'y a **plus besoin** à la main de démarrer le script .py et de s'arranger pour qu'il tourne continuellement (donc plus besoin de `nohup` ou `screen` comme dans l'exemple précédent).     L'avantage de cette méthode avec `mod_wsgi` est que **c'est Apache** qui va s'occuper tout seul de lancer le script Python et il n'y a **plus besoin** à la main de démarrer le script .py et de s'arranger pour qu'il tourne continuellement (donc plus besoin de `nohup` ou `screen` comme dans l'exemple précédent).
          
-    Par contre, en testant `mod_wsgi` je suis tombé sur plein de problèmes: `import module` qui ne marche pas alors qu'il est [dans le même répertoire](https://stackoverflow.com/questions/59088010/wsgi-importerror-no-module-named-hello-module-in-the-same-directory-of-the-ma), des [Fatal Python error: PyEval_AcquireThread: NULL new thread state](https://stackoverflow.com/questions/18013356/fatal-python-error-pyeval-acquirethread) dans les logs Apache, etc. Bref, pas top.+    Par contre, en testant `mod_wsgi` je suis tombé sur quelques problèmes: `import module` qui ne marche pas alors qu'il est [dans le même répertoire](https://stackoverflow.com/questions/59088010/wsgi-importerror-no-module-named-hello-module-in-the-same-directory-of-the-ma), des [Fatal Python error: PyEval_AcquireThread: NULL new thread state](https://stackoverflow.com/questions/18013356/fatal-python-error-pyeval-acquirethread) dans les logs Apache, etc. Bref, à voir à l'usage.
  
 ## Javascript ## Javascript
Ligne 180: Ligne 201:
  
 ## A voir (divers) ## A voir (divers)
 +
 +### A lire...
 +
 +Pour bien voir la différence CGI / FastCGI / mod_wsgi / mod_python:
 +
 +https://www.electricmonk.nl/docs/apache_fastcgi_python/apache_fastcgi_python.html
 +
  
 ### Comparaison de performance mod_php vs. mod_python ### Comparaison de performance mod_php vs. mod_python
programmation_serveur_php_python_nodejs.1589832523.txt.gz · Dernière modification : 2020/05/18 20:08 de joseph