Modules Apache2
Modules Apache2
Modules Apache2
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
a2enmod ssl
systemctl restart apache2
a2enmod rewrite
<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>
mkdir /var/www/html/docredirect
cd /var/www/html/docredirect
mkdir certificate
cd certificate
a- on génère la clé privée:
c- on signe le certificat
openssl x509 -signkey key.pem -in cert.csr -req -days 365 -out cert.pem
/etc/hosts
127.0.0.1 www.rtn.sn
Resultat
—---------------------------------------------------------------------
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
a2enmod cgid
On redemarre apache2
NB: il faut remarquer que les scripts cgi doivent etre placés dans le dossier /usr/lib/cgi-bin
#!/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 teste
http://localhost/cgi-bin/test.py
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
Etape 1: on se place dans le dossier des scripts cgi d’apache2 qui est /usr/lib/cgi-bin#
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
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
<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>
prenom = form.getvalue('prenom')
nom = form.getvalue('nom')
numcompte = form.getvalue('numcompte')
code = form.getvalue('code')
solde = form.getvalue('solde')
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>")
http://localhost/cgi-bin/crud.py?prenom=Babadi&nom=Ndiaye&numcompte=1009&code=999
9&solde=2500000
fig: apres validation
#!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
Exercice1
Installer le client http avancé postman et exécuter les 2 scripts python
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
#!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
"Insertion reussie"
(apache2) root@alain-VirtualBox:/usr/lib/cgi-bin#
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
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()
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
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())
[[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#
#!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()))
<class 'list'>
on constate que le résultat est une liste qu’on va parcourir pour récupérer les
enregistrements
response = requests.get('http://localhost/cgi-bin/lecturejson.py')
liste1=response.json()
#print(type(response.json()))
on teste
#!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>")
Objectif
Cacher la véritable url de notre application finale
on resemarre apache2
# 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
/etc/hosts
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