Служба Nginx, которая не была правильно остановлена ​​certbot и поэтому не перезапускается - PullRequest
0 голосов
/ 14 декабря 2018

У меня небольшие проблемы с работой моего VPS с Debian.Он размещает несколько веб-сайтов через инфраструктуру, основанную на nginx, gunicorn, django.У рассматриваемых сайтов есть ssl-сертификат, управляемый давайте шифровать.

Я думаю, что проблема возникает, когда шифрование хочет обновить сертификаты.

Ошибка

Системный журнал при появлении ошибки:

Dec 12 00:01:46 vps465872 systemd[1]: Starting Certbot...
Dec 12 00:01:49 vps465872 systemd[1]: Stopping A high performance web server and a reverse proxy server...
Dec 12 00:01:49 vps465872 systemd[1]: Stopped A high performance web server and a reverse proxy server.
Dec 12 00:01:55 vps465872 certbot[600]: nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)
Dec 12 00:01:56 vps465872 systemd[1]: Starting A high performance web server and a reverse proxy server...
Dec 12 00:01:56 vps465872 nginx[658]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Dec 12 00:01:56 vps465872 nginx[658]: nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
Dec 12 00:01:57 vps465872 nginx[658]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Dec 12 00:01:57 vps465872 nginx[658]: nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
Dec 12 00:01:57 vps465872 nginx[658]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Dec 12 00:01:57 vps465872 nginx[658]: nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
Dec 12 00:01:58 vps465872 nginx[658]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Dec 12 00:01:58 vps465872 nginx[658]: nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
Dec 12 00:01:58 vps465872 nginx[658]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Dec 12 00:01:58 vps465872 nginx[658]: nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
Dec 12 00:01:59 vps465872 nginx[658]: nginx: [emerg] still could not bind()
Dec 12 00:01:59 vps465872 systemd[1]: nginx.service: Control process exited, code=exited status=1
Dec 12 00:01:59 vps465872 systemd[1]: Failed to start A high performance web server and a reverse proxy server.
Dec 12 00:01:59 vps465872 systemd[1]: nginx.service: Unit entered failed state.
Dec 12 00:01:59 vps465872 systemd[1]: nginx.service: Failed with result 'exit-code'.
Dec 12 00:01:59 vps465872 certbot[600]: Hook command "service nginx start" returned error code 1
Dec 12 00:01:59 vps465872 certbot[600]: Error output from service:
Dec 12 00:01:59 vps465872 certbot[600]: Job for nginx.service failed because the control process exited with error code.
Dec 12 00:01:59 vps465872 certbot[600]: See "systemctl status nginx.service" and "journalctl -xe" for details.

Воспроизведение

Да будет так.Давайте повторим процесс вручную.Я убиваю все, что находится вокруг nginx:

ps -ef |grep nginx
kill -9 xxxx
kill -9 xxxx

Я перезапускаю nginx:

service nginx start

, тогда все работает нормально.

Я выполняю пробный запуск certbot:

certbot renew --dry-run

и теперь у меня ошибка:

Attempting to renew cert (xxx.fr) from /etc/letsencrypt/renewal/xxx.fr.conf produced an unexpected error: Problem binding to port 443: Could not bind to IPv4 or IPv6... Skipping.

Расследование

Я смотрю в каталоге / run: файлnginx.pid больше не существует.

С другой стороны, небольшой ps -ef | grep nginx говорит мне, что процесс все еще работает, действительно, веб-сайты работают.Поэтому, если я запускаю nginx start service , он выводит мне сообщение об ошибке конфликта адресов.

Я обнаружил, что люди в стеке переполнены той же проблемой, что и я, но решения не работают.Но это дало мне подсказки, где искать. Обновление Certbot: nginx: [ошибка] open () Ошибка «/run/nginx.pid» (2: Нет такого файла или каталога)

, поэтому я смотрю: файлы /etc / letsencrypt / renewal / xxx.fr.conf содержит следующие хуки:

[renewalparams]
authenticator = standalone
installer = nginx
pre_hook = service nginx stop
post_hook = service nginx start

Очень хорошо.Я смотрю на связанные сценарии /etc/init.d/nginx: в самом начале он извлекает pid через

PID=$(cat /etc/nginx/nginx/nginx.conf | grep -Ev' ^\s*#' | awk' BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1)

, эта команда работает хорошо.

для остановки:

stop_nginx() {
    start-stop-daemon --stop --quiet --retry=$STOP_SCHEDULE --pidfile $PID --name $NAME
    RETVAL="$?"
    sleep 1
    return "$RETVAL"
}

для начала

start_nginx() {
    start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON --test > /dev/null \
        || return 1
    start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON -- \
        $DAEMON_OPTS 2>/dev/null \
        || return 2
}

Похоже, это хорошо.Более того, когда служба работает хорошо со своим pid, команды start и stop работают очень хорошо.

Заключение

Ну, вот и все, вот я спроблема, которую я не понимаю

1 Ответ

0 голосов
/ 14 декабря 2018

Я могу рекомендовать использовать режим webroot вместо автономного режима.Чтобы обновить сертификаты, он создает «.well-known / acme-challenge /» в корневом каталоге вашего веб-сервера.

Перевернутый - меньше времени простоя, так как вместо «stop-wait-start» вам просто нужно перезапуститьслужба nginx через post_hook

Надеюсь, что это альтернативное решение поможет

...