SystemD ne tue pas correctement NGinX via le pre-hook de certbot

Tags: #<Tag:0x00007f63f3717b50> #<Tag:0x00007f63f3717830>

Salut,

Lorsque je fais un:

systemctl stop nginx

Aucun message d’erreur, je peux aussi le start sans problème.

Cependant, lors d’un certbot renew en dry-run, le pre-hook qui est censé stopper NGinX ne fait pas correctement le travail puisque le post hook plante en disant dans les logs de journalctl:

certbot renew --dry-run --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"

(...)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] still could not bind()
(...)

Et ps me montre qu’effectivement le processus maître est toujours là:

# ps faux | grep "nginx"
root      461300  0.0  0.0   5912   652 pts/0    S+   08:20   0:00  |                   \_ grep nginx
root      461178  0.0  0.0   5520  2312 pts/1    S+   08:15   0:00                      \_ less /etc/init.d/nginx
root      461236  0.0  0.2  65296  9764 ?        Ss   08:18   0:00 nginx: master process nginx -c /etc/nginx/nginx.conf
www-data  461268  0.0  0.1  65296  6724 ?        S    08:19   0:00  \_ nginx: worker process
www-data  461269  0.0  0.1  65296  4008 ?        S    08:19   0:00  \_ nginx: worker process
www-data  461270  0.0  0.1  65296  4008 ?        S    08:19   0:00  \_ nginx: worker process
www-data  461271  0.0  0.1  65296  4008 ?        S    08:19   0:00  \_ nginx: worker process

Je dois le tuer pour pouvoir démarrer NGinX à nouveau.

Un peu problématique pour automatiser mon renouvellement de certificats SSL.


En googlant un peu j’ai lu que le problème pouvait être qu’nginx.pid (par défaut chez moi /run/nginx.pid) définit dans /etc/nginx/nginx.conf pouvait différer de celui inscrit dans /etc/init.d/nginx.

Or, ils sont bien tout deux définit sur /run/nginx.pid. Quand NGinX est bien fonctionnel il est bien là.

Une idée ?


Solution de contournement temporaire que j’ai cru pouvoir mettre en place, mais qui ne marche pas:

systemctl stop nginx && certbot renew --dry-run && systemctl start nginx

Donc je dirai que certbot fout un peu le merdier quelque part.

Bonjour,

Pour ton renouvellement de certificat, tu demandes à certbot de démarrer un serveur web, coupant celui qui est actuellement en service.
Je ne sais pas si tu as une bonne raison de faire ça, mais je trouve quand même plus simple d’utiliser directement celui qui est lancé : nginx.
Tu peux demander à certbot de mettre un fichier dans le dossier servi par ton serveur avec l’option --webroot.
Par exemple, pour ajouter mon domaine mail.almtesh.net, j’ai utilisé la commande

certbot certonly --webroot -w /srv/www/almtesh.net -d mail.almtesh.net

et mon serveur web est configuré pour exposer le dossier /srv/www/almtesh.net pour les requêtes en HTTP sur le domaine mail.almtesh.net.

Ce que je fais aussi, pour éviter de redémarrer le serveur s’il n’y a aucun renouvellement, c’est de faire un truc du genre

if [ $(date '+%s' --date=yesterday) -lt $(stat --printf='%Y' /etc/letsencrypt/live/mail.almtesh.net/fullchain.pem) ];then
	systemctl restart apache2 dovecot postfix@-
fi
1 J'aime