Serveurs et environnements de développement Serveurs et environnements 1 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 Serveurs et environnements 2 1 1
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 environnements 3 Serveurs et Langages Les serveurs sont écrits en divers langages : C: Apache, Zeus Web Server, lighttpd C# : IIS Java : Tomcat Ruby : Mongrel.. Serveurs et environnements 4 2 2
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 Serveurs et environnements 5 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 Serveurs et environnements 6 3 3
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 S HTTPd S HTTPd Thread 1 Thread 2 Pre-forking P1 P2 P3 P4 C1 Threads C2 C1 C2 Serveurs et environnements 7 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 Serveurs et environnements 8 4 4
É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) Serveurs et environnements 9 É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,... Serveurs et environnements 10 5 5
É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 Serveurs et environnements 11 É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/... Serveurs et environnements 12 6 6
É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/" Serveurs et environnements 13 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 Serveurs et environnements 14 7 7
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 et environnements 15 Serveurs virtuels <VirtualHost *:80> ServerAdmin DocumentRoot ServerName ErrorLog </VirtualHost> lanthier.stephanie@uqam.ca "/usr/local/opt/apache-2.0.63/htdocs" accueil.labunix.uqam.ca /var/log/web_gdst_error.log <VirtualHost *:80> ServerAdmin DocumentRoot ServerName ErrorLog </VirtualHost> lanthier.stephanie@uqam.ca "/usagers/autau/public_html" oto.uqam.ca /var/log/web_oto.log Serveurs et environnements 16 8 8
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) Serveurs et environnements 17 Techniques de mesure Fichiers logs du serveur Fichiers logs des caches dans les proxys Fichiers logs des navigateurs Analyseurs de paquets Serveurs et environnements 18 9 9
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 Serveurs et environnements 19 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 Serveurs et environnements 20 10 10
Modèle avec CGI Navigateur HTTPD QUERY_STRING CONTENT_TYPE REMOTE_ADDR... Variables d environnment CGI Programme/ Script stdin/stdout Serveurs et environnements 21 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,) Serveurs et environnements 22 11 11
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> Serveurs et environnements 23 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" /> </FORM> Serveurs et environnements 24 12 12
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" Serveurs et environnements 25 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). " Serveurs et environnements 26 13 13
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 Serveurs et environnements 27 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 Serveurs et environnements 28 14 14
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! Serveurs et environnements 29 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. Serveurs et environnements 30 15 15
Transport des données du formulaire Données du formulaire GET URL HTTP/1.1 En-têtes Ligne vide Corps de la requête Ligne vide 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 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 viendrezvous nous voir? POST URL HTTP/1.1 En-têtes Ligne vide Corps de la requête Ligne vide Message: Quand viendrezvous nous voir? Serveurs et environnements 31 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> formulairetest.html 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> <input type="checkbox" name="champlangage" value="java" > Java <br> Valider: <input type="submit" value="go"> </form> Serveurs et environnements 32 16 16
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 Serveurs et environnements 33 Variables de CGI CONTENT_LENGTH CONTENT_TYPE DOCUMENT_ROOT PATH_INFO PATH_TRANSLATED QUERY_STRING REMOTE_ADDR REMOTE_HOST REMOTE_USER REQUEST_METHOD SCRIPT_NAME SERVER_NAME SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE Serveurs et environnements 34 17 17
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 Serveurs et environnements 35 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 SERVER_PORT : Port du serveur SERVER_SOFTWARE: Logiciel serveur Serveurs et environnements 36 18 18
Fonctionnement du CGI Browser Serveur Submit POST Write environnement Execute Read environnement Programme Standart Input Page HTML Standart output Serveurs et environnements 37 Exemple simple Imprime les variable CGI http://www.info2.uqam.ca/ ~obaid/cgi-bin/variablescgi.cgi #!/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 echo "</html>" Serveurs et environnements 38 19 19
/* exemple CGI GET Fichier: multi.c */ #include <stdio.h> #include <stdlib.h> int main(void) { char *data; long m,n; Exemple 2 : Méthode GET <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> 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; } http://www.info2.uqam.ca/~obaid/form_mult_get.html cc multi.c o multi.cgi Serveurs et environnements 39 Exemple 2: GET/POST 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) <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> Serveurs et environnements 40 20 20
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!" /> /* exemple CGI POST*/ </FORM> #include <stdio.h> #include <stdlib.h> http://www.info2.uqam.ca/~obaid/form_mult_post.html #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; cc multi_post.c -o multi_post.cgi }else *dest = *src; *dest = '\n'; *++dest = '\0'; } Serveurs et environnements 41 Exemple 2 : Méthode POST 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; } Serveurs et environnements 42 21 21
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 Serveurs et environnements 43 22 22