Erreurs fréquentes par service
Ce guide recense les erreurs les plus courantes et leurs solutions pour chaque service.
Nginx
502 Bad Gateway
Cause : Le backend (PHP-FPM, Node.js, etc.) ne répond pas.
# Vérifier PHP-FPM
systemctl status php8.1-fpm
# Vérifier les logs
tail -50 /var/log/nginx/error.log
Solutions :
# Redémarrer PHP-FPM
sudo systemctl restart php8.1-fpm
# Vérifier le socket
ls -la /run/php/php8.1-fpm.sock
504 Gateway Timeout
Cause : Le backend met trop de temps à répondre.
Solutions :
# Dans nginx.conf ou le bloc location
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
# Pour PHP-FPM
fastcgi_read_timeout 300;
403 Forbidden
Cause : Problème de permissions ou configuration.
# Vérifier les permissions
ls -la /var/www/html/
# Corriger
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
Vérifier la config Nginx :
location / {
index index.html index.php;
try_files $uri $uri/ =404;
}
413 Request Entity Too Large
Cause : Fichier uploadé trop gros.
# Dans nginx.conf
client_max_body_size 100M;
Configuration invalide
# Tester la configuration
sudo nginx -t
# Voir l'erreur détaillée
sudo nginx -T
Apache
AH00558: Could not reliably determine the server's fully qualified domain name
sudo nano /etc/apache2/apache2.conf
Ajouter :
ServerName localhost
AH01630: client denied by server configuration
Cause : Directive Require manquante.
<Directory /var/www/html>
Require all granted
</Directory>
AH01071: Got error 'Primary script unknown'
Cause : PHP-FPM ne trouve pas le fichier.
# Vérifier que le fichier existe
ls -la /var/www/html/index.php
# Vérifier la config PHP-FPM
cat /etc/php/8.1/fpm/pool.d/www.conf | grep "listen ="
PHP-FPM
Unable to open primary script
# Vérifier les permissions
sudo chown -R www-data:www-data /var/www/
# Vérifier que le pool écoute
ss -ln | grep php
Max children reached
Cause : Trop de requêtes simultanées.
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
Allowed memory size exhausted
sudo nano /etc/php/8.1/fpm/php.ini
memory_limit = 256M
sudo systemctl restart php8.1-fpm
MySQL / MariaDB
Access denied for user
# Se connecter en root
sudo mysql
# Créer/modifier un utilisateur
ALTER USER 'user'@'localhost' IDENTIFIED BY 'nouveau_mot_de_passe';
FLUSH PRIVILEGES;
Too many connections
# Voir les connexions actuelles
sudo mysql -e "SHOW PROCESSLIST;"
# Tuer les connexions dormantes
sudo mysql -e "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE command = 'Sleep' AND time > 300;"
Augmenter la limite :
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
max_connections = 200
Table is marked as crashed
# Réparer une table
mysqlcheck -r nom_base nom_table -u root -p
# Réparer toutes les tables
mysqlcheck --repair --all-databases -u root -p
InnoDB: Unable to lock ./ibdata1
Cause : Plusieurs instances MySQL ou crash.
# Vérifier les processus
ps aux | grep mysql
# Tuer et redémarrer proprement
sudo systemctl stop mysql
sudo killall -9 mysqld
sudo systemctl start mysql
Can't connect to local MySQL server through socket
# Vérifier que MySQL tourne
systemctl status mysql
# Vérifier le socket
ls -la /var/run/mysqld/mysqld.sock
# Redémarrer
sudo systemctl restart mysql
Node.js
EADDRINUSE: address already in use
Cause : Le port est déjà utilisé.
# Trouver le processus
sudo lsof -i :3000
sudo ss -tlnp | grep 3000
# Tuer le processus
kill -9 PID
ENOMEM: not enough memory
Solutions :
# Augmenter le swap
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# Limiter la RAM de Node
node --max-old-space-size=512 app.js
EACCES: permission denied
# Éviter de lancer en root
# Utiliser un port > 1024 ou configurer les capabilities
sudo setcap 'cap_net_bind_service=+ep' $(which node)
Docker
Cannot connect to the Docker daemon
# Vérifier le service
sudo systemctl status docker
sudo systemctl start docker
# Vérifier les permissions
sudo usermod -aG docker $USER
# Déconnectez-vous et reconnectez-vous
No space left on device
# Nettoyer Docker
docker system prune -af
docker volume prune -f
# Vérifier l'espace
df -h
Container keeps restarting
# Voir les logs
docker logs --tail 100 nom_container
# Inspecter
docker inspect nom_container | grep -A 10 "State"
Port already allocated
# Trouver le conteneur utilisant le port
docker ps | grep PORT
# Ou trouver le processus hôte
sudo lsof -i :PORT
SSH
Connection refused
# Vérifier le service
sudo systemctl status sshd
# Vérifier le port
sudo ss -tlnp | grep ssh
# Vérifier le firewall
sudo ufw status
Permission denied (publickey)
# Vérifier les permissions
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_*
# Vérifier le propriétaire
chown -R $USER:$USER ~/.ssh
Host key verification failed
# Supprimer l'ancienne clé
ssh-keygen -R IP_DU_SERVEUR
Fail2ban
ERROR: NOK: ('sshd',)
# Vérifier la syntaxe
sudo fail2ban-client -d
# Vérifier les filtres
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
Unable to find a corresponding IP address
# Vérifier le backend
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
backend = systemd
# ou
backend = auto
Let's Encrypt / Certbot
Challenge failed
# Vérifier que le port 80 est ouvert
sudo ufw allow 80/tcp
# Vérifier que .well-known est accessible
curl http://votredomaine.com/.well-known/acme-challenge/test
Configuration Nginx :
location /.well-known/acme-challenge/ {
root /var/www/html;
}
Too many certificates already issued
Attendez la fin du rate limit (1 semaine) ou utilisez le staging :
sudo certbot certonly --staging -d votredomaine.com
UFW Firewall
ERROR: Could not find a profile matching
# Lister les profils disponibles
sudo ufw app list
# Utiliser le port directement
sudo ufw allow 22/tcp
# au lieu de
sudo ufw allow OpenSSH
UFW ne bloque pas
# Vérifier l'ordre des règles
sudo ufw status numbered
# Les règles sont évaluées dans l'ordre
# Une règle allow en premier bloque les deny suivants
Commandes de diagnostic universelles
# Logs système récents
sudo journalctl -xe
# Logs d'un service
sudo journalctl -u nom_service -n 100
# Dernières erreurs système
dmesg | tail -50
# Tous les services en échec
systemctl --failed
Conseil
Toujours vérifier les logs en premier :
/var/log/syslog: Logs système/var/log/nginx/error.log: Nginx/var/log/apache2/error.log: Apache/var/log/mysql/error.log: MySQLjournalctl -u service: Service systemd