Modules Apache2

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 24

Consolidation de la connaissance du protocole

HTTP et de la programmation python


Par Prof. Samuel OUYA

Prérequis:
Pour être à l’aise dans cette série de TP, on devriez:
● vous rappeler des formats des requêtes et
réponses HTTP
● vous rappeler des verbes ou méthodes HTTP que
sont GET,POST,PUT,DELETE,PATCH
● vous rappeler des types de variables en python tels
que : liste,tuple,dictionnaire ainsi que les différentes
méthodes pour les manipuler ou les parcourir
● les 3 étapes de génération des clés de sécurité et
certificat ssl que sont: génération de clé
privée,génération de demande de certificat et la
signature du certificat
● vous rappeler des 2 paramètres d’apache2
permettant de préciser le chemin de sa clé privée et
le chemin de son certificat de sécurité x509
● vous rappeler comment on cree un compte sur le
SGBD mysql et lui donner des droits sur une base
de données
● vous rappeler que pour voir la liste des méthodes
d’un module python , on l’importe dans l'interpréteur
python3 de commande et on fait dir(nommodule)
Partie I: redirection http vers https

Objectif:
Faire en sorte que si un utilisateur veut accéder à notre site par http on le redirige vers https
pour des raisons de sécurité

Prérequis:
● installer apache2 ce n’est pas encore le cas
● Activer le module ssl d'apache 2
● Activer le module de réecriture d’url d’apache2
ce qui donne:
# apt install apache2
#a2enmod ssl
# systemctl restart apache2

# a2enmod rewrite
#systemctl restart apache2

apt install apache2

a2enmod ssl
systemctl restart apache2

a2enmod rewrite

On cree le fichier de config du site dans /etc/apache2/sites-available par exemple


siteredirect.conf

<VirtualHost *:80>
ServerName www.rtn.sn
Redirect permanent / https://www.rtn.sn/
ServerAdmin [email protected]
DocumentRoot /var/www/html/docredirect

</virtualhost>
<VirtualHost *:443>
ServerName www.rtn.sn
ServerAdmin [email protected]
DocumentRoot /var/www/html/docredirect
SSLEngine on
SSLCertificateFile /etc/apache2/certificate/cert.pem
SSLCertificateKeyFile /etc/apache2/certificate/key.pem
</VirtualHost>

on cree le dossier du site:

mkdir /var/www/html/docredirect

On installe openssl et on genere la clé et le certificat du serveur:

cd /var/www/html/docredirect

mkdir certificate
cd certificate
a- on génère la clé privée:

openssl genrsa -out key.pem


b- on genere la demande
openssl req -new -key key.pem -out cert.csr

on répond évidemment aux questions

c- on signe le certificat

openssl x509 -signkey key.pem -in cert.csr -req -days 365 -out cert.pem

puis saisir le mot de passe généré lors de la génération de demande de certificat

root@alain-VirtualBox:/home/alain/progpython# a2ensite siteredirect.conf


Enabling site siteredirect.
To activate the new configuration, you need to run:
systemctl reload apache2
root@alain-VirtualBox:/home/alain/progpython# systemctl reload apache2

N’ayant pas de serveur DNS, on peut tester

/etc/hosts
127.0.0.1 www.rtn.sn

Resultat

Quand on va sur http://www.rtn.sn on est redirigé vers https://lwww.rtn.sn

—---------------------------------------------------------------------

Partie II: apache2 et cgid python

Objectif
Faire exécuter à apache des scripts écrits en python pour avoir une application web

Prérequis
● Activer le module cgid d’apache et redémarrer apache2

on active le module cgid

a2enmod cgid

On redemarre apache2

systemctl restart apache2

NB: il faut remarquer que les scripts cgi doivent etre placés dans le dossier /usr/lib/cgi-bin

On cree le premier cgi

oot@alain-VirtualBox:/home/alain/progpython# nano /usr/lib/cgi-bin/test.py

#!/usr/bin/python3
print('Content-Type: text/html')
print('')
chaine="<html><body> <table
border='1px'><tr><td>Prenom</td><td>Nom</td></tr><tr><td>Mbaye</td><td>Ndiaye</td>
</tr><tr><td>Ismaela</td><td>Fall</td></tr></table></body></html>"
print(chaine)

on rend test.py executable


chmod 755 /usr/lib/cgi-bin/test.py

On teste

http://localhost/cgi-bin/test.py

fig: génération automatique de code html avec la balise table

Commentaire:
la ligne print(“”) après la ligne de l'entête est importante pour séparer l'entête des messages
http des corps

Partie III: Utilisation de l’environnement python et gestion de formulaire dans un


script cgi python avec apache2

NB: pour pouvoir creer un environnement virtuel python, on installe


python3.8-venv

apt install python3.8-venv

Etape 1: on se place dans le dossier des scripts cgi d’apache2 qui est /usr/lib/cgi-bin#

# python3 -m venv apache2


NB: apache2 est le nom que nous avons donné à notre environnement python

fig: Contenu de l’environnement virtuel apache2 ainsi que le contenu du sous-repertoire bin

Pour utiliser l’environnement apache2, on mettra sur la première ligne de notre script

#!apache2/bin/python3

Exemple de mise en oeuvre

On suppose que vous avez cree une base de données dsti2 avec lable client:
Fig: connexion de l’utilisateur bouki avec le mot de passe passer

fig: table client de la base dsti2c

On crée notre formulaire formcreate.html ans /var/www/html/formcreate.html


# nano /var/www/html/docredirect/formcreation.html

<html>
<head>
<title>Creation de comptes</title>
</head>
<body>
<form name="pyform" method="POST" action="/cgi-bin/crud.py">
Prenom: <input type="text" name="prenom"><br>
Nom: <input type="text" name="nom"><br>
Numcompte: <input type="text" name="numcompte"><br>
Code: <input type="text" name="code"><br>
Solde:<input type="text" name="solde"><br>
<input type="submit" value="Valider">
</form>
</body>
</html>

Algo de récupération d’un formulaire dans un script python

etape 1: on importe les module cgi

etape2: on recupere le formulaire dans une variable par l formule


form=cgi.FieldStorage()

puis on peut extraire les différents champs du formulaire par:

prenom = form.getvalue('prenom')
nom = form.getvalue('nom')
numcompte = form.getvalue('numcompte')
code = form.getvalue('code')
solde = form.getvalue('solde')

etape3: on crée l’entete des messages http

etape4: on cree le corps du message http

exemple
root@alain-VirtualBox:/usr/lib/cgi-bin# nano crud.py
#!apache2/bin/python3
import cgi
import pymysql

def database():
global conn,cursor
conn=pymysql.connect(host="localhost",user='bouki', passwd='passer',
database='dsti2c')
cursor=conn.cursor()

def inserer(prenom,nom,numcompte,code,solde):
sql="insert into client(prenom,nom,numcompte,code,solde) values (%s, %s, %s,
%s,%s)"
database()
val=(prenom,nom,numcompte,code,solde)
cursor.execute(sql,val)
conn.commit()

form = cgi.FieldStorage()
prenom = form.getvalue('prenom')
nom = form.getvalue('nom')
numcompte = form.getvalue('numcompte')
code = form.getvalue('code')
solde = form.getvalue('solde')

inserer(prenom,nom,numcompte,code,solde)

print( "Content-type:text/html\r\n\r\n")
print ("<html>")
print ("<head>")
print ("<title>Hello - Second CGI Program</title>")
print ("</head>")
print ("<body>")
print("Insertion réussie")
print("</body>")
print("</html>")

Utilisation d’un cgi via un client http

http://localhost/cgi-bin/crud.py?prenom=Babadi&nom=Ndiaye&numcompte=1009&code=999
9&solde=2500000
fig: apres validation

fig: insertion de babadi dans la base

Utilisation du script cgi avec le client http avancé curl

Pour cela, on installe d’abord le client http avancé curl

#apt install curl

puis on uttilise curl pour creer le compte de Nasry


curl -X GET
"http://localhost/cgi-bin/crud.py?prenom=Nasry&nom=Hamadi&code=8888&numcompte=10
08&solde=127850"

Résultats dans la base de données

fig: insertion reussie de nasry via curl avec la methode GET

Exécution du script crud.py via le formulaire html

fig: creation de compte alphonse via formulaire


fig: resultat d’insertion d’alphonse

On passe au programme lecture.py qui va se connecter à la base de données dsti2c,


recuperer tous les enregistrements de la table client puis cree dynamiquement un tableau
html pour afficher les enregistrements

root@alain-VirtualBox:/usr/lib/cgi-bin# nano lecture.py

#!apache2/bin/python3
import pymysql
print("Content-Type: text/html")
print()
print("<html><head><title>Comptes</title></head>")
print("<body>")
connection = pymysql.connect(host="localhost",user='bouki', passwd='passer',
database='dsti2c')
cursor = connection.cursor()
cursor.execute("SELECT * from client")
print('<table border="1px">')
print("<tr><td>Prenom</td><td>Nom</td><td>Code</td><td>Numcompte</td><td>Solde</t
d></tr>")
for row in cursor.fetchall():
print(f"<tr><td>{row[1]}</td><td>{row[2]}</td><td>{row[3]}</td><td>{row[4]}</td><td>{
row[5]}</td></tr>")
print ("</table>")
print ("</body></html>")
connection.close()
On rend le script executable

chmod 755 lecture.py


On execute le script cgi dans le navigateur

fig: affichage de lecture

Exercice1
Installer le client http avancé postman et exécuter les 2 scripts python

Partie IV: transformons les 2 derniers scripts en API REST

Une règle fondamentale d’api rest est que les données


échangés entre les entités doivent au format json

Pour cela, copions crud.py en creation.py

puis on entre dans notre environnement virtuel

source apache2/bin/activate
on installe le module jsonify de prison en compte de format json
(apache2) root@alain-VirtualBox:/usr/lib/cgi-bin# pip3 install jsonify

on modifie le code de creation pour adapter l’entete en json

#!apache2/bin/python3
import cgi,json
import pymysql

def database():
global conn,cursor
conn=pymysql.connect(host="localhost",user='bouki', passwd='passer',
database='dsti2c')
cursor=conn.cursor()

def inserer(prenom,nom,numcompte,code,solde):
sql="insert into client(prenom,nom,numcompte,code,solde) values (%s, %s, %s,
%s,%s)"
database()
val=(prenom,nom,numcompte,code,solde)
cursor.execute(sql,val)
conn.commit()

form = cgi.FieldStorage()
prenom = form.getvalue('prenom')
nom = form.getvalue('nom')
numcompte = form.getvalue('numcompte')
code = form.getvalue('code')
solde = form.getvalue('solde')
inserer(prenom,nom,numcompte,code,solde)

print( "Content-type:application/json\r\n\r\n")
print(json.dumps("Insertion reussie"))
Test

apache2) root@alain-VirtualBox:/usr/lib/cgi-bin# curl -X GET


"http://localhost/cgi-bin/creation.py?prenom=Nelson&nom=Mandela&numcompte=1011&cod
e=1110&solde=19900000"

"Insertion reussie"
(apache2) root@alain-VirtualBox:/usr/lib/cgi-bin#

fig: resultat mandela

Dans un navigateur

http://localhost/cgi-bin/creation.py?prenom=Frederic&nom=Declerk&numcompte=1012&cod
e=1002&solde=1600000

resultat
fig: le navigateur comprend que le resultat est du json

copions lecture.py en lecturejson.py pour renvoyer juste les enregistrements de la table


client sous forme de json

contenu de lecturejson.py

#!apache2/bin/python3
import pymysql,json
print("Content-Type: application/json")
print()
connection = pymysql.connect(host="localhost",user='bouki', passwd='passer',
database='dsti2c')
cursor = connection.cursor()
cursor.execute("SELECT * from client")
print(json.dumps(cursor.fetchall()))d></tr>")
connection.close()

on teste dans un navigateur


fig: resultat de lecturejson

Créons une vue en python qui récupère les données via lecturejson.py les parcours et
affiche les resultats sous forme de tableau

On commence par installer le module requests permettant de faire de requete http


(apache2) root@alain-VirtualBox:/usr/lib/cgi-bin# pip3 install requests

code de frontendlecturejson.py

#!apache2/bin/python3
import requests,json
print( "Content-type:text/html\r\n\r\n")

response = requests.get('http://localhost/cgi-bin/lecturejson.py')
print(response.json())

Test avec curl


apache2) root@alain-VirtualBox:/usr/lib/cgi-bin# curl -X GET
"http://localhost/cgi-bin/frontendlecturejson.py"

[[1, 'Ibrahima', 'Fall', '1111', '1001', '75000000'], [2, 'Mandicou', 'Ba', '2222', '1002',
'25000000'], [4, 'Gervais', 'Mendy', '4444', '1004', '2000000'], [5, 'Alain', 'Ouya', '5555', '1005',
'500000'], [6, 'Boris', 'Ouya', '6666', '1006', '7000000'], [7, 'exode', 'Volbac1', '7777', '1007',
'1500000'], [8, 'Babadi', 'Ndiaye', '9999', '1009', '2500000'], [9, 'Nasry', 'Hamadi', '8888',
'1008', '127850'], [10, 'Alphonse', 'Sow', '2022', '10222', '4800000'], [11, 'Nelson', 'Mandela',
'1110', '1011', '19900000'], [12, 'Nelson', 'Mandela', '1110', '1011', '19900000'], [13, 'Nelson',
'Mandela', '1110', '1011', '19900000'], [14, 'Nelson', 'Mandela', '1110', '1011', '19900000'], [15,
'Nelson', 'Mandela', '1110', '1011', '19900000'], [16, 'Nelson', 'Mandela', '1110', '1011',
'19900000'], [17, 'Frederic', 'Declerk', '1002', '1012', '1600000']]
(apache2) root@alain-VirtualBox:/usr/lib/cgi-bin#

Modifions le code de frontendlecturejson.py comme suit:

#!apache2/bin/python3
import requests,json
print( "Content-type:text/html\r\n\r\n")

response = requests.get('http://localhost/cgi-bin/lecturejson.py')
#print(response.json())
print(type(response.json()))

on execute avec curl

apache2) root@alain-VirtualBox:/usr/lib/cgi-bin# curl -X GET


"http://localhost/cgi-bin/frontendlecturejson.py"

<class 'list'>

on constate que le résultat est une liste qu’on va parcourir pour récupérer les
enregistrements

Modifions le code de fontendlecturejson.py


#!apache2/bin/python3
import requests,json
print( "Content-type:text/html\r\n\r\n")

response = requests.get('http://localhost/cgi-bin/lecturejson.py')
liste1=response.json()
#print(type(response.json()))

for ligne in liste1:


print(ligne)

on teste

fig: parcours du résultat ligne par ligne

Modifions encore le code frontendlecturejson.py pour afficher les enregistrements sous


forme de tableau

#!apache2/bin/python3
import requests,json
print( "Content-type:text/html\r\n\r\n")

response = requests.get('http://localhost/cgi-bin/lecturejson.py')
liste1=response.json()
#print(type(response.json()))
print('<table border="1px">')
print("<tr><td>Prenom</td><td>Nom</td><td>Code</td><td>Numcompte</td><td>Solde</t
d></tr>")
for ligne in liste1:

print(f"<tr><td>{ligne[1]}</td><td>{ligne[2]}</td><td>{ligne[3]}</td><td>{ligne[4]}</td><td>{lig
ne[5]}</td></tr>")

print ("</table>")
print ("</body></html>")

Testons dans un navigateur

fig: resultat de frontendlecture.py

Partie V: frontal apache2 via proxy et proxyreverse

Objectif
Cacher la véritable url de notre application finale

on active les 2 modules proxy et proxy_http


apache2) root@alain-VirtualBox:/usr/lib/cgi-bin# a2enmod proxy proxy_http

on resemarre apache2

(apache2) root@alain-VirtualBox:/usr/lib/cgi-bin# systemctl restart apache2

on cree un site virtuel proxyfrontend.conf

# nano /etc/apache2/sites-available/proxyfrontend.conf

<VirtualHost *:80>
ServerName frontend.ec2lt.sn
ProxyPass / http://127.0.0.1/cgi-bin/frontendlecturejson.py/
ProxyPassReverse / http://127.0.0.1/cgi-bin/frontendlecturejson.py/
ProxyRequests Off
</VirtualHost>

On active le site

apache2) root@alain-VirtualBox:/usr/lib/cgi-bin# a2ensite proxyfrontend.conf

On recharge la configuration d’apache2

systemctl reload apache2

On fait la correspondance entre 127.0.0.1 et le nom frontend.ec2lt.sn

pour cela, on edite le fichier

/etc/hosts

127.0.0.1 localhost frontend.ec2lt.sn

On teste dans un navigateur


fig: resultat proxy frontend

Conclusion
La personne qui utilise notre frontend en passant par l’url frontend.ec2lt.sn ne sait
pas dans quel langage nous avons développé notre frontend

Tableau de quelques modules python utilisés dans cette série de TP


Nom module python installation commentaire

json integré par json.dumps(objet) permet


de convertir en json
json.loads(varjson) convertit
du json en liste

requests pip3 install requests on peut utiliser


requests.verbe(url) pour
faire des requetes selon les
verbes http
exemple
response =
requests.get('http://localhost
/cgi-bin/lecturejson.py')
liste1=response.json()
liste1 est le resultat renvoyé
sous format json ou liste
on a; requests.post()
requests.put()
resuests.delete()
cgi installé par defaut dans permet de recuperer les
python formulaites en utilisant
cgi.FieldStorage()

pymysql pip3 install pymysql permet de manipuler une


base de type mysql dans un
programme en python

Tableau de quelques modules d’apache2


nom activation commentaire1
mod_auth_ a2enmod permet de
basic mod_auth_basic protéger
l'accès à une
partie d’un
site web
rewrite a2enmod rewrite Permet de
faire de
redirection
http
proxy et a2enmod proxy permet de
proxy_http proxy_http faire de proxy
et
proxyreverse
pour proteger
un site
ssl a2enmod sll permet
d’activer https

Vous aimerez peut-être aussi