# Serveurs WEB

<!-- https://www.brandcrowd.com/logo-design/details/121920 -->
<small>Jérome Cosandey // jerome.cosandey@epfl.ch // 2019-10-11</small>
----
## Un serveur web, c'est quoi?
* <span>Matériel → Machine utilisée pour héberger et publier des sites web<!-- .element: class="fragment" data-fragment-index="1" --></span>
* <span>Logiciel → Programme utilisé sur le serveur pour executer les requêtes HTTP<!-- .element: class="fragment" data-fragment-index="2" --></span>
Note:
Un serveur web est un serveur utilisé pour héberger et publier des sites web sur internet ou un intranet
L'expression "serveur web" est également utilisée pour désigner le logiciel utilisé sur le serveur pour executer les requêtes HTTP
**La fonction principale d'un serveur Web est de stocker et délivrer des pages web qui sont généralement écrites en HTML. Le protocole de communication Hypertext Transfer Protocol (HTTP) permet de dialoguer avec le logiciel client, généralement un navigateur web.**
----
## HTTP ?
**HTTP** signifie **Hypertext Transfer Protocol** et suit la [RFC 2616](https://tools.ietf.org/html/rfc2616).
> The Hypertext Transfer Protocol (HTTP) is an application-level
protocol for distributed, collaborative, hypermedia information
systems.
Note:
Les requests for comments (RFC), littéralement « demande de commentaires », sont une série numérotée de documents officiels décrivant les aspects et spécifications techniques de l'Internet, ou de différents matériels informatiques (routeurs, serveur DHCP).
----
## Qui sont-ils ?
* <span>[IIS](https://www.iis.net/) → Windows<!-- .element: class="fragment" data-fragment-index="1" --></span>
* <span>[Apache](https://httpd.apache.org/) → Multi-plateform<!-- .element: class="fragment" data-fragment-index="2" --></span>
* <span>[NGINX](https://nginx.org/) → Multi-plateform<!-- .element: class="fragment" data-fragment-index="3" --></span>
* <span>Build-in (python, php, ...)<!-- .element: class="fragment" data-fragment-index="4" --></span>
* <span>[et plein d'autres...](https://en.wikipedia.org/wiki/Comparison_of_web_server_software)<!-- .element: class="fragment" data-fragment-index="5" --></span>
  
----
## Ports par défaut ?
* <span>**80** = HTTP<!-- .element: class="fragment" data-fragment-index="1" --></span>
* <span>**443** = HTTPS<!-- .element: class="fragment" data-fragment-index="2" --></span>
----
## En résumé
**Les serveurs web permettent le dialogue client-server avec le protocol HTTP.**
---
# Les requêtes HTTP
1. <span>Ligne de requête<!-- .element: class="fragment" data-fragment-index="1" --></span>
1. <span>Header de la requête<!-- .element: class="fragment" data-fragment-index="2" --></span>
1. <span>Corps de la requête<!-- .element: class="fragment" data-fragment-index="3" --></span>
Note:
Une requête HTTP est un ensemble de lignes envoyées par le navigateur au serveur. Elle comprend :
Une ligne de requête: précisant la méthode qui doit être appliquée, le path et la version du protocole utilisée. La ligne comprend deux éléments devant être séparés par un espace :
* La méthode
* Le path
* La version du protocole utilisé par le client (généralement HTTP/1.0)
Les champs d'en-tête de la requête: il s'agit d'un ensemble de lignes facultatives permettant de donner des informations supplémentaires sur la requête et/ou le client (Navigateur, système d'exploitation, ...). Chacune de ces lignes est composée d'un nom qualifiant le type d'en-tête, suivi de deux points (:) et de la valeur de l'en-tête.
Le corps de la requête: c'est un ensemble de lignes optionnelles devant être séparées des lignes précédentes par une ligne vide et permettant par exemple un envoi de données par une commande POST lors de l'envoi de données au serveur par un formulaire.
----
## Exemple de requête
`curl -v https://www.commentcamarche.net` :
```HTTP
> GET / HTTP/1.1
> Host: www.commentcamarche.net
> User-Agent: curl/7.58.0
> Accept: */*
```
----
## Les méthodes HTTP
> HTTP définit un ensemble de méthodes de requête qui indiquent l'action que l'on souhaite réaliser sur la ressource indiquée.
----
### Les méthodes HTTP
Les plus courantes sont <span>[GET](https://developer.mozilla.org/fr/docs/Web/HTTP/M%C3%A9thode/GET) et<!-- .element: class="fragment" data-fragment-index="1" --></span> <span>[POST](https://developer.mozilla.org/fr/docs/Web/HTTP/M%C3%A9thode/POST).<!-- .element: class="fragment" data-fragment-index="2" --></span>
----
### Les méthodes HTTP
Les autres sont
[HEAD](https://developer.mozilla.org/fr/docs/Web/HTTP/Methods/HEAD) (uniquement l'en-tête), [PUT](https://developer.mozilla.org/fr/docs/Web/HTTP/Methods/PUT) (remplace la ressource), [DELETE](https://developer.mozilla.org/fr/docs/Web/HTTP/Methods/DELETE) (supprime la ressource), [CONNECT](https://developer.mozilla.org/fr/docs/Web/HTTP/Methods/CONNECT) (tunnel), [OPTIONS](https://developer.mozilla.org/fr/docs/Web/HTTP/Methods/OPTIONS) (décrire les options), [TRACE](https://developer.mozilla.org/fr/docs/Web/HTTP/Methods/TRACE) (test aller/retour) et [PATCH](https://developer.mozilla.org/fr/docs/Web/HTTP/Methods/PATCH) (application partielle).
Note:
https://developer.mozilla.org/fr/docs/Web/HTTP/M%C3%A9thode
---
# Les réponses HTTP
1. <span>Ligne de statut<!-- .element: class="fragment" data-fragment-index="1" --></span>
1. <span>Headers de la réponse<!-- .element: class="fragment" data-fragment-index="2" --></span>
1. <span>Corps de la réponse<!-- .element: class="fragment" data-fragment-index="3" --></span>
----
## Exemple de réponse
`curl -I https://www.commentcamarche.net` :
```HTTP
HTTP/1.1 200 OK
Accept-Ranges: bytes
Connection: Upgrade, Keep-Alive
Content-Encoding: gzip
Content-Length: 163
Content-Type: text/html
Date: Tue, 08 Oct 2019 09:19:17 GMT
ETag: "cc-5344555136fe9-gzip"
Keep-Alive: timeout=2, max=100
Last-Modified: Thu, 02 Jun 2016 06:01:08 GMT
Server: Apache
Upgrade: h2
Vary: Accept-Encoding
<html>... REQUEST BODY ...<html>
```
----
## Les statuts HTTP
https://httpstatuses.com/
* **1××** → Informational
* **2××** → Success
* **3××** → Redirection
* **4××** → Client Error
* **5××** → Server Error
---
# Schéma de fonctionnement
----
## Exemple de requête simple

https://book.varnish-software.com/4.0/chapters/HTTP.html
----
## Exemple de redirection

https://developer.mozilla.org/en-US/docs/Web/HTTP/Redirections
----
## Exemple de requête avec cache

https://book.varnish-software.com/4.0/chapters/HTTP.html
---
# Statistiques
Utilisation des différents serveurs sur le web...
----
## netcraft

<small>source: [netcraft.com](https://news.netcraft.com/archives/2019/08/15/august-2019-web-server-survey.html)</small>
----
## w3techs

<small>source: [w3techs.com](https://w3techs.com/technologies/overview/web_server/all)</small>
----
## Résumé
Les graphiques montrent qu'Apache est de moins en moins utilisé en faveur d'autres serveurs comme NGINX.
---
# Comparaison
----
## Apache
* <span>S'installe sous forme de paquetage<!-- .element: class="fragment" data-fragment-index="1" --></span>
* <span>Se configure avec des fichiers ".conf"<!-- .element: class="fragment" data-fragment-index="2" --></span>
* <span>Possibilité de créer des "VirtualHosts"<!-- .element: class="fragment" data-fragment-index="3" --></span>
* <span>Sous Linux, se gère au moyen de service et/ou de la commande "apache2ctl"<!-- .element: class="fragment" data-fragment-index="4" --></span>
----
## NGINX
* <span>S'installe aussi sous forme de paquetage<!-- .element: class="fragment" data-fragment-index="1" --></span>
* <span>Se configure avec des fichiers ".conf"<!-- .element: class="fragment" data-fragment-index="2" --></span>
* <span>Possibilité de créer des "server blocks"<!-- .element: class="fragment" data-fragment-index="3" --></span>
* <span>Sous Linux, se gère au moyen de service/systemctl<!-- .element: class="fragment" data-fragment-index="4" --></span>
----
## Built-in
* Python 2.7: `python -m SimpleHTTPServer 8000`
* Python 3: `python -m http.server 8001`
* PHP: `php -S localhost:8002`
* NodeJS: `npx serve`
Note:
Des autres serveurs "build-in" existent pour d'autres logiciels, par exemple WEBrick pour ruby. La plupart des ces serveurs internes ne sont pas fait pour la PRODUCTION mais pour des fins de DEVELOPPEMENT.
---
# Synthèse
* Tous les jours on accède de manière invisible à des serveurs web, pour la quasi totalité des activités que nous faisons sur internet nous avons affaire à des serveurs web.
----
# Pour mieux comprendre
* https://developer.mozilla.org/fr/docs/Web/HTTP/Aper%C3%A7u
* https://developer.mozilla.org/fr/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
----
## Fin
* Questions ?
{"metaMigratedAt":"2023-06-15T00:35:35.636Z","metaMigratedFrom":"YAML","title":"Présentation serveurs HTTP","breaks":true,"slideOptions":"{\"theme\":\"black\",\"transition\":\"fade\",\"spotlight\":{\"enabled\":true}}","contributors":"[{\"id\":\"15e97034-fba0-4fd9-a32d-9c5eb1dd654d\",\"add\":7369,\"del\":2675},{\"id\":\"98cf1d10-5049-49ca-9160-3f2e67fc1067\",\"add\":9472,\"del\":4761}]"}