Comment Fonctionne Un Site Internet ?
Et comment créer le vôtre en un rien de temps.
Dans cet article didactique nous allons comprendre le fonctionnement d’un site internet et apprendre à en monter un le plus simplement possible sur un système Linux. Dans une démarche basse-technologie, nous cherchons à minimiser la complexité de l’infrastructure technologique qui nous entoure – le principe est simple : les seules technologies durables sont celles que nous sommes en mesure de comprendre.
Prérequis :
- Quelques connaissances basiques en informatique
- Quelques connaissances dans les systèmes Linux : utilisation d’un terminal, savoir (dés)installer des packets, contrôle d’accès des fichiers, etc.
- Ressources utiles à cet effet :
- Introduction to Linux – A Hands on Guide, Machtelt Garrels, The Linux Documentation Project : https://tldp.org/guides.html#intro-linux
- Unix and Linux System Administration Handbook, Evi Nemeth et al., Prentice Hall Press
- Ressources utiles à cet effet :
Matériel nécessaire et prérequis :
- Vieil ordinateur ou Raspberry Pi (fera office de serveur)
- Une box internet
- De l’électricité
- Acheter un nom de domaine chez un registraire, comme Gandi ou OVH (aucun hébergement requis)
Logiciels nécessaires :
- Système d’exploitation GNU/Linux (comme Debian) ou UNIX (comme FreeBSD) ;
- La distribution Linux n’a pas grande importance, et logiquement le processus devrait marcher aussi sur FreeBSD1 ; si vous hésitez, prenez Debian ;
- Serveur web, actif en permanence, comme NGINX ;
- (Optionnel) Générateur de site statique, comme Hugo2 ou saait.3
La langue des oiseaux numériques
Esquissons tout d’abord à gros traits les principes de communication entre les machines.
Pour communiquer, les machines sont identifiées par une adresse IP précise. Le format des messages est défini selon un protocole identifié – le plus souvent le TCP/IP – et elles les destinent à un “port” précis. On formate généralement les adresses selon la syntaxe suivante : [IP]:[PORT]
, p. ex. 135.75.94.206:8888
.
Certains ports ont des fonctions qui leurs sont officiellement attribuées : p. ex. les ports 80 et 443 sont réservés aux serveurs internet et sont utilisés par les connexions HTTP et HTTPS respectivement. Ainsi, lorsqu’on entre une adresse web dans un navigateur, celui-ci interroge en fait les ports 80 et 443 du serveur rattaché au nom de domaine du site : ouvrir la page d’accueil de monsite.com
revient à envoyer une requête HTTP “GET” à l’adresse IP du serveur correspondant (p. ex. 135.75.94.206
) sur les ports 80 et 443. D’autres programmes utilisent d’autres ports pour communiquer : BitTorrent utilise les ports 6881 à 6889 pour envoyer des fichiers, SSH (qui permet de se connecter à distance à une machine) le port 22, etc.
Qui répond à ces messages, et comment ?
C’est le logiciel de serveur web qui répond aux requêtes reçues, le plus souvent sur les ports 80 et 443 donc, la plupart du temps en envoyant des pages HTML en retour. Ainsi une connexion sur monsite.com
va envoyer une requête à 135.75.94.206:80
, et le serveur web de la machine (comme Apache, NGINX ou lighttpd) va répondre en envoyant la page index.html
.
Mise en place de votre serveur
Passons maintenant à la pratique.
Vous pouvez récupérer un exemple de site rudimentaire avec quelques fichiers de configuration ici : téléchargez les fichiers.
NGINX
NGINX est un des systèmes de serveur les plus utilisés au monde. La syntaxe de ses fichiers de configuration est très accessible, proche de celle du C. Vous pouvez facilement l’installer depuis n’importe quelle distribution Linux ou UNIX.
Dans un premier temps, il faut s’assurer que votre serveur reste actif en permanence. Sur la plupart des systèmes Linux, c’est systemd
via la commande systemctl
qui gère l’exécution des processus d’arrière-plan ; sur FreeBSD c’est service
.
Les commandes suivantes active puis lance le processus d’arrière-plan sur Debian et Ubuntu :
$ sudo systemctl enable nginx.service
$ sudo systemctl start nginx.service
À chaque changement de configuration, il faudra redémarrer le programme :
$ sudo nginx -s reload
Configuration
Tout d’abord, on range les pages HTML dans un dossier précis et identifié, p. ex. /var/www/html
(répertoire classique des sites web sur les systèmes d’exploitation Linux). La configuration NGINX suivante permet de “servir” un site sur le port 80 dont les pages se situent dans votre répertoire racine :
# Configuration nginx à placer dans /etc/nginx/nginx.conf
http {
server {
listen 80;
listen [::]:80;
server_name _;
# Répertoire des pages du site
root /var/www/html;
# Page par défaut
index index.html;
error_page 404 = /404.html;
}
}
À noter que certaines distributions Linux (comme Ubuntu), répartissent des sous-configurations dans les dossiers /etc/nginx/sites-enabled/
ou /etc/nginx/conf.d/
– dans ce cas seul les blocs server {...}
, insérés avec la directive include ...
, sont écrits dans ces fichiers, tandis le bloc http {...}
reste dans /etc/nginx/nginx.conf
.
# /etc/nginx/nginx.conf
http {
...
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
# /etc/nginx/conf.d/monsite.com.conf
server {
...
}
Comme on le devine facilement, ce serveur “écoute” ici sur le port 80, c’est-à-dire pour des connexions HTTP uniquement – et non HTTPS. Cela signifie que les échanges entre les visiteurs et votre serveur ne sont pas encryptés. Dans l’absolu ce n’est pas forcément un grave problème mais les navigateurs modernes se méfient désormais de toute connexion qui n’est pas sécurisée. On évoquera plus loin un moyen de contourner ce manquement.
Pour faciliter votre travail sur les pages du site, on prendra soin d’affecter au dossier racine les bonnes autorisations (remplacez [utilisateur]
par votre nom d’utilisateur) avant d’y copier le contenu du site :
$ sudo chown -R [utilisateur] /var/www/html/
$ chmod -R ug+r /var/www/html/
$ cp -r monsite/racine/* /var/www/html/
Exemple d’organisation sommaire du répertoire racine d’un site :
$ tree /var/www/html
/var/www/html/
├── 404.html
├── blog
│ └── 2024
│ ├── encore-mon-article
│ │ └── index.html
│ └── mon-article
│ └── index.html
├── index.html
└── style.css
Une fois nginx
lancé (ou relancé), une simple connexion à localhost
(qui correspond à l’adresse IP de la machine actuel) devrait afficher la page index.html
présente dans le répertoire.
Votre site est désormais en ligne… sur le réseau local uniquement. Une tablette connectée en wi-fi au même réseau doit pouvoir afficher votre site internet en passant par l’adresse IP local de l’ordinateur qui nous sert de serveur.
Plonger dans le grand bain
Nous allons maintenant relier votre petite machine aux vastes contrées de l’internet mondial. Pour ce faire, un point sur le fonctionnement des réseaux s’impose.
Les adresses IP des machines sont attribuées par le routeur qui se charge de nous connecter à internet – si vous avez une box internet, votre routeur est tout simplement votre box.
Dans le contexte du grand bain international, votre réseau est identifié par l’adresse IP de votre routeur.
Dans le contexte d’un réseau local, chaque machine se voit assigner une adresse IP locale par le routeur. Ainsi, il est attribué une adresse IP locale à votre téléphone et à votre ordinateur s’ils utilisent la connexion de votre box. Par convention, ces adresses respectent systématiquement le format 192.168.X.X
, où les deux derniers nombres sont compris entre 0 et 255.
$ ip addr | grep "inet "
inet 127.0.0.1/8 scope host lo
inet 192.168.1.20/24 metric 100...
127.0.0.1
et localhost
sont équivalents. 192.168.1.20
est ici l’adresse IP de la machine sur le réseau local. ifconfig
est une alternative à ip addr
si cette dernière commande n’est pas disponible.
Ces adresses peuvent cependant changer à mesure que les machines se connectent et se déconnectent du réseau – ce sont des adresses IP dites “dynamiques”. Dans le cas d’un serveur, il faut faire en sorte que l’adresse IP reste fixe et identifiable.
Par défaut, les ports 80 et 443 sont évidemment fermés. Mettre en place un serveur revient tout simplement à créer une passerelle, passant par un port précis, depuis votre routeur, et son adresse IP publique, vers votre serveur, et son adresse IP local.
On peut généralement accéder à l’interface de gestion de votre routeur en pointant votre navigateur sur l’adresse local 192.168.1.1
. Elle nous permet :
- l’identification de l’adresse IP de votre routeur sur le réseau étendu (p. ex.
28.172.9.132
) ;- peut être aussi identifiée avec la commande :
curl https://ipinfo.io/ip
;
- peut être aussi identifiée avec la commande :
- la configuration d’une adresse IP fixe pour votre serveur (p. ex.
192.168.1.20
) ; - la configuration d’un transfert des requêtes du réseau étendu vers le réseau local, par les ports 80 et 443 (p. ex.
28.172.9.132:80
vers192.168.1.20:80
, idem pour le port 443).
Avec ces ajustement votre serveur devient accessible depuis l’internet mondial.
On peut s’en assurer en tapant p. ex. http://28.172.9.132
dans un navigateur. À noter que https://28.172.9.132
ne fonctionnera pas car les requêtes HTTPS (qui passent par le port 443) nécessite une configuration supplémentaire.
Enfin, la touche finale : donnons un vrai nom à votre site internet.
Associer un nom de domaine à votre serveur
Ce sont les serveur DNS (Domain Name System) qui associent des noms intelligibles (p. ex. “monsite.com”) à des adresses IP précises, ou d’autres informations entre elles. Les “enregistrements DNS” définissent ces associations. Ils sont accessibles et modifiables pour tous les domaines dont vous êtes propriétaire, via l’interface de l’hébergeur web ou du registraire (p. ex. Gandi, OVH, LWS, etc.).
Pour associer un nom de domaine à votre adresse IP public exposée, on définit un paramètre A
(Adresse) comme suit lié au domaine principal (indiqué avec @
) :
@ IN A 92.154.113.89
On peut aussi créer des redirections de domaines, ce qui permet aussi de créer des sous-domaines. Ainsi, ajouter le paramètre CNAME
(Canonical NAME) suivant permet de rediriger www.monsite.com
vers monsite.com
:
www IN CNAME monsite.com.
Attention : le point final est important dans cette ligne de configuration.
Ces deux lignes suffisent à rendre accessible votre serveur depuis l’adresse “(www.)monsite.com”. Si vous avez suivi les étapes correctement, alors à l’heure où vous lisez ces mots, vous êtes devenu un webmaistre.
Les générateurs de site statique
Pour faciliter la production des pages qui composent un site, il existe des générateurs de sites statiques : les pages sont générés selon des modèles précis et l’arborescence des fichiers est créée automatiquement. Un des plus connus – et selon l’auteur de ces pages le meilleur – est Hugo.2
Une alternative plus élémentaire existe avec saait
3, de l’inénarrable collectif d’autistes Suckless.4
Ces sites sont dits “statiques” car ils n’exposent que des pages “prêtes à l’emploi”, en HTML “pur”, contrairement à la plupart des sites modernes qui utilisent PHP, Python ou d’autres langages de programmation pour générer des pages “à la demande” dont le contenu doit (logiquement) varier régulièrement – p. ex. la page d’accueil d’un important site d’actualités (comme Le Figaro, https://lefigaro.fr) ou d’une encyclopédie collaborative (comme Wikipédia, https://fr.wikipedia.org/wiki/Wikipédia:Accueil_principal). Ce système permet également de déployer des solutions d’hébergement unifiées (la plus populaire étant Wordpress) qui s’adapte au contenu qu’y injecte chaque utilisateur.
Mais cette donne complexifie et alourdit considérablement le processus de création d’un site. Dans une démarche basse-technologie, nous cherchons à minimiser la complexité et à être en mesure de comprendre et concevoir nous-mêmes l’architecture de notre système. Les sites dynamiques, impliquant un nombre de dépendances et de requêtes pharamineux – entre autres responsables de l’alourdissement sans précédent de la page web moyenne5 – s’opposent par essence à cette disposition d’esprit.
Sécuriser votre site internet
Comme évoqué précédemment, permettre les connexions HTTPS sécurisées nécessite une configuration supplémentaire : il est nécessaire d’obtenir un certificat délivré par un organisme officiel, correspondant en fait à une clé publique. Pour ce faire il faut prouver être administrateur du serveur, p. ex. en plaçant un fichier particulier selon un chemin précis. Fort heureusement, le fantastique utilitaire certbot
6 nous décharge largement de cette tâche.
$ sudo certbot --nginx
Vous trouverez de plus amples informations sur le site officiel : https://certbot.eff.org/.
À noter qu’une autre option, plus simple techniquement mais (légèrement) plus complexe à mettre en œuvre, existe avec hitch
7 ou stunnel
8 qui créent pour ainsi dire un “pont de sécurisation”. Cette approche est recommandée par le collectif Suckless.9
Administration du serveur
Un nouveau pouvoir implique de nouvelles responsabilités…
Pour prévenir les problèmes susceptibles de survenir sur votre serveur, il faut comprendre quelques principes essentiels.
Premièrement, où trouver les messages d’erreur ? – Ils sont écrits, comme tous les autres messages des programmes d’une machine, dans les journaux système, généralement dans /var/log/
. Selon les systèmes d’exploitation, ils sont consultables avec journalctl
(systemd
) ou des utilitaires traditionnels (tail -f
, less
, etc.).
Où trouver les réponses à vos questions ? – Généralement dans les manpages (les manuels) des logiciels installés. Par ex. pour savoir comment marche NGINX, entrez : man nginx
.
Pour rechercher un mot-clé dans un en-tête de manuel, utilisez apropos
, p. ex. apropos web
.
Comment programmer des tâches ? – Pour programmer des tâches ponctuelles ou régulières, on utilise at
ou cron
(avec crontab -e
).
Les outils du webmaistre. – Enfin, voici une liste de programmes légers et performants permettant la surveillance d’un serveur : darkstat
, sar
, atop
, iftop
, iotop
et htop
.
Attribution de l’image de bandeau utilisée dans cet article : “Apple IIe Workstation Card”, ken fager (CC BY-NC-SA 2.0) : https://flickr.com/photos/kenfagerdotcom/3608542712/in/gallery-nicolibrarian-72157622696913339/
-
L’auteur de ces lignes recommande vivement FreeBSD à tous les gens qui aimeraient découvrir un système moins chaotique et au fonctionnement plus rigoureux que la plupart des distributions Linux. Le FreeBSD Handbook est une référence incontournable qui vous fera comprendre les rouages du système sans avoir besoin d’effectuer une seule recherche Google. ↩︎
-
“La page web moyenne fait désormais la taille du jeu vidéo Doom” — https://www.wired.com/2016/04/average-webpage-now-size-original-doom/ ↩︎