Comment résoudre l'erreur 'nginx - nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)'

Publié 27 août 2024

Problème : Erreur d'adresse déjà utilisée par NGINX

Lors du démarrage ou du redémarrage de NGINX, vous pouvez voir le message d'erreur "nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)". Cette erreur survient lorsque NGINX essaie de se lier au port 80, mais qu'un autre processus utilise déjà ce port. Cela empêche NGINX de démarrer et affecte le fonctionnement de votre serveur web.

Solutions pour résoudre l'erreur de liaison NGINX

Arrêter les services en conflit

Pour résoudre l'erreur de liaison NGINX, arrêtez les autres serveurs web ou services utilisant le port 80. Vérifiez si Apache est en cours d'exécution :

sudo systemctl status apache2

Si Apache est actif, arrêtez-le :

sudo systemctl stop apache2

Pour empêcher Apache de démarrer au démarrage du système :

sudo systemctl disable apache2

Utilisez netstat pour identifier les autres services utilisant le port 80 :

sudo netstat -tuln | grep :80

Arrêtez les services en conflit :

sudo systemctl stop nom_du_service

Modifier la configuration du port NGINX

Si l'arrêt des services ne fonctionne pas, changez le port de NGINX. Modifiez le fichier de configuration NGINX :

sudo nano /etc/nginx/nginx.conf

Trouvez la directive listen et changez-la pour un port alternatif, comme 8080 :

server {
    listen 8080;
    # Autres paramètres
}

Sauvegardez le fichier et redémarrez NGINX :

sudo systemctl restart nginx

Configurer NGINX comme proxy inverse

Configurez NGINX comme proxy inverse pour travailler avec d'autres serveurs web. Modifiez le bloc serveur dans votre configuration NGINX :

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Cette configuration transfère les requêtes à un autre serveur web fonctionnant sur le port 8080. Ajustez la directive proxy_pass selon votre configuration. Après avoir effectué les modifications, redémarrez NGINX :

sudo systemctl restart nginx

Dépannage avancé pour les erreurs de liaison persistantes

Examiner les problèmes liés à IPv6

Si vous rencontrez toujours des erreurs de liaison après avoir essayé les solutions précédentes, des problèmes liés à IPv6 peuvent en être la cause. Pour désactiver IPv6 dans la configuration NGINX, modifiez le fichier de configuration NGINX :

sudo nano /etc/nginx/nginx.conf

Changez la directive listen pour spécifier IPv4 :

listen 80 ipv4only=on;

Pour les problèmes de liaison double pile, assurez-vous que votre serveur prend en charge IPv6. Sinon, supprimez ou commentez les directives d'écoute IPv6 :

# listen [::]:80;

Résoudre les conflits de permissions et de propriété

Les problèmes de permissions et de propriété peuvent causer des erreurs de liaison. Vérifiez les permissions des fichiers NGINX :

ls -l /etc/nginx/nginx.conf

Le fichier doit appartenir à root et avoir les permissions 644. Si ce n'est pas le cas, corrigez-le :

sudo chown root:root /etc/nginx/nginx.conf
sudo chmod 644 /etc/nginx/nginx.conf

Assurez-vous que NGINX s'exécute avec l'utilisateur et le groupe corrects. Modifiez le fichier de configuration NGINX :

sudo nano /etc/nginx/nginx.conf

Vérifiez la directive user :

user www-data;

Si nécessaire, changez-la pour l'utilisateur approprié. Après avoir effectué les modifications, redémarrez NGINX :

sudo systemctl restart nginx

Ces étapes devraient aider à résoudre les erreurs de liaison persistantes liées à IPv6 et aux permissions.

Considérations supplémentaires pour la configuration de NGINX

Configurer SSL/TLS avec Certbot

Lors de la configuration de SSL/TLS avec Certbot pour HTTPS, vous pouvez rencontrer des problèmes de liaison au port 443. Pour résoudre ce problème :

  1. Vérifiez si le port 443 est utilisé :

    sudo netstat -tuln | grep :443
  2. Si un autre service utilise le port 443, arrêtez-le ou changez NGINX pour utiliser un port différent.

  3. Installez Certbot :

    sudo apt-get update
    sudo apt-get install certbot python3-certbot-nginx
  4. Exécutez Certbot pour obtenir et installer les certificats SSL :

    sudo certbot --nginx
  5. Suivez les étapes pour choisir votre domaine et décider si vous voulez rediriger le trafic HTTP vers HTTPS.

  6. Certbot modifiera votre configuration NGINX pour utiliser les certificats SSL.

  7. Testez votre configuration HTTPS en visitant votre site web en utilisant https://.

Utiliser NGINX dans des environnements Docker

Lors de l'utilisation de NGINX dans Docker, il est important de gérer correctement les conflits de ports et l'exposition des ports :

  1. Pour éviter les conflits de ports, mappez les ports du conteneur à différents ports de l'hôte :

    docker run -p 8080:80 nginx

    Cela mappe le port 80 du conteneur au port 8080 de l'hôte.

  2. Pour plusieurs conteneurs, utilisez différents ports de l'hôte :

    docker run -p 8081:80 nginx
    docker run -p 8082:80 another-nginx
  3. Dans votre Dockerfile, exposez les ports nécessaires :

    EXPOSE 80
    EXPOSE 443
  4. Avec Docker Compose, spécifiez les mappages de ports dans votre docker-compose.yml :

    services:
    nginx:
    image: nginx
    ports:
      - "8080:80"
      - "443:443"
  5. Pour les applications conteneurisées derrière NGINX, utilisez le réseau interne de Docker :

    services:
    nginx:
    image: nginx
    ports:
      - "80:80"
    app:
    image: your-app
    expose:
      - "3000"
  6. Configurez NGINX pour transférer les requêtes à votre application en utilisant le nom du service :

    location / {
    proxy_pass http://app:3000;
    }