Documentation sur la création d’un serveur web
Règles
- “
Saisie utilisateur
” - ‘
Elément cliquable/sélectionnable
’ Nom de fichier, dossier ou autre
- <Élément à="" remplacer=""> Élément>
lien, raccourci clavier et phrase de demande de saisie
commande, extrait code et extrait de fichier
Table des matières
Préambule
Certains passages de la playlist de Grafikart sont obsolètes (Janvier 2025), j’ai donc pris d’autre source pour les parties qui ne fonctionnaient pas. Les autres sources seront indiquées de la même façon que celle-ci dans les parties concernées.
Le maître mot de ce tutoriel est la sécurité. Faire un serveur c’est bien mais faire un serveur sécurisé c’est mieux. C’est pourquoi, en plus de faire les étapes de base pour créer un serveur web, je vais vous montrer comment sécuriser votre serveur.
Dans ce tutoriel couvrira :
- L’installation du système d’exploitation Debian
- L’installation de SSH
- La configuration du serveur SSH
- L’installation d’Apache
- La configuration du serveur Apache
- L’installation de PHP
- L’installation de MySQL
- La configuration du serveur MySQL
- L’installation de Composer
- La création d’un projet Laravel
- La configuration du serveur Apache pour le projet Laravel
- La configuration de la base de données pour le projet Laravel
- La configuration des permissions pour le projet Laravel
- Le déploiement du projet Laravel sur le serveur apache
Récupération du matériel
Vous pouvez créer un serveur avec n’importe quel ordinateur. Personnellement, j’utilise un ancien ordinateur de burreau qui à une dizaine d’années.
OS Debian
Je vais utiliser Debian server pour ce tutoriel.
-
Télécharger l’image ISO de Debian server sur le site officiel de Debian.
- Debian ne possède pas d’image particulières pour les serveurs, il faut donc télécharger l’image de l’installation de base de Debian. Pendant l’installation, nous ne sélectionnerons pas d’environnement graphique puisque nous n’en avons pas besoin pour un serveur.
- Démarrer l’ordinateur sur la clé USB.
- Selectionner l’image ISO de Debian server.
- Selectionner la langue.
- Entrer le nom de la machine
- Entrer le domaine (laisser vide si vous n’en avez pas). Si vous en avez un c’est ici qu’il entrer votre nom de domaine.
- Entrer le mot de passe de l’utilisateur
root
. - Confirmer le mot de passe.
- Entrer le nom de l’utilisateur courant.
- Entrer le mot de passe de l’utilisateur courant.
- Confirmer le mot de passe.
- Selectionner le partitionnement du disque dur.
- Selectionner le pays pour le miroir des paquets.
- Selectionner le miroir des paquets
deb.debian.org
. - Entrer le proxy (laisser vide si vous n’en avez pas).
- Selectionner si vous voulez participer à l’envoi de données anonymes.
- Selectionner les paquets à installer.
- Serveur SSH
- utilitaires usuels du système
- Installer le chargeur d’amorçage GRUB. (Si vous avez déjà GRUB, il ne vous sera pas demandé de l’installer)
- Cliquer sur
continuer
pour redémarrer l’ordinateur. - Cliquer sur
Debian/GNU
pour démarrer le système. - Entrer le nom d’utilisateur créé précédemment.
- Entrer le mot de passe.
Vous avez maintenant un serveur Debian fonctionnel sur lequel vous êtes connecté en tant qu’utilisateur courant.
-
Passer en mode super utilisateur.
su root
-
Mettre à jour les paquets.
apt update
-
Installer sudo.
apt install sudo
-
Ajouter l’utilisateur courant au groupe sudo.
usermod -aG sudo <nom_utilisateur>
-
Se connecter en tant qu’utilisateur courant.
su <nom_utilisateur>
-
Testez si sudo fonctionne.
sudo date
- Résultat attendu :
la date actuelle
- Résultat attendu :
SSH
-
Changer la configuration de SSH pour plus de sécurité.
sudo nano /etc/ssh/sshd_config
- Modifier la ligne
Port
pour changer le numéro de port par défaut.- Vous pouvez choisir presque n’importe quel numéro de port entre 1024 et 65535.
-
Modifier la ligne
PermitRootLogin
pour qu’elle soit égale àno
.# This is the sshd server system-wide configuration file. See # sshd_config(5) for more information. ... Port <port> ... PermitRootLogin no ...
- Sauvegarder et quitter.
- Modifier la ligne
-
Redémarrer le service SSH.
sudo service ssh restart
-
Créer une clé SSH sur votre ordinateur.
ssh-keygen -t rsa -b 4096 -C "<email>"
- Entrer le nom du fichier de la clé (laisser vide pour utiliser le nom par défaut).
- Entrer une passphrase (optionnel mais plus sécurisé).
- Confirmer la passphrase.
-
Connectez-vous au serveur en SSH.
ssh <nom_utilisateur>@<adresse_ip> -p <port>
- Entrer le mot de passe de l’utilisateur.
-
Créer le dossier
.ssh
dans le dossier de l’utilisateur.mkdir -m 700 ~/.ssh
-
Créer le fichier
authorized_keys
dans le dossier.ssh
.touch ~/.ssh/authorized_keys
- Copier la clé publique de votre ordinateur dans le fichier
authorized_keys
. -
Modifier les permissions du fichier
authorized_keys
.chmod 600 ~/.ssh/authorized_keys
PHP
-
Installer PHP ainsi que les extensions nécessaires.
sudo apt install php-common php-cli php-mysql php-curl php-xml php-json php-dev php-pear php-gd
- php-common : Fournit les fichiers communs pour la dernière version stable de PHP
- php-cli : Fournit l’interface de ligne de commande pour PHP
- php-mysql : Fournit un module de support pour l’extension MySQL de PHP
- php-curl : Fournit un module de support pour l’extension CURL de PHP
- php-xml : Fournit un module de support pour l’extension XML de PHP
- php-json : Fournit un module de support pour l’extension JSON de PHP
- php-dev : Fournit les fichiers de développement pour la dernière version stable de PHP
- php-pear : Fournit un gestionnaire de paquets pour PHP
- php-gd : Fournit un module de support pour l’extension GD de PHP qui permet de manipuler dynamiquement des images
-
Installer le module PHP pour Apache.
sudo apt install libapache2-mod-php
-
Activer des module PHP comme GD si nécessaire.
sudo vim /etc/php/8.2/apache2/php.ini sudo vim /etc/php/8.2/cli/php.ini
-
Modifier la ligne
;extension=gd
pour qu’elle soit égale àextension=gd
.;extension=curl ;extension=ffi ... extension=gd ...
-
Apache
-
Source
https://friendhosting.net/en/blog/install-apache-on-debian-11.php https://youtu.be/arVwa7jvp5M?si=MwPq8noTIiIgu2iV
Je choisie d’installer Apache plutôt que Nginx car c’est un peu plus simple à configurer et c’est plus modulaire. Nginx est plus performant mais mon serveur n’est pas destiné à être utilisé par des milliers de personnes.
Installation de Apache
-
Installer Apache
sudo apt install apache2
-
Vérifier si Apache est bien installé.
sudo systemctl status apache2
-
Ajouter votre utilisateur au groupe
www-data
.sudo usermod -a -G www-data <nom_utilisateur>
-
Changer les permissions du dossier
/var
si vous le souhaitez.sudo chown -R www-data:www-data /var
Utilisation d’Apache (Aide mémoire)
-
Démarrer Apache.
sudo systemctl start apache2
-
Arrêter Apache.
sudo systemctl stop apache2
-
Redémarrer Apache.
sudo systemctl restart apache2
-
Activer Apache au démarrage.
sudo systemctl enable apache2
-
Désactiver Apache au démarrage.
sudo systemctl disable apache2
-
Vérifier si Apache est bien lancé.
sudo systemctl status apache2
-
Activer un module Apache.
sudo a2enmod <module>
- Remplacer
<module>
par le nom du module.
- Remplacer
-
Désactiver un module Apache.
sudo a2dismod <module>
- Remplacer
<module>
par le nom du module.
- Remplacer
-
Activer un site web.
sudo a2ensite <site>
- Remplacer
<site>
par le nom du site web.
- Remplacer
-
Désactiver un site web.
sudo a2dissite <site>
- Remplacer
<site>
par le nom du site web.
- Remplacer
-
Voir les sites web disponibles.
ls -la /etc/apache2/sites-available
-
Voir les sites web actifs.
ls -la /etc/apache2/sites-enabled
-
Voir les modules disponibles.
ls -la /etc/apache2/mods-available
-
Voir les modules actifs.
ls -la /etc/apache2/mods-enabled
Création et déploiement d’un site web avec Apache
Dans cette partie nous allons créer un site web rapide et le déployer avec Apache. Le but est à la fois de vous montrer comment déployer un site web avec Apache et de vérifier que le serveur fonctionne correctement.
-
Créer un dossier pour le site web.
sudo mkdir /var/www/<nom_site>
-
Changer les permissions et le groupe du dossier.
sudo chown -R www-data:www-data /var/www/<nom_site>
-
Créer un fichier
index.php
dans le dossier du site web.sudo nano /var/www/<nom_site>/index.php
-
Ajouter le code suivant.
<?php phpinfo(); ?>
-
Sauvegarder et quitter.
-
-
Créer un fichier de configuration pour le site web.
sudo nano /etc/apache2/sites-available/001-<nom_site>.conf
-
Il est fortement recommandé de commencer le nom du fichier de configuration par un numéro pour que les fichiers soient chargés dans l’ordre.
-
Ajouter le code suivant.
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/<nom_site> ServerName <nom_site> ServerAlias www.<nom_site> <Directory /var/www/<nom_site>> Options +Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
- Remplacer
<nom_site>
par le nom du site web. ServerAdmin
: Adresse email de l’administrateur du site.DocumentRoot
: Chemin du dossier du site web.ServerName
: Nom du site web.- Conseils et astuces
- Attention : Sur un site en production, il faudra changer
+Indexes
par-Indexes
pour désactiver l’indexation des dossiers - Pour plus de détails sur les informations du fichier de configuration, voir la source et/ou la documentation officielle d’Apache
- Dans le cas où vous avez plusieurs sites web, vous pouvez créer un fichier de configuration pour chaque site web en incrémentant le numéro du fichier de configuration.
- Vous devrez également ajouter en première ligne du fichier de configuration apache
listen <port>
pour chaque site web ainsi que<VirtualHost *:<port>>
à la place de<VirtualHost *:80>
.
- Attention : Sur un site en production, il faudra changer
- Pour plus de détails sur les informations du fichier de configuration, voir la source de se cette documentation et/ou la documentation officielle d’Apache.
- Remplacer
-
Sauvegarder et quitter.
-
-
Activer le site web.
sudo a2ensite 001-<nom_site>.conf
-
Désactiver le site par défaut.
sudo a2dissite 000-default.conf
-
Redémarrer Apache.
sudo service apache2 restart
-
Rendez-vous sur votre navigateur et entrez l’adresse IP de votre serveur
http://<adresse_ip>
.- Vous devriez voir la page d’information de PHP.
MySQL
-
Source
-
Télécharger le paquet d’installation de MySQL
wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
- Vérifier la version la plus récente sur le site de MySQL.
- Vérifier la version la plus récente sur le site de MySQL.
-
Installer le paquet
sudo dpkg -i mysql-apt-config_0.8.33-1_all.deb
-
Mettre à jour les paquets
apt
sudo apt install mysql-server -y
-
Lancer l’installation sécurisé de MySQL
sudo mysql_secure_installation
- Entrer le mot de passe de l’utilisateur
root
de MySQL. - Activer
VALIDATE PASSWORD COMPONENT
et choisir le niveau de sécurité du mot de passe. - Changer le mot de passe de l’utilisateur
root
de MySQL si vous le souhaitez. - Supprimer les utilisateurs anonymes.
- Désactiver l’accès à distance à l’utilisateur
root
de la base de données. - Supprimer la base de données de test.
- Recharger les privilèges pour que les modifications prennent effet.
- Entrer le mot de passe de l’utilisateur
-
Vérifier si MySQL est bien installé et lancé (il doit être actif).
sudo systemctl status mysql
-
Se connecter à MySQL en tant que root.
sudo mysql -u root -p
-
Créer un nouvel utilisateur.
CREATE USER 'db_user'@'localhost' IDENTIFIED BY 'Strong@@password123';
-
Donner les droits à l’utilisateur aux bases de données et tables que vous souhaitez.
GRANT ALL PRIVILEGES ON <database>.<table> TO 'db_user'@'localhost' WITH GRANT OPTION;
- Remplacer
<database>
par le nom de la base de données (ou*
pour toutes les bases de données). - Remplacer
<table>
par le nom de la table (ou*
pour toutes les tables). - Je vous recommande de ne pas donner tous les privilèges à l’utilisateur pour des raisons de sécurité.
- Vous pouvez donner seulement certains privilèges à l’utilisateur en remplaçant
ALL PRIVILEGES
par les privilèges que vous souhaitez donner à l’utilisateur.
- Remplacer
-
Mettre à jour les privilèges.
FLUSH PRIVILEGES;
-
Quitter MySQL.
exit
-
Connecter en tant qu’utilisateur pour tester la connexion à la base de données.
mysql -u db_user -p
- Entrer le mot de passe de l’utilisateur.
-
Afficher les bases de données.
SHOW DATABASES;
-
Quitter MySQL.
exit
Pour des raisons de sécurité, il est recommandé de créer un utilisateur pour chaque base de données et de ne pas utiliser l’utilisateur root
pour les connexions à la base de données.
Composer
Déploiement d’un projet Laravel
-
Source
https://www.gekkode.com/developpement/installation-de-laravel-et-configuration-apache/ https://codewithsusan.com/notes/multiple-laravel-apps-on-apache-server
-
Créer un nouveau projet Laravel
composer create-project --prefer-dist laravel/laravel <nom_projet>
- En cas de problème de droits, vous pouvez sois ajouter
sudo
devant la commande ou lancez la commande dans votre répertoire personnel (/home/${USER}
) puis déplacer le projet dans le dossier/var/www/
- En cas de problème de droits, vous pouvez sois ajouter
-
Créer un fichier
.env
à la racine du projet Laravelcp .env.example .env
-
Modifier le fichier
.env
pour qu’il corresponde à votre base de données... DB_CONNECTION=mysql DB_HOST=<adresse_ip> DB_PORT=<port> DB_DATABASE=<nom_base_de_données> DB_USERNAME=<nom_utilisateur> DB_PASSWORD=<mot_de_passe> ...
-
Modifier les permissions du dossier du projet Laravel
sudo chown -R www-data:www-data /var/www/<nom_projet>
-
Modifier les permissions du dossier de
stockage
etbootstrap/cache
sudo chmod -R 777 /var/www/<nom_projet>/storage sudo chmod -R 777 /var/www/<nom_projet>/bootstrap/cache
-
Mettre à jour les dépendances
Composer
etNPM
composer update npm update
-
Installer les dépendances du projet Laravel
composer install npm install
-
Générer une clé pour le projet Laravel
php artisan key:generate
-
Migrer les tables de la base de données
php artisan migrate
-
Activer le module Apache rewrite qui permet de gérer la réécriture d’URL
sudo a2enmod rewrite
-
Changer le propriétaire et le groupe du dossier de votre projet Laravel
sudo chown -R www-data:www-data /var/www/<nom_projet>
-
Créer un fichier de configuration apache pour le projet Laravel
sudo nano /etc/apache2/sites-available/002-<nom_projet>.conf
-
Ajouter le code suivant
<VirtualHost *:80> ServerAdmin admin@mail.com DocumentRoot /var/www/<nom_projet>/public ServerName <nom_projet> ServerAlias www.<nom_projet> <Directory /var/www/<nom_projet>/public> Options +Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.<nom_projet>.log CustomLog ${APACHE_LOG_DIR}/access.<nom_projet>.log combined </VirtualHost>
- Remplacer
<nom_projet>
par le nom du site web ServerAdmin
: Adresse email de l’administrateur du siteDocumentRoot
: Chemin du dossier du site webServerName
: Nom du site web- Conseils et astuces
- Attention : Sur un site en production, il faudra changer
+Indexes
par-Indexes
pour désactiver l’indexation des dossiers - Pour plus de détails sur les informations du fichier de configuration, voir la source et/ou la documentation officielle d’Apache
- Dans le cas où vous avez plusieurs sites web, vous pouvez créer un fichier de configuration pour chaque site web en incrémentant le numéro du fichier de configuration.
- Vous devrez également ajouter en première ligne du fichier de configuration apache
listen <port>
pour chaque site web ainsi que<VirtualHost *:<port>>
à la place de<VirtualHost *:80>
.
- Attention : Sur un site en production, il faudra changer
- Pour plus de détails sur les informations du fichier de configuration, voir la source de se cette documentation et/ou la documentation officielle d’Apache.
- Remplacer
-
Sauvegarder et quitter
-
-
Activer le site web
sudo a2ensite 002-<nom_projet>.conf
-
Désactiver le site actuellement actif
sudo a2dissite 001-<nom_site>.conf
-
Redémarrer Apache
sudo systemctl restart apache2
Licence
doc_creation_serveur.md
Copyright (C) 2024 Floris Robart
Authors: Floris Robart
This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.