Aller au contenu principal

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 : MySQL
  • journalctl -u service : Service systemd