Implémenter un serveur web Linux
Page mise à jour le 06-01-2026 à 23:21
A l'heure du très haut débit avec les offres fibre, il devient tout aussi intéressant qu'économique d'héberger soi-même ses sites Web.
Le DNS dynamique est peu coûteux, il fonctionne très bien et les box actuelles le gèrent parfaitement.
L'incontestable avantage est que vous disposerez d'un serveur dédié que vous pourrez configurer de A à Z dans la plus totale liberté.
Avant de commencer

Prérequis matériel
Serveur Intel Core i3 - RAM 2Go - HDD 500Go - Ethernet Gigabit
CDROM ou clé USB d’installation de la dernière version de Debian (la version utilisée ici est la 11.6.0 Bullseye)
Liaison Internet à haut débit (fibre fortement conseillée)

Conventions
Nous considérons que le réseau local est configuré comme suit :
ID réseau 192.168.1.0
Masque de sous-réseau 255.255.255.0
Adresse IP du routeur 192.168.1.1
Passerelle 192.168.1.1
Serveur DNS 192.168.1.1
Adresse IP du serveur Linux 192.168.1.254
Nom du serveur Linux web-server
Il vous appartient d'adapter ces paramètres selon votre environnement.

En ce qui concerne le nom de domaine public, nous prendrons pour exemple un abonnement DNS Dynamique chez No-IP.
Le routeur, ici une LiveBox 5, devrait donc être configuré d'une façon similaire à celle-ci :
Dans la partie NAT / PAT

Dans la partie DynDNS


Administration
Nous administrerons le serveur à distance et j'utilise pour cela un poste client Microsoft doté du sous-système Windows pour Linux.
Vous trouverez ici comment installer Debian sous Windows 10 ainsi que les deux excellents outils Windows Terminal et WinSCP.
(passez cette étape si vous préférez utiliser une autre méthode).
1 - Montage du serveur Debian

Bootez sur le support d’installation

Mode d'installation Graphical install
Choix de la langue Français / France
Interface réseau principale [l'interface gigabit généralement proposée par défaut]
Nom de machine web-server (1)
Domaine [laissez vide]
Mot de passe super utilisateur root [mot de passe root] (2)
Nom complet du nouvel utilisateur [votre nom complet]
Identifiant pour le compte utilisateur [votre nom d'utilisateur] (1)
Mot de passe pour le nouvel utilisateur [votre mot de passe] (2)
Méthode de partitionnement Assisté - utiliser un disque entier (3)
Schéma de partitionnement Tout dans une seule partition (4)
Faut-il analyser d’autres supports d’installation ? Non
Pays du miroir de l’archive Debian France
Miroir de l’archive Debian deb.debian.org
Mandataire http [laissez vide]
Souhaitez-vous participer à l’étude statistique sur l’utilisation des paquets ? Non
Logiciels à installer Aucun, décochez tout (5)

Retirez le support d’installation et redémarrez le serveur.
(1) Utilisez un nom court mais explicite, en minuscules et sans espaces.
(2) Créez des mots de passe robustes : 12 caractères minimum, majuscules, minuscules, chiffres et caractères spéciaux.
(3) Le disque sera intégralement effacé et alloué à Debian.
(4) Créez une seule partition, car en optant pour des partitions séparées la totalité de l'espace disponible serait réservé à /home.
     Or le répertoire HTTP se trouvera dans /var alors que /home restera inutilisé.
(5) Pas de bureau ni de logiciels, nous sommes sur un serveur et nous n'installons que le strict nécessaire.
2 - Configuration de base du serveur

Connectez-vous en local en tant que root

Installez les paquets requis pour la suite des opérations
apt-get update
apt-get -y install sudo
apt-get -y install wget
apt-get -y install openssh-server

Configurez SUDO pour votre compte d'utilisateur
nano /etc/sudoers
    # User privilege specification
    root ALL=(ALL :ALL) ALL
    <utilisateur> ALL=(ALL :ALL) ALL

Configurez TCP/IP
nano /etc/network/interfaces

  source /etc/network/interfaces.d/*

  # The loopback network interface
    auto lo
    iface lo inet loopback

   # The primary network interface
    allow-hotplug eno1
    auto eno1
    iface eno1 inet static
        address 192.168.1.254
        netmask 255.255.255.0
        gateway 192.168.1.1
        dns-nameservers 192.168.1.1

/etc/init.d/networking restart

Configurez SSH
nano /etc/ssh/sshd_config
    # Authentication:
    PermitRootLogin yes

systemctl restart sshd

Déconnectez-vous et redémarrez le serveur (facultatif mais conseillé)
exit
reboot
3 - Installation et configuration des services web

Il est plus pratique de poursuivre les opérations depuis un poste client.

Initiez une connexion SSH en tant que root depuis le poste client
ssh root@192.168.1.254

Installez Apache
apt-get -y install apache2

Installez PHP et ses extensions
apt-get -y install php
apt-get -y install php-gd
apt-get -y install php-cgi
apt-get -y install php-mysqli
apt-get -y install php-pear
apt-get -y install php-mbstring
apt-get -y install php-php-gettext
apt-get -y install php-common
apt-get -y install php-phpseclib
apt-get -y install php-mysql
apt-get -y install libapache2-mod-php

Installez MariaDB (version libre de MySQL)
apt-get -y install mariadb-server
apt-get -y install mariadb-client

Vérifiez le fonctionnement des services
systemctl status apache2
systemctl status mariadb

Configurez MySQL
mysql_secure_installation
  > Enter current password for root tapez Enter (le mot de passe est vide par défaut)
  > Switch to unix_socket authentication [Y/n] N
  > Set root password? [Y/n] Y (définissez le mot de passe pour root)
  > Remove anonymous users? [Y/n] Y
  > Disallow root login remotely? [Y/n] Y
  > Remove test database and access to it? [Y/n] Y
  > Reload privilege tables now? [Y/n] Y

Créez un utilisateur MySQL disposant de tous les privilèges.
Remplacez new_user et new_password par le nom d'utilisateur et le mot de passe que vous souhaitez pour MySQL.
Placez toujours les mots de passe entre quotes et mettez un point-virgule en fin de chaque commande.
Chaque commande doit recevoir une réponse Query OK
mysql -u root
  > create user new_user@localhost identified by 'new_password';
  > grant all privileges on *.* to new_user@localhost;
  > flush privileges;
  > show grants for new_user@localhost;
  > exit

Installez et configurez phpMyAdmin
wget -P Downloads https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
mkdir /var/www/html/phpmyadmin
cd /root/Downloads
tar xvf phpMyAdmin-latest-all-languages.tar.gz --strip-components=1 -C /var/www/html/phpmyadmin
cp /var/www/html/phpmyadmin/config.sample.inc.php /var/www/html/phpmyadmin/config.inc.php
chmod 660 /var/www/html/phpmyadmin/config.inc.php
chown -R www-data:www-data /var/www/html/phpmyadmin
systemctl restart apache2

Créez le fichier /var/www/html/phpinfo.php contenant le code suivant :
<?php phpinfo(); ?>

Vérifiez le fonctionnement des services depuis un navigateur
http://192.168.1.254/
http://192.168.1.254/phpinfo.php
http://192.168.1.254/phpmyadmin
Notez qu'à des fins d'administration, le répertoire phpmyadmin pourra être recopié et exploité dans les répertoires des sites.

Les commandes et chemins courants sont répertoriés en fin de ce document.
4 - Mise en place d'un certificat SSL auto-signé
Bien que terme SSL soit toujours largement employé, ce protocole est devenu obsolète et il est aujourd'hui remplacé par TLS.
Un certificat auto signé est une solution gratuite et fiable sans pour autant être approuvée par une autorité de certification (CA).
Installez les paquets requis pour la suite des opérations
dpkg --list
apt-get update
apt-get -y install openssl
apt-get -y install net-tools

Activez les modules SSL
a2enmod ssl
a2enmod headers
Pour info la commande inverse est a2dismod

Vérifiez que le serveur Apache écoute sur le port 443 (HTTPS)
netstat -tanpu | grep "LISTEN" | grep "443"
Si aucun processus Apache n’est en écoute sur le port 443 (si la commande ne donne aucun résultat) :
Identifiez le fichier qui permet de configurer les ports en écoute et éditez celui qui correspond à Listen 80
Il s'agit généralement de /etc/apache2/ports.conf et ajoutez-lui le code qui indique à Apache d’écouter sur le port 443
grep -R "Listen" /etc/apache2
nano /etc/apache2/ports.conf
    Listen 80

    <IfModule ssl_module>
        Listen 443
    </IfModule>

    <IfModule mod_gnutls.c>
        Listen 443
    </IfModule>
On peut ajouter d’autres ports d’écoute HTTP sous Listen 80 (ex. Listen 8080)
Redémarrez Apache et vérifiez à nouveau
systemctl restart apache2
netstat -tanpu | grep "LISTEN" | grep "443"
    tcp6  0  0  :::443  :::*  LISTEN  96371/apache2

Générez le certificat auto signé dans un répertoire portant le nom du site afin de bien le différencier.
Il est important que Common Name soit le FQDN du site concerné.
mkdir /etc/ssl/site.com
openssl req -new -newkey rsa:2048 -nodes -keyout /etc/ssl/site.com/server.key -out /etc/ssl/site.com/server.csr
    Country Name (2 letter code) [AU]: FR
    State or Province Name (full name) [Some-State]: France
    Locality Name (eg, city) []: votre_ville
    Organization Name (eg, company) [Internet Widgits Pty Ltd]: votre_nom
    Organizational Unit Name (eg, section) []: IT
    Common Name (eg, server FQDN or YOUR name) []: site.com
    Email Address []: votre_email
    A challenge password []: (laisser vide)
    An optional company name []: (laisser vide)
La procédure a créé deux fichiers :
server.key qui contient la clé privée à ne jamais communiquer et à sauvegarder car il n'y a aucun moyen de la récupérer en cas de perte.
Elle est utilisée pour générer toute demande de signature de certificat CSR.
server.csr qui contient la clé publique et les informations de demande de certificat. Par défaut, sa durée de validité est de 1 an.
5 - Activation du CSR chez le registrar

Pour exemple le cas d'un DNS dynamique enregistré chez No-IP
Dans le formulaire Web du processus d'inscription de No-IP :
My Services / SSL Certificates / Add CSR

Server : sélectionnez Apache 2
Enter your CSR : collez le contenu du fichier server.csr puis validez.

Fin de la procédure après avoir renseigné les champs demandés
tels que nom, prénom, téléphone, adresse et code postal.


Téléchargement des certificats.
La mise à jour et la réception de l’email sont quasi instantanées.


Le cadenas apparaît maintenant fermé pour l’hôte concerné.


Téléchargez les quatre fichiers (bien que nous n'utiliserons que le fichier PEM Chain)
et placez-les dans le répertoire /etc/ssl/site.com

Attention : les fichiers PEM Chain et PEM portent la même extension (.pem)
Téléchargez tout d'abord le fichier PEM Chain et recommez-le avec l'extension .pem-chain
6 - Configuration des hôtes virtuels

Les hôtes virtuels sont décrits dans un fichier indiquant au serveur les routes à prendre pour atteindre les données des différents sites hébergés selon leur nom de domaine et le port utilisé.
Un chemin par défaut doit également être défini pour traiter les requêtes qui ne correspondent à aucune des entrées présentes.
Créez un fichier par défaut
nano /etc/apache2/sites-available/default.conf

Dans un premier temps déclarez une unique écoute HTTPS
<VirtualHost *:443>

    # Active le SSL
    SSLEngine On

    # Active tous les protocoles (TLS v1.0, TLS v1.1, TLS v1.2 et TLS v1.3)
    # et désactive SSL v2 et v3 (obsolètes et remplacés par TLS)
    SSLProtocol All -SSLv3 -SSLv2

    # Active les méthodes de chiffrement et désactive les méthodes de chiffrement non sécurisés
    SSLCipherSuite HIGH:!aNULL:!MD5:!ADH:!RC4:!DH

    # Demande au navigateur de sélectionner une méthode de chiffrement
    # en respectant l'ordre envoyée par le serveur (HIGH uniquement)
    SSLHonorCipherOrder on

    # Renseigne le chemin vers le certificat SSL de l'adresse à sécuriser (fichier téléchargé)
    SSLCertificateFile "/etc/ssl/cmclub.ddns.net/cmclub_ddns_net.pem-chain"

    # Renseigne le chemin vers la clé privée correspondant au certificat SSL de l'adresse à sécuriser
    SSLCertificateKeyFile "/etc/ssl/cmclub.ddns.net/server.key"

    # Renseigne le chemin vers le certificat SSL racine, puis vers le ou les certificats SSL intermédiaires
    # Il est possible d’ajouter d'autres directives SSLCACertificateFile
    # SSLCACertificateFile "/etc/ssl/cmclub.ddns.net/certificat-racine.cer"
    # SSLCACertificateFile "/etc/ssl/cmclub.ddns.net/certificat-intermediaire.cer"
    # L’utilisation de certificats racine et intermédiaires est optionnelle

    # Spécifie que le serveur requiert toujours des connexions HTTPS durant 1 an
    Header always set Strict-Transport-Security "max-age=31536000"

</VirtualHost>

Activez le fichier VirtualHost
a2ensite /etc/apache2/sites-available/default.conf
Pour info la commande inverse est a2dissite

Rechargez la configuration d’Apache et effectuez un test.
Vous devez obtenir le message Syntax Ok et ne tenez pas compte de l'erreur de directive globale 'ServerName'.
systemctl reload apache2
apache2ctl configtest
    AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1.
    Set the 'ServerName' directive globally to suppress this message
    Syntax OK

Redémarrez Apache
systemctl restart apache2

Rendez vous sur www.sslshopper.com pour vérifier le bon fonctionnement du certificat et le niveau de sécurité du site.

Cette capture est l'exemple d'un résultat correct :


Voici à présent l'exemple commenté d'une version plus complète du fichier default.conf
Le premier <VirtualHost> est appliqué par défaut si aucun des sites ne correspond aux autres directives ServerName.
Il est judicieux d’y définir le localhost et de le placer en tête de liste.

Les <VirtualHost> suivants sont évalués et exécutés selon la correspondance de leur directive ServerName et du port d'écoute.
Dans cet exemple, site1.com reste en http (port 80) et site2.com est redirigé en https (port 443).

A retenir :
• La directive ServerName est toujours le FQDN du site.
• La directive DocumentRoot est le chemin absolu vers le répertoire du site.
• La directive Redirect permanent est une redirection permanente de type 301 (mise en cache par les robots et les navigateurs).
• Sans l'option permanent, la directive Redirect est une redirection temporaire de type 302 (à réserver pour les tests).

Plusieurs fichiers VirtualHost peuvent être créés et activés mais cela rend la gestion plus complexe.
Consultez la documentation Apache pour l'intégration d'autres directives dans le code.

Important :
• Rechargez la configuration d’Apache après chaque modification : systemctl reload apache2
• Lors de tests il peut être nécessaire d’effacer l’historique du navigateur pour confirmer le résultat.
• Veillez à ce que le fichier soit bien actif : a2ensite default.conf

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot /var/www/html
    # autres directives...
</VirtualHost>

<VirtualHost *:80>
    ServerName site1.com
    DocumentRoot /var/www/html/site1
    # autres directives...
</VirtualHost>

<VirtualHost *:80>
    ServerName site2.com
    DocumentRoot /var/www/html/site2
    Redirect permanent "/" "https://site2.com/"
    # autres directives...
</VirtualHost>

<VirtualHost *:443>
    ServerName site2.com
    DocumentRoot /var/www/html/site2

    SSLEngine On
    SSLProtocol All -SSLv3 -SSLv2
    SSLCipherSuite HIGH:!aNULL:!MD5:!ADH:!RC4:!DH
    SSLHonorCipherOrder on

    SSLCertificateFile "/etc/ssl/site2/site2.pem-chain"
    SSLCertificateKeyFile "/etc/ssl/site2/server.key"

    Header always set Strict-Transport-Security "max-age=31536000"
    # autres directives...
</VirtualHost>
7 - Outils d'administration

Installez les paquets additionnels
# commande man pour l'aide
apt-get install -y man-db

# gestionnaire d'instantanés
apt-get install -y timeshift

Créez les snapshots à des moments où le serveur est inactif, les principales options de la commande sont détaillées ici
timeshift --create --comments "Snapshot Debian" --tags O

Chemins courants
Répertoire des sites /var/www/html/
Répertoire des virtualhosts /etc/apache2/sites-available/
Fichier de configuration PHP /etc/php/7.4/apache2/php.ini
Fichier de configuration TCP/IP /etc/network/interfaces
Fichier de configuration DNS /etc/resolv.conf
Fichier de résolution de noms /etc/hosts
Fichier du nom de machine /etc/hostname
Fichier de configuration SSH /etc/ssh/sshd_config
Fichier de configuration SUDO /etc/sudoers

Commandes courantes
Rechargement de la configuration Apache systemctl reload apache2
Redémarrage de Apache systemctl restart apache2
Redémarrage du service SSH systemctl restart sshd
Redémarrage des services TCP/IP /etc/init.d/networking restart
Version de Apache apache2ctl -V
Version de PHP php --version
Version de MariaDB mysql -V
Version de Debian cat /etc/debian_version
Statut de Apache systemctl status apache2
Statut de MariaDB systemctl status mariadb
Statut de SSH systemctl status ssh
Redémarrage du serveur reboot
Arrêt du serveur shutdown 0
Papy WinTux - Philippe DESLOGES - 2023-2026 - Powered by Debian - Apache 2.4.54 - PHP 7.4.33 - Last update 06-01-2026 23:21 - Page size 43 ko built in 53 ms
All trademarks, logos, images and documents on these pages belong exclusively to their respective owners.