🛠 Outils IT

Guide PHP / MySQL

1. Debian / Ubuntu (LAMP)

Le stack LAMP (Linux, Apache, MySQL/MariaDB, PHP) est la combinaison la plus repandue pour heberger des applications PHP. Voici le guide complet pour Debian 11/12 et Ubuntu 22.04/24.04.

1.1 Mise a jour du systeme

Avant toute installation, mettre a jour les paquets existants :

sudo apt update && sudo apt upgrade -y

1.2 Installation d'Apache

# Installer Apache
sudo apt install apache2 -y

# Verifier le statut
sudo systemctl status apache2

# Activer Apache au demarrage
sudo systemctl enable apache2

Apres installation, ouvrir http://adresse-ip-du-serveur dans un navigateur pour verifier que la page par defaut d'Apache s'affiche.

1.3 Installation de PHP 8.x

Installer PHP et les extensions les plus courantes :

# PHP et extensions essentielles
sudo apt install php php-mysql php-cli php-curl php-gd php-mbstring php-xml php-zip -y

# Extensions supplementaires souvent utiles
sudo apt install php-intl php-bcmath php-soap php-readline php-opcache -y

# Verifier la version installee
php -v
Astuce : Sur les anciennes versions de Debian/Ubuntu, le depot par defaut peut fournir une version PHP obsolete. Pour installer PHP 8.2 ou 8.3 sur une distribution plus ancienne, utiliser le PPA d'Ondrej Sury :
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.3 php8.3-mysql php8.3-cli php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip -y

1.4 Installation de MySQL / MariaDB

Option A : MariaDB (recommande pour Debian)

# Installer MariaDB
sudo apt install mariadb-server mariadb-client -y

# Demarrer et activer
sudo systemctl start mariadb
sudo systemctl enable mariadb

# Securiser l'installation
sudo mysql_secure_installation

Option B : MySQL Server

# Installer MySQL
sudo apt install mysql-server mysql-client -y

# Demarrer et activer
sudo systemctl start mysql
sudo systemctl enable mysql

# Securiser l'installation
sudo mysql_secure_installation
mysql_secure_installation permet de :
  • Definir un mot de passe root pour MySQL/MariaDB
  • Supprimer les utilisateurs anonymes
  • Desactiver la connexion root a distance
  • Supprimer la base de test
  • Recharger les tables de privileges
Repondre Y (Yes) a toutes les questions pour une securisation optimale.

1.5 Activation des modules Apache

# Module rewrite (indispensable pour les URL propres / .htaccess)
sudo a2enmod rewrite

# Module SSL (pour HTTPS)
sudo a2enmod ssl

# Module headers (securite HTTP)
sudo a2enmod headers

# Module expires (cache navigateur)
sudo a2enmod expires

# Redemarrer Apache pour appliquer
sudo systemctl restart apache2

1.6 Configuration d'un Virtual Host

Creer un fichier de configuration pour votre site :

sudo nano /etc/apache2/sites-available/mon-serveur.conf

Contenu du fichier :

<VirtualHost *:80>
    ServerName mon-serveur.example.com
    ServerAlias www.mon-serveur.example.com
    ServerAdmin admin@example.com
    DocumentRoot /var/www/mon-serveur/public

    <Directory /var/www/mon-serveur/public>
        AllowOverride All
        Require all granted
        Options -Indexes +FollowSymLinks
    </Directory>

    # Logs
    ErrorLog ${APACHE_LOG_DIR}/mon-serveur-error.log
    CustomLog ${APACHE_LOG_DIR}/mon-serveur-access.log combined

    # Securite headers
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-XSS-Protection "1; mode=block"
</VirtualHost>
# Creer le repertoire du site
sudo mkdir -p /var/www/mon-serveur/public

# Donner les bonnes permissions
sudo chown -R www-data:www-data /var/www/mon-serveur

# Activer le site
sudo a2ensite mon-serveur.conf

# Desactiver le site par defaut (optionnel)
sudo a2dissite 000-default.conf

# Tester la configuration
sudo apachectl configtest

# Recharger Apache
sudo systemctl reload apache2

1.7 PHP-FPM (FastCGI Process Manager)

PHP-FPM offre de meilleures performances que le module PHP classique (mod_php), surtout sous forte charge.

# Installer PHP-FPM
sudo apt install php-fpm -y

# Verifier le service (le nom varie selon la version PHP)
sudo systemctl status php8.3-fpm

# Activer les modules Apache necessaires
sudo a2enmod proxy_fcgi setenvif

# Activer la configuration PHP-FPM
sudo a2enconf php8.3-fpm

# Redemarrer Apache
sudo systemctl restart apache2

Modifier le Virtual Host pour utiliser PHP-FPM :

<VirtualHost *:80>
    ServerName mon-serveur.example.com
    DocumentRoot /var/www/mon-serveur/public

    <Directory /var/www/mon-serveur/public>
        AllowOverride All
        Require all granted
    </Directory>

    # Utiliser PHP-FPM via le socket Unix
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
    </FilesMatch>

    ErrorLog ${APACHE_LOG_DIR}/mon-serveur-error.log
    CustomLog ${APACHE_LOG_DIR}/mon-serveur-access.log combined
</VirtualHost>
Configuration du pool PHP-FPM : Le fichier de configuration du pool se trouve dans /etc/php/8.3/fpm/pool.d/www.conf. Les parametres importants sont :
; Nombre de processus enfants
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500

2. CentOS / RHEL / AlmaLinux (LAMP)

Sur les distributions basees sur Red Hat (CentOS Stream 9, RHEL 9, AlmaLinux 9, Rocky Linux 9), la gestion des paquets utilise dnf.

2.1 Installation d'Apache (httpd)

# Installer Apache
sudo dnf install httpd -y

# Demarrer et activer
sudo systemctl start httpd
sudo systemctl enable httpd

# Verifier le statut
sudo systemctl status httpd

2.2 Installation de PHP via le depot Remi

Le depot Remi permet d'installer les dernieres versions de PHP :

# Installer EPEL (prerequis)
sudo dnf install epel-release -y

# Installer le depot Remi (RHEL/AlmaLinux/Rocky 9)
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm -y

# Lister les modules PHP disponibles
dnf module list php

# Activer PHP 8.2 depuis le depot Remi
sudo dnf module reset php -y
sudo dnf module enable php:remi-8.2 -y

# Installer PHP et les extensions
sudo dnf install php php-mysqlnd php-cli php-curl php-gd php-mbstring php-xml php-zip php-opcache php-intl php-bcmath -y

# Verifier la version
php -v

# Redemarrer Apache
sudo systemctl restart httpd
Note : Sur CentOS/RHEL 8, remplacer remi-release-9.rpm par remi-release-8.rpm. Sur RHEL 7 (obsolete), utiliser yum au lieu de dnf.

2.3 Installation de MariaDB

# Installer MariaDB
sudo dnf install mariadb-server mariadb -y

# Demarrer et activer
sudo systemctl start mariadb
sudo systemctl enable mariadb

# Securiser l'installation
sudo mysql_secure_installation

2.4 Configuration SELinux

SELinux (Security-Enhanced Linux) est actif par defaut sur RHEL/CentOS/AlmaLinux et peut bloquer certaines operations :

# Permettre a Apache de se connecter a la base de donnees
sudo setsebool -P httpd_can_network_connect_db 1

# Permettre a Apache d'envoyer des emails (si necessaire)
sudo setsebool -P httpd_can_sendmail 1

# Permettre a Apache de se connecter au reseau (API externes, etc.)
sudo setsebool -P httpd_can_network_connect 1

# Verifier les booleens SELinux lies a httpd
getsebool -a | grep httpd

# Si un repertoire personnalise est utilise pour le DocumentRoot :
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/mon-serveur/public(/.*)?"
sudo restorecon -Rv /var/www/mon-serveur/public

# En cas de probleme, consulter les logs SELinux
sudo ausearch -m avc -ts recent
sudo sealert -a /var/log/audit/audit.log
Attention : Ne jamais desactiver SELinux en production (setenforce 0). Preferer ajuster les booleens et contextes de fichiers. Desactiver SELinux affaiblit significativement la securite du serveur.

2.5 Configuration du pare-feu (firewalld)

# Ouvrir le port HTTP (80)
sudo firewall-cmd --permanent --add-service=http

# Ouvrir le port HTTPS (443)
sudo firewall-cmd --permanent --add-service=https

# Recharger le pare-feu
sudo firewall-cmd --reload

# Verifier les regles actives
sudo firewall-cmd --list-all

2.6 Virtual Host sur CentOS / RHEL

# Creer le fichier de configuration
sudo nano /etc/httpd/conf.d/mon-serveur.conf
<VirtualHost *:80>
    ServerName mon-serveur.example.com
    DocumentRoot /var/www/mon-serveur/public

    <Directory /var/www/mon-serveur/public>
        AllowOverride All
        Require all granted
        Options -Indexes +FollowSymLinks
    </Directory>

    ErrorLog /var/log/httpd/mon-serveur-error.log
    CustomLog /var/log/httpd/mon-serveur-access.log combined
</VirtualHost>
# Creer le repertoire et attribuer les permissions
sudo mkdir -p /var/www/mon-serveur/public
sudo chown -R apache:apache /var/www/mon-serveur

# Tester la configuration
sudo apachectl configtest

# Redemarrer Apache
sudo systemctl restart httpd

3. Windows

3.1 XAMPP (methode simple)

XAMPP est la solution tout-en-un la plus populaire pour un environnement de developpement PHP/MySQL sur Windows.

Installation

  1. Telecharger XAMPP depuis https://www.apachefriends.org/
  2. Executer l'installateur et choisir les composants : Apache, MySQL, PHP, phpMyAdmin
  3. Repertoire d'installation par defaut : C:\xampp
  4. Lancer le XAMPP Control Panel et demarrer Apache + MySQL

Configuration de httpd.conf

Le fichier se trouve dans C:\xampp\apache\conf\httpd.conf :

# Changer le port si necessaire (par defaut : 80)
Listen 80

# Repertoire racine du serveur
DocumentRoot "C:/xampp/htdocs"
<Directory "C:/xampp/htdocs">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Require all granted
</Directory>

# Activer le module rewrite
LoadModule rewrite_module modules/mod_rewrite.so

Configuration de php.ini

Le fichier se trouve dans C:\xampp\php\php.ini :

; Extensions utiles a activer (retirer le ; au debut)
extension=curl
extension=gd
extension=mbstring
extension=mysqli
extension=openssl
extension=pdo_mysql
extension=zip
extension=intl

; Augmenter les limites
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300

Virtual Host sous XAMPP

Editer C:\xampp\apache\conf\extra\httpd-vhosts.conf :

<VirtualHost *:80>
    ServerName mon-projet.local
    DocumentRoot "C:/xampp/htdocs/mon-projet/public"
    <Directory "C:/xampp/htdocs/mon-projet/public">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Ajouter dans C:\Windows\System32\drivers\etc\hosts :

127.0.0.1    mon-projet.local

3.2 IIS + PHP (methode manuelle)

Pour un environnement de production Windows avec IIS (Internet Information Services) :

Activer IIS

  1. Ouvrir Panneau de configuration > Programmes > Activer ou desactiver des fonctionnalites Windows
  2. Cocher Internet Information Services
  3. Dans les sous-options, cocher : CGI, ISAPI Extensions, ISAPI Filters
  4. Valider et redemarrer si necessaire

Installer PHP pour IIS

# Telecharger PHP NTS (Non Thread Safe) depuis https://windows.php.net/download/
# Extraire dans C:\php

# Copier le fichier de configuration
copy C:\php\php.ini-production C:\php\php.ini

# Ajouter C:\php au PATH systeme (via les variables d'environnement)

Configurer le handler FastCGI dans IIS

  1. Ouvrir le Gestionnaire IIS
  2. Selectionner le serveur > Mappages de gestionnaires
  3. Cliquer Ajouter un mappage de module :
    • Chemin de la requete : *.php
    • Module : FastCgiModule
    • Executable : C:\php\php-cgi.exe
    • Nom : PHP_via_FastCGI

3.3 MySQL sur Windows

# Telecharger MySQL Installer Community depuis :
# https://dev.mysql.com/downloads/installer/

# Pendant l'installation, choisir :
# - Server Only (ou Custom pour plus de controle)
# - Definir le mot de passe root
# - Configurer le service Windows "MySQL80"

# Apres installation, acceder via la ligne de commande :
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -u root -p

# Ou ajouter le chemin au PATH systeme pour utiliser simplement :
mysql -u root -p

4. Configuration PHP (php.ini)

4.1 Localiser le fichier php.ini

# Via la ligne de commande
php --ini

# Resultat typique :
# Configuration File (php.ini) Path: /etc/php/8.3/cli
# Loaded Configuration File: /etc/php/8.3/cli/php.ini

# Via un script PHP (methode precise pour le php.ini utilise par le serveur web)
<?php phpinfo(); ?>
Important : Il existe souvent deux fichiers php.ini differents : un pour la ligne de commande (cli) et un pour le serveur web (apache2 ou fpm). Verifier que vous modifiez le bon fichier selon votre besoin. Les chemins typiques sont :
  • /etc/php/8.3/cli/php.ini - pour PHP CLI
  • /etc/php/8.3/apache2/php.ini - pour mod_php (Apache)
  • /etc/php/8.3/fpm/php.ini - pour PHP-FPM

4.2 Directives essentielles

Directive Valeur par defaut Recommandation production Description
memory_limit 128M 256M ou 512M Memoire maximale allouee a un script PHP
upload_max_filesize 2M 64M Taille max d'un fichier uploade
post_max_size 8M 64M Taille max des donnees POST (doit etre >= upload_max_filesize)
max_execution_time 30 60 a 300 Duree max d'execution d'un script (en secondes)
max_input_time 60 120 Duree max pour parser les donnees d'entree
date.timezone (vide) America/Toronto Fuseau horaire par defaut
display_errors On Off Afficher les erreurs dans le navigateur (Off en production !)
error_reporting E_ALL & ~E_NOTICE E_ALL & ~E_DEPRECATED & ~E_STRICT Niveau de rapport d'erreurs
log_errors Off On Enregistrer les erreurs dans un fichier log
error_log (vide) /var/log/php/error.log Chemin du fichier de log des erreurs PHP
expose_php On Off Masquer la version PHP dans les headers HTTP

4.3 Configuration OPcache

OPcache stocke le bytecode PHP compile en memoire pour de meilleures performances :

; Activer OPcache
opcache.enable = 1

; Memoire partagee pour le cache (en Mo)
opcache.memory_consumption = 128

; Nombre max de fichiers en cache
opcache.max_accelerated_files = 10000

; Frequence de verification des modifications (0 en prod = jamais)
opcache.revalidate_freq = 0

; Valider les timestamps (0 en production pour de meilleures performances)
opcache.validate_timestamps = 0

; Activer le preloading (PHP 8.x)
; opcache.preload = /var/www/mon-serveur/preload.php
; opcache.preload_user = www-data

; JIT Compiler (PHP 8.x)
opcache.jit = 1255
opcache.jit_buffer_size = 64M
Attention : Avec opcache.validate_timestamps = 0, PHP ne detecte plus les modifications de fichiers. Il faut redemarrer PHP-FPM ou Apache apres chaque deploiement pour vider le cache :
sudo systemctl restart php8.3-fpm
# ou
sudo systemctl restart apache2

4.4 Exemple complet php.ini (production)

[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096

; Securite
expose_php = Off
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/error.log
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

; Limites
memory_limit = 256M
max_execution_time = 120
max_input_time = 120
post_max_size = 64M
upload_max_filesize = 64M
max_file_uploads = 20

; Fuseau horaire
date.timezone = America/Toronto

; Session
session.save_handler = files
session.save_path = "/var/lib/php/sessions"
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_strict_mode = 1

; OPcache
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 0
opcache.validate_timestamps = 0

5. Configuration MySQL (my.cnf / my.ini)

5.1 Fichiers de configuration

  • Linux : /etc/mysql/my.cnf ou /etc/my.cnf (MariaDB)
  • Linux (include) : /etc/mysql/mysql.conf.d/mysqld.cnf
  • Windows (XAMPP) : C:\xampp\mysql\bin\my.ini
  • Windows (MySQL Server) : C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

5.2 Parametres cles

[mysqld]
# Adresse d'ecoute (127.0.0.1 = local seulement, 0.0.0.0 = toutes les interfaces)
bind-address = 127.0.0.1

# Port (3306 par defaut)
port = 3306

# Jeu de caracteres par defaut
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# InnoDB - Memoire tampon (50-70% de la RAM totale sur un serveur dedie)
innodb_buffer_pool_size = 1G

# InnoDB - Taille du fichier de log (plus grand = meilleures perfs d'ecriture)
innodb_log_file_size = 256M

# Nombre max de connexions simultanees
max_connections = 151

# Taille max des paquets (important pour les gros imports)
max_allowed_packet = 64M

# Cache des requetes (desactive par defaut en MySQL 8, utiliser OPcache/Redis)
# query_cache_type = 0

# Logs
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

# Fichiers temporaires
tmp_table_size = 64M
max_heap_table_size = 64M

[client]
default-character-set = utf8mb4

5.3 Creation d'une base et d'un utilisateur

# Se connecter en tant que root
sudo mysql -u root -p

# Creer une base de donnees
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# Creer un utilisateur avec un mot de passe fort
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'M0nM0tDeP@sse!Complexe2024';

# Accorder tous les privileges sur la base
GRANT ALL PRIVILEGES ON myapp.* TO 'myuser'@'localhost';

# Appliquer les changements
FLUSH PRIVILEGES;

# Verifier les privileges
SHOW GRANTS FOR 'myuser'@'localhost';

# Quitter
EXIT;

5.4 Operations courantes

# Importer un fichier SQL
mysql -u myuser -p myapp < /chemin/vers/dump.sql

# Exporter une base de donnees
mysqldump -u myuser -p myapp > /chemin/vers/backup.sql

# Exporter avec compression
mysqldump -u myuser -p myapp | gzip > /chemin/vers/backup.sql.gz

# Exporter toutes les bases
mysqldump -u root -p --all-databases > /chemin/vers/all_databases.sql

# Importer un fichier compresse
gunzip < /chemin/vers/backup.sql.gz | mysql -u myuser -p myapp

# Verifier la taille des bases de donnees
SELECT table_schema AS 'Base de donnees',
       ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Taille (Mo)'
FROM information_schema.tables
GROUP BY table_schema
ORDER BY SUM(data_length + index_length) DESC;
Astuce - Backup automatise : Creer un script cron pour les sauvegardes automatiques :
# Editer le crontab
crontab -e

# Backup quotidien a 2h du matin
0 2 * * * mysqldump -u myuser -p'MotDePasse' myapp | gzip > /var/backups/mysql/myapp_$(date +\%Y\%m\%d).sql.gz

# Nettoyer les backups de plus de 30 jours
0 3 * * * find /var/backups/mysql/ -type f -mtime +30 -delete

6. Securisation

6.1 Securisation PHP

; Dans php.ini - Masquer PHP
expose_php = Off

; Desactiver les fonctions dangereuses
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

; Limiter les acces fichiers
open_basedir = /var/www/mon-serveur:/tmp

; Desactiver l'affichage des erreurs en production
display_errors = Off
log_errors = On

6.2 Securisation Apache

# Dans /etc/apache2/conf-available/security.conf (Debian/Ubuntu)
# ou /etc/httpd/conf/httpd.conf (CentOS/RHEL)

# Masquer la version d'Apache
ServerTokens Prod
ServerSignature Off

# Headers de securite
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Content-Security-Policy "default-src 'self'"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

# Desactiver le listage des repertoires
Options -Indexes

# Proteger les fichiers sensibles
<FilesMatch "(^\.ht|\.env|composer\.json|composer\.lock)$">
    Require all denied
</FilesMatch>

6.3 Pare-feu avec UFW (Debian/Ubuntu)

# Installer UFW si non present
sudo apt install ufw -y

# Regles par defaut : tout bloquer sauf le sortant
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Autoriser SSH (AVANT d'activer le pare-feu !)
sudo ufw allow ssh
# ou sur un port personnalise :
sudo ufw allow 2222/tcp

# Autoriser HTTP et HTTPS
sudo ufw allow http
sudo ufw allow https

# Activer le pare-feu
sudo ufw enable

# Verifier le statut
sudo ufw status verbose

# Supprimer une regle
sudo ufw delete allow http
Attention : Toujours autoriser SSH AVANT d'activer UFW, sinon vous risquez de perdre l'acces au serveur !

6.4 Fail2ban

Fail2ban protege contre les attaques par force brute en bannissant les adresses IP suspectes :

# Installer fail2ban
sudo apt install fail2ban -y    # Debian/Ubuntu
sudo dnf install fail2ban -y    # CentOS/AlmaLinux

# Creer un fichier de configuration local
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Configuration recommandee dans /etc/fail2ban/jail.local :

[DEFAULT]
# Duree de bannissement (10 minutes)
bantime = 600

# Fenetre d'observation (10 minutes)
findtime = 600

# Nombre max de tentatives avant bannissement
maxretry = 5

# Action par defaut
banaction = iptables-multiport

# Notification par email (optionnel)
# destemail = admin@example.com
# action = %(action_mwl)s

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s

[apache-auth]
enabled = true
port = http,https
logpath = %(apache_error_log)s

[apache-badbots]
enabled = true
port = http,https
logpath = %(apache_access_log)s

[apache-noscript]
enabled = true
port = http,https
logpath = %(apache_error_log)s

[mysqld-auth]
enabled = true
port = 3306
logpath = /var/log/mysql/error.log
# Demarrer et activer fail2ban
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# Verifier le statut des jails
sudo fail2ban-client status

# Verifier un jail specifique
sudo fail2ban-client status sshd

# Debannir une IP manuellement
sudo fail2ban-client set sshd unbanip 192.168.1.100

6.5 Securisation MySQL

# Se connecter en tant que root
sudo mysql -u root -p

# Verifier les utilisateurs existants
SELECT user, host FROM mysql.user;

# Supprimer l'acces root a distance (si present)
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');

# Supprimer les comptes anonymes
DELETE FROM mysql.user WHERE User='';

# Supprimer la base de test
DROP DATABASE IF EXISTS test;

# Appliquer
FLUSH PRIVILEGES;

# Modifier le mot de passe root
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NouveauMotDePasse!Complexe2024';
FLUSH PRIVILEGES;
Bonnes pratiques MySQL :
  • Ne jamais utiliser le compte root dans les applications, creer un utilisateur dedie par application
  • Utiliser bind-address = 127.0.0.1 pour empecher les connexions distantes
  • Utiliser des mots de passe forts (12+ caracteres, majuscules, minuscules, chiffres, symboles)
  • Accorder uniquement les privileges necessaires (principe du moindre privilege)
  • Activer les logs de requetes lentes (slow_query_log) pour surveiller les performances

7. Commandes utiles / Depannage

7.1 Gestion des services

# --- Debian / Ubuntu ---
# Apache
sudo systemctl start apache2
sudo systemctl stop apache2
sudo systemctl restart apache2
sudo systemctl reload apache2       # Recharger la config sans couper les connexions
sudo systemctl status apache2

# PHP-FPM
sudo systemctl restart php8.3-fpm
sudo systemctl status php8.3-fpm

# MySQL / MariaDB
sudo systemctl start mysql          # ou mariadb
sudo systemctl stop mysql
sudo systemctl restart mysql
sudo systemctl status mysql

# --- CentOS / RHEL / AlmaLinux ---
# Apache (httpd)
sudo systemctl start httpd
sudo systemctl stop httpd
sudo systemctl restart httpd
sudo systemctl status httpd

# MariaDB
sudo systemctl start mariadb
sudo systemctl restart mariadb
sudo systemctl status mariadb

7.2 Fichiers de logs

Service Debian / Ubuntu CentOS / RHEL
Apache - Erreurs /var/log/apache2/error.log /var/log/httpd/error_log
Apache - Acces /var/log/apache2/access.log /var/log/httpd/access_log
PHP /var/log/php/error.log (si configure) /var/log/php-fpm/error.log
MySQL /var/log/mysql/error.log /var/log/mariadb/mariadb.log
MySQL - Slow queries /var/log/mysql/slow.log /var/log/mariadb/slow.log
# Suivre un log en temps reel
sudo tail -f /var/log/apache2/error.log

# Voir les 50 dernieres lignes
sudo tail -n 50 /var/log/mysql/error.log

# Chercher une erreur specifique
sudo grep -i "error" /var/log/apache2/error.log | tail -20

# Voir les logs systemd d'un service
sudo journalctl -u apache2 --since "1 hour ago"
sudo journalctl -u mysql -f    # En temps reel

7.3 Diagnostics PHP

# Version de PHP
php -v

# Liste des modules installes
php -m

# Informations detaillees sur un module
php -i | grep -i "opcache"

# Localiser le php.ini utilise
php --ini

# Verifier la syntaxe d'un fichier PHP
php -l /var/www/mon-serveur/public/index.php

# Lancer le serveur de developpement integre
php -S localhost:8080 -t /var/www/mon-serveur/public

# Tester une configuration PHP rapidement
php -r "echo ini_get('memory_limit');"

# Creer un fichier phpinfo (temporaire, supprimer apres usage)
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
# Acceder a http://mon-serveur.example.com/info.php
# IMPORTANT : Supprimer apres utilisation !
sudo rm /var/www/html/info.php
Securite : Ne JAMAIS laisser un fichier phpinfo() accessible en production. Il revele des informations sensibles sur le serveur (chemins, versions, configuration, variables d'environnement).

7.4 Diagnostics MySQL

# Version de MySQL/MariaDB
mysql -V

# Se connecter et verifier le statut
mysql -u root -p -e "STATUS;"

# Lister les bases de donnees
mysql -u root -p -e "SHOW DATABASES;"

# Verifier les processus en cours
mysql -u root -p -e "SHOW PROCESSLIST;"

# Verifier les variables globales
mysql -u root -p -e "SHOW VARIABLES LIKE 'max_connections';"
mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer%';"

# Verifier l'utilisation memoire InnoDB
mysql -u root -p -e "SHOW ENGINE INNODB STATUS\G"

# Reparer une table
mysql -u root -p -e "REPAIR TABLE myapp.ma_table;"

# Optimiser une table
mysql -u root -p -e "OPTIMIZE TABLE myapp.ma_table;"

7.5 Problemes de permissions

# Debian/Ubuntu - Apache utilise l'utilisateur www-data
sudo chown -R www-data:www-data /var/www/mon-serveur
sudo find /var/www/mon-serveur -type d -exec chmod 755 {} \;
sudo find /var/www/mon-serveur -type f -exec chmod 644 {} \;

# Dossiers necessitant l'ecriture (uploads, cache, logs)
sudo chmod -R 775 /var/www/mon-serveur/storage
sudo chmod -R 775 /var/www/mon-serveur/cache

# CentOS/RHEL - Apache utilise l'utilisateur apache
sudo chown -R apache:apache /var/www/mon-serveur
sudo find /var/www/mon-serveur -type d -exec chmod 755 {} \;
sudo find /var/www/mon-serveur -type f -exec chmod 644 {} \;

# Ajouter votre utilisateur au groupe www-data (pour editer les fichiers)
sudo usermod -a -G www-data $USER
# Deconnexion/reconnexion necessaire pour appliquer

7.6 Tests de configuration

# Tester la configuration Apache (detecte les erreurs de syntaxe)
sudo apachectl configtest
# ou
sudo apache2ctl -t

# Tester la configuration Nginx (si utilise a la place d'Apache)
sudo nginx -t

# Tester la configuration PHP-FPM
sudo php-fpm8.3 -t

# Tester la connexion MySQL depuis PHP
php -r "
\$conn = new mysqli('localhost', 'myuser', 'MotDePasse', 'myapp');
if (\$conn->connect_error) {
    die('Erreur : ' . \$conn->connect_error);
}
echo 'Connexion reussie ! Version du serveur : ' . \$conn->server_info . PHP_EOL;
\$conn->close();
"

7.7 Commandes rapides de diagnostic

# Verifier les ports en ecoute
sudo ss -tlnp | grep -E ':(80|443|3306)'

# Verifier l'espace disque
df -h

# Verifier l'utilisation memoire
free -h

# Verifier les processus PHP-FPM en cours
ps aux | grep php-fpm

# Verifier la charge du serveur
uptime
top -b -n 1 | head -20

# Tester la reponse du serveur web localement
curl -I http://localhost
curl -I https://mon-serveur.example.com

# Verifier les certificats SSL
openssl s_client -connect mon-serveur.example.com:443 -servername mon-serveur.example.com 2>/dev/null | openssl x509 -noout -dates
Aide-memoire rapide :
  • sudo apachectl configtest - Verifier la config Apache
  • php -v / php -m - Version et modules PHP
  • mysql -V - Version MySQL
  • sudo tail -f /var/log/apache2/error.log - Suivre les erreurs en temps reel
  • sudo systemctl restart apache2 php8.3-fpm mysql - Redemarrer tous les services
  • php --ini - Localiser le fichier php.ini
  • sudo ss -tlnp - Lister les ports en ecoute