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=gd pour qu'elle soit égale à extension=gd.

      ;extension=curl
      ;extension=ffi
      
      ...
      
      extension=gd
      
      ...
      

Apache

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.
    • 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
    
  • 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>.
      • 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.
    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

    https://docs.vultr.com/how-to-install-mysql-on-debian-12

  • Télécharger le paquet d'installation de MySQL

    wget  https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
    
  • 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.
  • 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.
  • 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/
    • Créer un fichier .env à la racine du projet Laravel
    cp .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 et bootstrap/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 et NPM

    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 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>.
      • 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
    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.