Documentation sur mise en service d'un serveur web PHP Apache MySQL¶
Table des matières¶
Prérequis¶
- Avoir un serveur (de préférence Debian) sur lequel vous avez les droits administrateurs.
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 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
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=gdpour 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
/varsi 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. - Désactiver un module Apache.
sudo a2dismod <module>- Remplacer
<module>par le nom du module. - Activer un site web.
sudo a2ensite <site>- Remplacer
<site>par le nom du site web. - Désactiver un site web.
sudo a2dissite <site>- Remplacer
<site>par le nom du site web. - Voir les sites web disponibles.
ls -la /etc/apache2/sites-available - Remplacer
-
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.phpdans 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
+Indexespar-Indexespour 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.
- Sauvegarder et quitter.
- Activer le site web.
- Remplacer
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. > https://dev.mysql.com/downloads/repo/apt/
-
Installer le paquet
sudo dpkg -i mysql-apt-config_0.8.33-1_all.deb -
Mettre à jour les paquets
aptsudo apt install mysql-server -y -
Lancer l'installation sécurisé de MySQL
sudo mysql_secure_installation- Entrer le mot de passe de l'utilisateur
rootde MySQL. - Activer
VALIDATE PASSWORD COMPONENTet choisir le niveau de sécurité du mot de passe. - Changer le mot de passe de l'utilisateur
rootde MySQL si vous le souhaitez. - Supprimer les utilisateurs anonymes.
- Désactiver l'accès à distance à l'utilisateur
rootde 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 PRIVILEGESpar 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
sudodevant la commande ou lancez la commande dans votre répertoire personnel (/home/${USER}) puis déplacer le projet dans le dossier/var/www/ - Créer un fichier
.envà la racine du projet Laravel
cp .env.example .env - En cas de problème de droits, vous pouvez sois ajouter
-
Modifier le fichier
.envpour 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
stockageetbootstrap/cachesudo chmod -R 777 /var/www/<nom_projet>/storage sudo chmod -R 777 /var/www/<nom_projet>/bootstrap/cache -
Mettre à jour les dépendances
ComposeretNPMcomposer 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
+Indexespar-Indexespour 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.
- Sauvegarder et quitter
- Activer le site web
- Remplacer
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¶
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.