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
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
- 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
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>
/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
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
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
- Telecharger XAMPP depuis
https://www.apachefriends.org/ - Executer l'installateur et choisir les composants : Apache, MySQL, PHP, phpMyAdmin
- Repertoire d'installation par defaut :
C:\xampp - 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
- Ouvrir Panneau de configuration > Programmes > Activer ou desactiver des fonctionnalites Windows
- Cocher Internet Information Services
- Dans les sous-options, cocher : CGI, ISAPI Extensions, ISAPI Filters
- 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
- Ouvrir le Gestionnaire IIS
- Selectionner le serveur > Mappages de gestionnaires
- Cliquer Ajouter un mappage de module :
- Chemin de la requete :
*.php - Module :
FastCgiModule - Executable :
C:\php\php-cgi.exe - Nom :
PHP_via_FastCGI
- Chemin de la requete :
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(); ?>
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
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.cnfou/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;
# 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
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;
- Ne jamais utiliser le compte root dans les applications, creer un utilisateur dedie par application
- Utiliser
bind-address = 127.0.0.1pour 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
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
sudo apachectl configtest- Verifier la config Apachephp -v/php -m- Version et modules PHPmysql -V- Version MySQLsudo tail -f /var/log/apache2/error.log- Suivre les erreurs en temps reelsudo systemctl restart apache2 php8.3-fpm mysql- Redemarrer tous les servicesphp --ini- Localiser le fichier php.inisudo ss -tlnp- Lister les ports en ecoute