• Aucun résultat trouvé

Serveurs et environnements de développement. Serveur Web

N/A
N/A
Protected

Academic year: 2022

Partager "Serveurs et environnements de développement. Serveur Web"

Copied!
22
0
0

Texte intégral

(1)

Serveurs et environnements 1

A. Obaid © - Programmation web avancée (INF3005)

Serveurs et environnements de développement

Serveur Web

•  Serveur web:

•  Système sur lequel s'exécute un serveur HTTP (HTTPd)

•  Logiciel HTTP lui-même (HTTPd)

•  Sert des données Hypermédia :

•  Texte, HTML, Images, Audio, Vidéo

(2)

Serveurs et environnements 3

A. Obaid © - Programmation web avancée (INF3005)

Serveurs HTTP

•  Il en existe plusieurs. Les plus utilisés sont :

•  Apache HTTP Server (

http://www.apache.org/)

•  Internet Information Services (IIS) de Microsoft

•  Sun Java System Web Server de Sun Microsystems

•  Zeus Web Server (

http://www.zeus.com/)

•  Lighttpd (

http://www.lighttpd.net/)

•  Mongrel écrit en Ruby

•  Tomcat de Apache offre un conteneur de servlets

•  Pour une comparaison, voir le site :

•  http://en.wikipedia.org/wiki/Comparison_of_web_servers

Serveurs et Langages

•  Les serveurs sont écrits en divers langages :

•  C: Apache, Zeus Web Server, lighttpd

•  C# : IIS

•  Java : Tomcat

•  Ruby : Mongrel

•  ..

(3)

Serveurs et environnements 5

A. Obaid © - Programmation web avancée (INF3005)

Types de serveurs

•  Serveur HTTP normal

•  Proxy

•   Met en cache mémoire des pages demandées pour usages ultérieurs

•  Peut modifier les requêtes et les réponses et qu'il voit

•  Passerelle :

•  Serveur intermédiaire qui traduit les protocoles d'accès au web (exemple WAP)

•  Tunnel:

•  Permet de dissimuler les requêtes et les réponses

Serveur Apache

•  Apache Software Foundation

•  Le serveur du Web le plus populaire.

•  Logiciel libre sous licence Apache.

•  Fonctionnalités:

•  Interprète PHP, Ruby, Perl, Python

•  Serveur proxy,

•  CGI

•  …

(4)

Serveurs et environnements 7

A. Obaid © - Programmation web avancée (INF3005)

Serveur Apache

•  Serveur optimisé

•  La gestion des appels des clients se fait par

•  Pre-froking – Historiquement:

•  Prépare des processus à l'avance

•  Threads : processus à la demande du client

•  Peut fonctionner en tant que serveur Proxy

P1 P2

C1

HTTPd

P3 P4 … C2

S

Pre-forking HTTPd

Threads

S

C1 C2

T hre ad 1 T hre ad 2

Fichiers de configuration

•  Quelques répertoires importants:

•  cgi-bin/ - Répertoire des scripts CGI

•  conf/ - fichiers de configuration du serveur

•  htdocs/ - répertoire principal des documents web

•  logs/ - fichiers Log

•  Dans le conf/ on trouve:

•  access.conf – configuration des accès

•  httpd.conf – configuration du serveur

•  mime.types – définition des types MIME.

•  srm.conf - configuration des ressources

(5)

Serveurs et environnements 9

A. Obaid © - Programmation web avancée (INF3005)

Éléments de configuration (httpd.conf)

•  ServerType :

•  Type de serveur ( standalone ou inted)

•  Port :

•  Numéro de port (ex. 80)

•  User:

•  usager HTTP (ex. webadmin)

•  Group:

•  groupe de l'usager HTTP (ex. web)

•  ServerAdmin:

•  Courriel du webadmin (ex. abdel.obaid@uqam.ca)

Éléments de configuration (httpd.conf - src.conf)

•  ServerRoot:

•  Où se trouve le serveur (ex. /home/httpd/)

•  ErrorLog :

•  Où se trouve le fichier Log (ex. /home/httpd/logs/error_log)

•  PidFile :

•  fichier qui contient l'identificateur du processus (PID) HTTPd (ex. /home/httpd/logs/httpd.pid)

•  Autre directives:

•  Keep Alive,

•  Proxy

•  Cache

•  Virtual Servers, ...

(6)

Serveurs et environnements 11

A. Obaid © - Programmation web avancée (INF3005)

Éléments de configuration (httpd.conf – src.conf)

•  DocumentRoot

•  Répertoire de stockage des pages web

•  Exemple: /home/httpd/htdocs/

•  UserDir :

•  Répertoire des stockage des pages personnelles des usagers (ex. public_html)

•  Permet d'utiliser l'URL personnelle (ex. www.info.uqam.ca/

~obaid/doc1.html)

•  DirectoryIndex:

•  Nom de la page d'accueil

•  Exemple: index.html

Éléments de configration (httpd.conf – src.conf)

•  AccessFileName:

•  Fichier de contrôle d'accès avec authentification:

•  Exemple: .htaccess

•  DefaultType :

•  Type par défaut des documents

•  Exemple: text/plain

•  ScriptAlias:

•  Alias pour appeler un programme CGI.

•  Exemple: /cgi-bin/ /home/httpd/cgi-bin/

•  ...

(7)

Serveurs et environnements 13

A. Obaid © - Programmation web avancée (INF3005)

Éléments de configration httpd.conf (access.conf)

•  Définit les services autorisés:

<Directory "/usr/local/opt/apache/htdocs">

Options Indexes FollowSymLinks AllowOverride None

</Directory>

<Directory /home/*/public_html>

AllowOverride FileInfo AuthConfig Limit Indexes

Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec <Limit GET POST OPTIONS >

Order allow,deny Allow from all </Limit>

<LimitExcept GET POST OPTIONS PROPFIND>

Order deny,allow Deny from all </LimitExcept>

</Directory>

DirectoryIndex index.html index.html.var index.php index.htm welcome.html AccessFileName .htaccess

DefaultType text/plain

ScriptAlias /cgi-bin/ "/usr/local/opt/apache-2.0.63/cgi-bin/"

Contrôle des accès

•  La commande htpasswd crée un fichier de mots de passe (ici appelé .htpasswd) s'il n'existe pas:

htpasswd –c .htpasswd INF3005 >>> On entre un mot de passe.

•  On peut aussi créer un groupe d'accès

(8)

Serveurs et environnements 15

A. Obaid © - Programmation web avancée (INF3005)

Serveurs virtuels

•  Un serveur peut avoir plusieurs noms de domaine (au lieu d'avoir plusieurs ports)

•  Exemple: le même serveur pour www.xyz.com et www.zyx.com

•   Configuration dans httpd.conf avec:

<VirtualHost hostname> … </VirtualHost>

•   Chacun des serveurs virtuels aura son propre contenu

Serveurs virtuels

<VirtualHost *:80>

ServerAdmin lanthier.stephanie@uqam.ca DocumentRoot "/usr/local/opt/apache-2.0.63/htdocs"

ServerName accueil.labunix.uqam.ca ErrorLog /var/log/web_gdst_error.log

</VirtualHost>

<VirtualHost *:80>

ServerAdmin lanthier.stephanie@uqam.ca DocumentRoot "/usagers/autau/public_html"

ServerName oto.uqam.ca ErrorLog /var/log/web_oto.log

</VirtualHost>

(9)

Serveurs et environnements 17

A. Obaid © - Programmation web avancée (INF3005)

Mesures de performance

•  Pour les fournisseurs de contenu

•   Test d'utilisation

•  Problèmes de performance

•  Pour les fournisseurs d'accès

•  Évaluation des proxys

•  Pour les développeurs

•   Performance des protocoles (TCP, DNS, HTTP…)

Techniques de mesure

•  Fichiers logs du serveur

•  Fichiers logs des caches dans les proxys

•  Fichiers logs des navigateurs

•  Analyseurs de paquets

(10)

Serveurs et environnements 19

A. Obaid © - Programmation web avancée (INF3005)

Fichier logs des serveurs

•  Log des accès au serveur:

•  client, date, requête, état, nombre d'octets envoyés

•  Outils d'analyse des fichiers log:

http://en.wikipedia.org/wiki/Web_analytics

132.208.132.124 - - [22/Jan/2010:12:06:35 -0500] "GET / HTTP/1.1" 200 1505

132.208.132.124 - - [22/Jan/2010:12:06:35 -0500] "GET /apache_pb.gif HTTP/1.1" 200 2326 132.208.132.124 - - [22/Jan/2010:12:06:35 -0500] "GET /favicon.ico HTTP/1.1" 404 326 132.208.132.124 - - [22/Jan/2010:15:17:44 -0500] "\x16\x03\x01" 501 335

132.208.132.124 - - [22/Jan/2010:15:20:21 -0500] "GET / HTTP/1.1" 304 -

132.208.132.124 - - [22/Jan/2010:15:20:21 -0500] "GET /apache_pb.gif HTTP/1.1" 304 - 132.208.132.124 - - [22/Jan/2010:15:20:22 -0500] "GET /manual/ HTTP/1.1" 200 757

/usr/local/opt/apache-2.0.63/logs/access_log

CGI

•  On doit configurer le serveur pour CGI:

•  ScriptAlias /cgi-bin/ /home/httpd/cgi-bin/

•  Les fichiers dans ce répertoire doivent être exécutables.

•  Attention aux trous de sécurité:

•  Valider les données de l'usager

•  Les programmes ne doivent pas pouvoir être générés dynamiquement

•  …

(11)

Serveurs et environnements 21

A. Obaid © - Programmation web avancée (INF3005)

Modèle avec CGI

HTTPD

Variables d ’environnment

CGI Programme/

Script

stdin/stdout

QUERY_STRING CONTENT_TYPE REMOTE_ADDR

...

Navigateur

Utilisation des formulaires

•  Les formulaires sont définis avec la balise:

<FORM NAME="nom" ACTION="URL" METHOD="Méthode">

....

</FORM>

•  L'URL désigne le programme qui va traiter les données du formulaire. Méthode est GET (défaut) ou POST.

•  Les données du formulaire sont traitées par une

ressource externe au serveur (ex. CGI, servlet, php,…)

(12)

Serveurs et environnements 23

A. Obaid © - Programmation web avancée (INF3005)

Passage de données

•  Pour la méthode GET , les données sont attachées à la fin de l'URL

•  ? sépare les données de l' URL

•  Les programmes CGI sont invoqués avec l'adresse de type:

http://site/cgi-bin/programme?donnees

•   Dans la page HTML , on déclare le formulaire comme suit:

<FORM METHOD=”get” ACTION=”/cgi-bin/programme”>

… <input type="submit" />

</FORM>

Passage de données

•  La méthode POST est recommandée pour le traitement des formulaires.

•  Dans la page HTML, on déclare le formulaire comme suit:

<FORM METHOD=”POST” ACTION=”/cgi-bin/programme”>

<input type="submit" />

(13)

Serveurs et environnements 25

A. Obaid © - Programmation web avancée (INF3005)

Codage de données

•  Les données sont codées avant d'être

envoyées au serveur selon un codage appelé URLEncoding:

•  Les espaces sont codés +

•  Les caractères spéciaux sont replacés par leurs codes hexadécimal (ISO-9991-1 par exemple) précédés du signe %

•  Exemple: "Étienne Fabergé Lancôme" est codé

"%C9tienne+Faberg%E9+Lanc%F4me"

Passage de données (Méthode POST)

•  Lorsque l'usager soumet le formulaire (en appuyant due le bouton submit) le navigateur contactera le serveur en lui passant la requête (POST /cgi-bin/programme) avec les données du formulaire. Celles-ci suivront l'URL en tant que document.

•  Elles font partie du corps de la requête

•  Pour passer les données au programme CGI, le serveur

utilise le fichier stdin (Standard Input).

(14)

Serveurs et environnements 27

A. Obaid © - Programmation web avancée (INF3005)

Passage de données (Méthode POST)

•  Le serveur exécute le programme CGI en fournissant:

•   Une liste variables d'environnement

•  Un stream de données du formulaire sous forme d'une suite de paires nom=valeur séparées par &

•  nom1=valeur1&nom2=valeur2&nom3=valeur3…

•  Le script connaît la taille du strem en consultant le variable d'environnement CONTENT_LENGTH

Traitement des données (Méthode POST)

•  Le programme exécuter les étapes suivantes:

1.  Lire les données du fichier stdin

2.  Séparer les paires nom=valeur et faire les

conversions (notamment des espaces) nécessaires

3.  Traiter les données

4.  Imprimer le résultat dans un format HTML sur le

fichier stdout

(15)

Serveurs et environnements 29

A. Obaid © - Programmation web avancée (INF3005)

Retour des résultats (Méthodes GET et POST)

•  Le programme est responsable

•  D'imprimer le résultat sur le fichier standard de sortie vers le serveur (stdout).

•  Celui-ci est connecté au serveur HTTP.

•  Il est aussi responsable de générer les en-têtes appropriés de la réponse HTTP et les envoyer dans les premières lignes:

Content-type: text/plain

>>> UNE LIGNE VIDE !

Soumission des données de formulaires

  Dans l'élément :

<FORM action="URL" Method="GET | POST " >

</FORM>

–  action: l'adresse de la ressource qui va traiter les données du formulaire.

–  method: la méthode utilisée pour envoyer le contenu du formulaire:

 

GET: les données sont rajoutées à l'URL spécifiée par l'attribut action lors de l'envoi de la requête au serveur.

 

POST: les données du formulaire sont incluses dans le corps de la

requête lors de l'envoi vers l'adresse spécifiées par l'attribut action.

(16)

Serveurs et environnements 31

A. Obaid © - Programmation web avancée (INF3005)

Transport des données du formulaire

GET URL HTTP/1.1

…En-têtes

… Ligne vide

…Corps de la requête

… Ligne vide

POST URL HTTP/1.1

…En-têtes

… Ligne vide

…Corps de la requête

… Ligne vide

Données

du formulaire

De: A. Obaid CP 8888, Suc. Centre ville H3C 3P8, Montréal, QC, Canada

A: Bob Lajoie 17, Rue de la paix Parix, Cedex, 2000, France

Message: Quand viendrez- vous nous voir ?

Message: Quand viendrez- vous nous voir ? De: A. Obaid CP 8888, Suc. Centre ville H3C 3P8, Montréal, QC, Canada

A: Bob Lajoie 17, Rue de la paix Parix, Cedex, 2000, France

Transport des données du formulaire

  Les noms des éléments du formulaire et les valeurs soumises sont présentrérs au serveur selon la forme

–  nom=valeur et séparés par &.

–  Sans oublier les champs cachés !

  Exemple: Dans le cas de GET, l'URL soumis sera :

–  http://www.google.com/Search?

champNom=Obaid&champPrenom=Abdel&champLangue=Fr&cha mpLangage=Cplus&champLangage=Java

<form name="job" method="get" action="http://www.google.com/Search">

Nom: <input type="text" name="champNom" ><br>

Prénom: <input type="text" name="champPrenom" ><br>

<input type="radio" name="champLangue" value="Fr" > Francais<br>

<input type="radio" name="champLangue" value="Eng" > Anglais<br>

<input type="checkbox" name="champLangage" value="Cplus" > C++<br>

formulaireTest.html

(17)

Serveurs et environnements 33

A. Obaid © - Programmation web avancée (INF3005)

Transport des données du formulaire

  Dans le cas de POST, le corps de la requête soumise contiendra :

champNom=Obaid&champPrenom=Abdel&champLangue=Fr&champ Langage=Cplus&champLangage=Java

POST http://www.google.com/Search HTTP/1.0 User-Agent: Mozilla/3.5

Content-Type: application/x-www-form-urlencoded Content-Length: 32

champNom=Obaid&champPrenom=Abdel&

champLangue=Fr&champLangage=Cplus&champLangage=Java

Variables de CGI

•  CONTENT_LENGTH

•  CONTENT_TYPE

•  DOCUMENT_ROOT

•  PATH_INFO

•  PATH_TRANSLATED

•  QUERY_STRING

•  REMOTE_ADDR

•  REMOTE_HOST

•  REMOTE_USER

• 

•  SCRIPT_NAME

•  SERVER_NAME

•  SERVER_PORT

•  SERVER_PROTOCOL

•  SERVER_SOFTWARE

•  …

(18)

Serveurs et environnements 35

A. Obaid © - Programmation web avancée (INF3005)

Variables de CGI

•  DOCUMENT_ROOT: Répertoire racine du serveur

•  HTTP_COOKIE : Cookies du visiteur

•  HTTP_HOST : Site de la page demandée

•  HTTP_REFERER: URL de la page qui a appelé le lien

•  HTTP_USER_AGENT : Type de navigateur utilisé.

•  QUERY_STRING : Chaine contenant les données de la requête (cas de GET)

•  REMOTE_ADDR : Adresse IP du client

•  REMOTE_HOST : Nom de la machine du visiteur

Variables de CGI

•  REMOTE_PORT: Port du visiteur

•  REMOTE_USER : Nom d'usager du visiteur (dans .htaccess)

•  REQUEST_METHOD: GET ou POST

•  REQUEST_URI : URI de la requête

•  SCRIPT_FILENAME: Nom complet du fichier du programme CGI

•  SCRIPT_NAME: Nom du fichier du programme CGI

•  SERVER_ADMIN: Courriel de l'administrateur du site

•  SERVER_NAME : Nom de domaine de du serveur

• 

(19)

Serveurs et environnements 37

A. Obaid © - Programmation web avancée (INF3005)

Fonctionnement du CGI

Browser

POST

Write environnement

Execute

Read environnement Standart Input

Page HTML

Standart output

Serveur Submit

Programme

Exemple simple

#!/bin/sh

echo Content-type: text/html echo

echo "<html>"

echo "<br>"

echo "<h1> Variables CGI </h1>"

echo "<br>"

echo SERVER_NAME = $SERVER_NAME echo "<br>"

echo QUERY_STRING = $QUERY_STRING echo "<br>"

echo PATH_INFO = $PATH_INFO echo REMOTE_HOST = $REMOTE_HOST echo "<br>"

echo REMOTE_ADDR = $REMOTE_ADDR echo "<br>"

echo REMOTE_USER = $REMOTE_USER echo "<br>"

echo CONTENT_LENGTH= $CONTENT_LENGTH

http://www.info2.uqam.ca/

~obaid/cgi-bin/variablesCGI.cgi

•  Imprime les variable CGI

(20)

Serveurs et environnements 39

A. Obaid © - Programmation web avancée (INF3005)

/* exemple CGI GET Fichier: multi.c */

#include <stdio.h>

#include <stdlib.h>

int main(void) {

char *data;

long m,n;

printf("%s%c%c\n", "Content-Type:text/html;charset=iso-8859-1",13,10);

printf("<TITLE>Résultat de la multiplication</TITLE>\n");

printf("<H3>Résultat de la multiplication</H3>\n");

data = getenv("QUERY_STRING");

if(data == NULL)

printf("<P>Err! Passage de paramètres du formulaire au script erroné.");

else

if(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2)

printf("<P>Error! Donnée saisie invalide. Donnée doit être numérique.");

else

printf("<P>Le produit de %ld et %ld is %ld.",m,n,m*n);

return 0;

}

<FORM ACTION="http://zeta.labunix.uqam.ca/~obaid/cgi-bin/multi.cgi""> <P>

Donnez les nombres a multiplier:

<INPUT NAME="m" SIZE="5" />

<INPUT NAME="n" SIZE="5" /><BR />

<INPUT TYPE="SUBMIT" VALUE="Multiple!" />

</FORM>

Exemple 2 : Méthode GET

http://www.info2.uqam.ca/~obaid/form_mult_get.html

cc multi.c –o multi.cgi

Exemple 2: GET/POST

<FORM ACTION="/cgi-bin/collect.cgi" METHOD="POST">

<P>Entrez vos donnees (80 cars. max.):<BR>

<INPUT NAME="data" SIZE="60" MAXLENGTH="80"><BR>

<INPUT TYPE="SUBMIT" VALUE="Send">

</FORM>

•  Le programmes contient une procédure qui permet de restituer le texte envoyé sur forme URLencode():

•  Hello ! est envoyé comme «data=Hello %21»

•  void unencode(char *src, char *last, char *dest)

(21)

Serveurs et environnements 41

A. Obaid © - Programmation web avancée (INF3005)

/* exemple CGI POST*/

#include <stdio.h>

#include <stdlib.h>

#define MAXLEN 80

#define EXTRA 5

/* 4 pour le champ nammé "data", 1 pour "=" */

#define MAXINPUT MAXLEN+EXTRA+2 /* 2 pour ce qui est ajouté par le browser */

#define DATAFILE "../data/data.txt"

void unencode(char *src, char *last, char *dest) { for(; src != last; src++, dest++)

if(*src == '+') *dest = ' ';

else if(*src == '%') { int code;

if(sscanf(src+1, "%2x", &code) != 1) code = '?'; /* inconnu */

*dest = code;

src +=2;

}else *dest = *src;

*dest = '\n'; *++dest = '\0';

}

Exemple 2 : Méthode POST

<FORM ACTION="http://zeta.labunix.uqam.ca/~obaid/cgi-bin/multi_post.cgi""> <P>

Donnez les nombres a multiplier:

<INPUT NAME="m" SIZE="5" />

<INPUT NAME="n" SIZE="5" /><BR />

<INPUT TYPE="SUBMIT" VALUE="Multiple!" />

</FORM>

http://www.info2.uqam.ca/~obaid/form_mult_post.html

cc multi_post.c -o multi_post.cgi

int main(void) { char *lenstr;

char input[MAXINPUT], data[MAXINPUT];

long len;

printf("%s%c%c\n", "Content-Type:text/html;charset=iso-8859-1",13,10);

printf("<TITLE>Reponse</TITLE>\n");

lenstr = getenv("CONTENT_LENGTH");

if(lenstr == NULL || sscanf(lenstr,"%ld",&len)!=1 || len > MAXLEN) printf("<P>Erreur d’invocation </p>");

else { FILE *f;

fgets(input, len+1, stdin);

unencode(input+EXTRA, input+len, data);

f = fopen(DATAFILE, "a");

if(f == NULL)

printf("<P> Desole !.");

else

fputs(data, f);

fclose(f);

printf("<P>Fait ! <BR>%s",data);

} return 0;

Exemple 2 : Méthode POST

(22)

Serveurs et environnements 43

A. Obaid © - Programmation web avancée (INF3005)

Problèmes avec les CGI

•  Pour chacune des requêtes reçues le serveur WEB doit :

•  Créer un nouveau processus

•  Charger et interpréter un script

•  Exécuter le script

•  Fermer le processus et fermer le tout.

•  Devient un problème quand le trafic est important

Références

Documents relatifs

9 Utiliser toujours la méthode HTTP GET pour récupérer une information et pas la méthode

Afin de réaliser ce contrôle il faut créer un formulaire dans la page HTML et récupérer les données de la page HTML grâce à un requête POST qui permet de renvoyer des données

Langages côté serveur Bases de données Frameworks Aspects

Langages côté serveur Bases de données Frameworks Aspects pratiques.. Comment se faire héberger un

− Un pré processeur logique de gestion des servlets (sous forme d’un service Internet) destinée à connecter au service HTTPD permettant de générer les documents HTML

Or cette configuration manuelle peut être fastidieuse pour un nombre important de périphériques car pour chaque machine il faut entrer manuellement l'adresse IPv4, le masque

Vous allez modifier dans chaque serveur WEB /var/www/html/index.html (on principe on doit mettre le même contenu web dans les 2 deux serveurs comme ça lorsque l’un des deux tombe

 Vous pouvez maintenant accéder à l’interface de statistiques de HaProxy via l’addresse: http://adresse_ip_lb1/stats avec le login/password