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 !