====== Client et serveur web ======
===== Définitions =====
{{ :nsi:premiere:client-server-small.png?direct&400 |}}
//Exemple :// sur ma tablette, je consulte Wikipedia, j'envoie ma demande vers ''wikipdia.fr''.
* Au lieu de //demande//, on parle de //requête//.
* Ma tablette est le **client**.
* La machine qui répondra à ma demande est le **serveur**.
Plusieurs serveurs interviendront dans une telle requête :
* Un serveur DNS pour trouver l'IP de ''wikipedia.fr''
* Un serveur sert de point d'entrée sur le réseau local où est hébergé ''wikipedia.fr''. Sur ce réseau local, plusieurs machines et plusieurs serveurs concourent à faire fonctionner le site.
===== Déroulement d'une requête =====
- Sur le client, l'utilisateur utilise un navigateur web et consulte une page,\\ il clique sur un lien vers ''%%http://wiki.goupill.fr?id=nsi:start%%''
- Le navigateur met à jour la barre d'adresse.
- ''wiki.goupill.fr'' est identifiée comme les **nom de domaine et sous-domaine**. Une requête vers le serveur DNS est lancée pour connaître l'adresse IP correspondante.
- Le DNS répond ''51.91.105.102''.
- Le client envoie donc un paquet vers ''51.91.105.102'' en précisant qu'il demande ''wiki.goupill.fr?id=nsi:start'' selon le protocole ''http''.
- Le paquet est transmis au serveur par tout le réseau IP.
- Le serveur, constamment à l'écoute, reçoit le paquet et l'ouvre.
- Le serveur interprète en détails l'adresse demandée et en particulier il tient compte de ''id=nsi:start''. Il détermine la réponse qu'il doit faire.
- La réponse est une page web. Elle peut venir d'un fichier existant sur le serveur ou plus souvent, elle est fabriquée automatiquement sur demande en rassemblant différents éléments.
- Le fichier correspondant à la page est empaqueté et renvoyé au client sur le réseau IP.
- Le client est en attente de la réponse. Il reçoit le paquet et l'ouvre.
- Le fichier reçu est transmis au navigateur. Comme il s'agit d'un page web, le navigateur sait la prendre en charge et il l'affiche.
===== Côté client =====
Pour rester simple, côté client, il n'y a que le **navigateur web**.
{{ :nsi:premiere:navigateurs.png?direct&600 |}}
Comme on le verra plus loin, l'utilisation de [[nsi:langages:js:start|JavaScript]] peut avoir une grande importance côté client et changer la nature des échanges client - serveur.
===== Côté serveur =====
==== Ports logiciels ====
Le système d'exploitation met à disposition des **ports logiciels**. On peut les penser comme des prises virtuelles. ''http'' est par défaut branché sur le port ''80'' et ''https'' sur le port ''443''.
On peut configurer le serveur pour qu'il écoute sur le port ''5000'', //par exemple//, et alors l'adresse pour atteindre le serveur et être entendu de lui serait ''%%http://wiki.goupill.fr:5000?id=nsi:start%%''.
==== Serveur http / https ====
Une machine ordinaire comme un ordinateur de bureau n'est //a priori// pas un serveur web. Qu'est-ce qui fait qu'une machine devient un serveur web ?
Il faut installer sur la machine un logiciel dont le rôle est de **se mettre à l'écoute** sur un certain port (80 pour http) pour **capter les requêtes** http et y répondre. Une fois que ce logiciel est installé, il faut bien sûr du contenu web pour que le serveur ait quelque chose à répondre aux requêtes.
On trouve deux logiciels principaux :
* [[https://www.apache.org/|Apache]]. De très nombreux serveur internet sont appelés des serveurs **LAMP**. Le nom vient des logiciels installés :
* Linux : système d'exploitation,
* Apache : serveur web,
* MySQL : base de données,
* [[:langages:PHP|PHP]] : langage de programmation
* [[http://nginx.org/en/|nginx]]. De plus en plus à la mode, tend à prendre l'avantage sur Apache parce que beaucoup plus léger et performant.
Un serveur web commercial sera une machine faite pour supporter de nombreuses connexions, être alimentée tout le temps... Mais un simple portable ou même un [[https://www.raspberrypi.org/|raspberry pi]] peut être un serveur web car **c'est le logiciel installé qui fait le serveur**.
==== Fonctionnement normal du serveur http ====
Par exemple, le serveur reçoit la requête ''%%http://nom.de.domaine/page%%''.
Son fonctionnement le plus ordinaire sera alors :
* Le serveur extrait le morceau suivant le nom de domaine : ''/page''
* Le serveur cherche l'existence d'un fichier ''/page.html''
* Si ce fichier existe, il est renvoyé comme réponse à la requête.
* Si ce fichier n'existe pas, le serveur renvoie le contenu d'un fichier ''404.html'' car ''404'' est le code d'erreur utilisé dans le cas d'une page qui n'existe pas.
==== Autre fonctionnement ====
On est libre de programmer / configurer le serveur comme on le souhaite.
Exemple : à la réception de la requête ''%%http://nom.de.domaine/page%%'', le serveur fabrique un contenu ''html'' automatiquement. Il y place
* un flux d'information provenant de France-info,
* une prévision météo venant de Météo-France,
* un contenu aléatoire pris sur Wikipedia...
En fabriquant sa page, le serveur est d'ailleurs libre d'utiliser ses propres données et/ou de demander des données à d'autres serveurs. C'est d'ailleurs ce que font les serveurs Google : suite à une recherche, ils produisent des pages contenant des liens vers d'autres sites et des publicités hébergées par d'autres serveurs...
==== Requêtes multiples ====
Le navigateur peut lancer **plusieurs requêtes pour une même page**.
**exemple :** vous affichez le fichier ''truc.html'' contenant la balise ''%%
%%'' et automatiquement lancer une requête pour obtenir le fichier image et l'afficher à l'endroit voulu.
Naturellement, le navigateur fait de même pour toutes les autres images et les nombreux fichiers pouvant intervenir dans une page (scripts, images, feuilles de styles, favicon...)