Impossible de lancer NGINX : erreur sur le binding du port 80

Ah NGINX, mon amour ! Je ne suis pas du tout sarcastique quand je le dis comme ça, car c’est vraiment un logiciel que j’apprécie. J’ai commencé avec Apache 2 HTTP Server et testé d’autres logiciels de serveurs web comme Caddy, et même FrankenPHP qui est basé sur ce dernier. Cependant, je suis toujours revenu à NGINX qui après des années de pratique ne pose plus aucun souci et fonctionne parfaitement pour mes besoins. À condition bien sûr, qu’il soit bien configuré.

Mes récents articles sur NGINX amènent pas mal de visiteurs et si je peux vous aider a résoudre votre problème avec ce logiciel de serveur web, c’est avec grand plaisir ! Si vous rencontrez une erreur 413 ou encore que vous voulez apprendre à installer WordPress sur NGINX je vous conseille d’aller faire un tour sur ces articles. Il y en a bien évidemment beaucoup d’autres sur NGINX, mais ce ne serait pas très pertinent de tous les lister ici. Aujourd’hui, on va parler d’une nouvelle erreur qui pourrait potentiellement vous arriver avec ce logiciel de serveur web. Si vous êtes arrivé ici, c’est sûrement parce que vous avez tapé dans un moteur de recherche quelque chose qui ressemble à ça :

  • Nginx bind to 0.0.0.0:80 failed
  • Nginx port 80 binding error
  • Nginx start failure unknown error port 80
  • Nginx emerg bind failed error 98
  • Nginx port 80 binding issues

Rassurez vous, vous êtes au bon endroit et vous devriez trouver la solution à votre problème avec NGINX.

L’erreur qui empêche NGINX de démarrer

Pour faire simple, si NGINX n’a pas démarré automatiquement ou que vous essayez de lancer le serveur à la main. Si vous tentez de regarder le statut de NGINX avec cette commande :

sudo systemctl status nginx.service

Vous devriez alors obtenir ce message d’erreur assez gros et pas très rassurant à première vue :

× nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Fri 2024-01-19 16:39:01 UTC; 21s ago
   Docs: man:nginx(8)
   Process: 658 ExecStartPre=/usr/sbin/nginx -t -q -g "daemon on; master_process on;" (code=exited, status=0/SUCCESS)
   Process: 758 ExecStart=/usr/sbin/nginx -g "daemon on; master_process on;" (code=exited, status=1/FAILURE)
   CPU: 70ms

   Jan 19 16:39:00 mysite nginx[758]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
   Jan 19 16:39:00 mysite nginx[758]: nginx: [emerg] bind() to [::]:80 failed (98: Unknown error)
   Jan 19 16:39:00 mysite nginx[758]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
   Jan 19 16:39:00 mysite nginx[758]: nginx: [emerg] bind() to [::]:80 failed (98: Unknown error)
   Jan 19 16:39:01 mysite nginx[758]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
   Jan 19 16:39:01 mysite nginx[758]: nginx: [emerg] bind() to [::]:80 failed (98: Unknown error)
   Jan 19 16:39:01 mysite nginx[758]: nginx: [emerg] still could not bind()
   Jan 19 16:39:01 mysite systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
   Jan 19 16:39:01 mysite systemd[1]: nginx.service: Failed with result 'exit-code'.
   Jan 19 16:39:01 mysite systemd[1]: Failed to start A high performance web server and a reverse proxy server.

C’est quoi cette erreur bind() [::]:80 failed ?

Maintenant, que vous avez bien vérifié que vous avez bien la bonne erreur qui vous a amené ici, tentons de comprendre ce qu’il se passe sur votre serveur web sous Linux. Quand vous débutez, il est possible de la rencontrer lorsque vous installez NGINX pour la première fois sur votre serveur et vous allez comprendre pourquoi.

L’erreur que vous rencontrez avec le service NGINX est liée à un problème de liaison (binding) du serveur au port 80. La partie qui nous intéresse dans l’erreur est la suivante : nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error) et nginx: [emerg] bind() to [::]:80 failed (98: Unknown error). Cela signifie que NGINX tente de se lier au port 80 sur toutes les interfaces réseau IPv4 (0.0.0.0) et IPv6 ([::]), mais échoue en raison d’une erreur inconnue. On va trouver la raison et résoudre ce problème en fouillant ce qui tourne sur le port 80.

Vérifier les services et programmes qui occupent le port 80

On va maintenant chercher à identifier ce qui tourne déjà sur le port 80. Pour cela, rien de plus simple, cette commande devrait vous donner ce renseignement :

sudo lsof -i :80

Dans mon cas, elle m’a renvoyé le résultat suivant qui ne laisse pas vraiment de place au doute :

COMMAND PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2 748     root    4u  IPv6  19736      0t0  TCP *:http (LISTEN)
apache2 766 www-data    4u  IPv6  19736      0t0  TCP *:http (LISTEN)
apache2 767 www-data    4u  IPv6  19736      0t0  TCP *:http (LISTEN)
apache2 768 www-data    4u  IPv6  19736      0t0  TCP *:http (LISTEN)
apache2 769 www-data    4u  IPv6  19736      0t0  TCP *:http (LISTEN)
apache2 770 www-data    4u  IPv6  19736      0t0  TCP *:http (LISTEN)

Certains fournisseurs de VPS installent par défaut Apache2 lorsqu’ils vous livrent le serveur virtuel. Si vous ne vérifiez pas avant d’installer NGINX et d’activer avec votre premier site web, vous tombez directement dans le cas qui m’a amené à faire cet article pour vous aider. Attention, le résultat sera peut-être différent sur votre serveur Linux, mais vous savez maintenant ce qui occupe déjà le port 80 et bloque le lancement de NGINX.

Résoudre l’erreur NGINX bind to 80 failed

Pour corriger ce problème, cela va dépendre des cas de figure. Dans le cas le plus simple, il faut libérer le port 80 pour que NGINX puisse enfin se lancer convenablement. Je dis que ça dépend, car pour ma part, je n’ai pas besoin d’avoir un Apache2 qui tourne, donc c’est « simple à réparer ». Dans votre situation, vous allez peut-être avoir un autre cas de figure. Il faudra donc faire en conséquence, mais ce sera l’objet d’un autre article et les possibilités sont très variées selon ce qui tourne sur votre serveur. Au moins, vous connaissez maintenant la raison, il s’agit d’un conflit sur le port 80 de votre serveur.

N’ayant pas besoin d’Apache2, je vais donc simplement le mettre en veille sur mon serveur avec la suite de commandes suivante. Je coupe le service Apache2 :

sudo systemctl stop apache2

Je supprime la règle de démarrer Apache2 au démarrage :

sudo systemctl disable apache2

Si vous n’en avez vraiment plus du tout besoin, vous pouvez ensuite désinstaller totalement Apache2 comme n’importe quel programme pour faire un ménage complet. Pour terminer, je tente de relancer NGINX :

sudo systemctl start nginx

Bingo, plus aucune erreur ! Je regarde alors son statut pour vérifier que tout est bon :

sudo systemctl status nginx

Cette commande me renvoie cette fois du vert, tout va bien :

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-01-19 16:45:31 UTC; 1 week 6 days ago
       Docs: man:nginx(8)
   Main PID: 750 (nginx)
      Tasks: 3 (limit: 2309)
     Memory: 15.1M
        CPU: 25.812s
     CGroup: /system.slice/nginx.service
             ├─750 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─751 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" 
             └─752 "nginx: worker process" "" "" "" "" "" "" "" "" "" ""
             
Jan 19 16:45:30 mysite systemd[1]: Starting A high performance web server and a reverse proxy server...
Jan 19 16:45:31 mysite systemd[1]: Started A high performance web server and a reverse proxy server.

Dans un dernier contrôle, je revérifie mon port 80 pour voir si tout est bien bon :

sudo lsof -i :80
COMMAND PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   750     root    6u  IPv4  18963      0t0  TCP *:http (LISTEN)
nginx   750     root    7u  IPv6  18964      0t0  TCP *:http (LISTEN)
nginx   751 www-data    6u  IPv4  18963      0t0  TCP *:http (LISTEN)
nginx   751 www-data    7u  IPv6  18964      0t0  TCP *:http (LISTEN)
nginx   752 www-data    6u  IPv4  18963      0t0  TCP *:http (LISTEN)
nginx   752 www-data    7u  IPv6  18964      0t0  TCP *:http (LISTEN)

Voilà, vous avez résolu cette erreur qui empêchait NGINX de démarrer sur votre serveur web, vous pouvez maintenant vous concentrer sur l’optimisation de NGINX pour vos sites et applications web soient ultrarapides et sécurisés !

Laisser un commentaire