Как перенести обновление letsencrypt с apache2 на nginx

Я унаследовал очень новую конфигурацию magento от предыдущего сотрудника (который ушел на другую работу), где я сейчас работаю. Оригинальный Magento был настроен с v2.1.8, но мне пришлось обновлять / обновлять установку несколько раз, поскольку потребности / требования проекта изменились. В результате у меня не обязательно есть все исходные файлы в том виде, в котором они были установлены (я сделал резервную основу некоторых, но после многократного изменения мне пришлось обрезать то, что я резервировал) и не обязательно спросить человека, который первоначально установил / настроил это, что он сделал.

Первоначальная настройка была просто автономной magento-CE на apache2 с https.Часть проблемы заключается в том, что теперь я использую совет Magento и настраиваю apache, чтобы просто делать http в фоновом режиме с лаковым кэшем и nginx, обрабатывающим фактические https-вещи.

Первая проблема возникла, когда сервер apache таинственным образом отключался на ночь без тарифа на вентилятор. Просто полученное сообщение SIGTERM в журнале ошибок, которое предполагало, что что-то закрывает его. Я проследил это до задания cron, запускающего сценарий обновления для letsencrypt, который пытался проверить сертификат через apache2 (который больше не делает https или не говорит на порту 443)

Теперь мне нужна информация о том, как завершить миграцию настройки, чтобы сценарий обновления работал с nginx вместо apache2. Все инструкции, которые я могу найти по настройке letsencrypt, похоже, предполагают, что вы еще ничего не сделали и у вас еще нет сертификата. Но у меня есть сертификаты, у меня просто нет nginx и letsencrypt, необходимых для правильного запуска обновления.

Я изменил /etc/letsencrypt/renewal/myhost.conf, чтобы использовать nginx вместо apache для аутентификатора. (Я также изменил строку 'installer', но не уверен, что это необходимо, так как он был установлен под apache2)

Я воссоздал файл .well-known/acme-challenge/test в корневом каталоге сервера, добавил проблему каталога и местоположения и подтвердил, что он доступен как с сервера apache на http на порту 8080, так и через кэш на nginx на порту 443 с https. (возвращая «успех» в качестве контента)

Но когда я запускаю certbot для тестирования обновления (согласно предложениям, которые я видел на различных страницах инструкций), он терпит неудачу:

# certbot renew --pre-hook "service nginx stop" -
-post-hook "service nginx start"
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/www.mydomain.com.conf
-------------------------------------------------------------------------------
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator nginx, Installer nginx
Running pre-hook command: service nginx stop
Renewing an existing certificate
Performing the following challenges:
tls-sni-01 challenge for www.mydomain.com
tls-sni-01 challenge for mydomain.com
nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)
Waiting for verification...
Cleaning up challenges
Attempting to renew cert (www.mydomain.com) from /etc/letsencrypt/renewal/www.mydomain.com.conf produced an unexpected error: Failed authorization procedure. www.mydomain.com (tls-sni-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Timeout. Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/www.mydomain.com/fullchain.pem (failure)

-------------------------------------------------------------------------------

All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/www.mydomain.com/fullchain.pem (failure)
-------------------------------------------------------------------------------
Running post-hook command: service nginx start
Hook command "service nginx start" returned error code 1
Error output from service:
Job for nginx.service failed because the control process exited with error code$ See "systemctl status nginx.service" and "journalctl -xe" for details.

1 renew failure(s), 0 parse failure(s)

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: www.mydomain.com
   Type:   connection
   Detail: Timeout

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address. Additionally, please check that
   your computer has a publicly routable IP address and that no
   firewalls are preventing the server from communicating with the
   client. If you're using the webroot plugin, you should also verify
   that you are serving files from the webroot path you provided.

Мне нужно знать, чего все еще не хватает, чтобы обновление работало правильно

0
задан 6 March 2018 в 20:05
4 ответа

Мне удалось заставить его работать, установив аутентификатор на nginx, комментируя pre_hook и меняя post_hook на systemctl start nginx до systemctl restart nginx в / etc / letsecrypt / refreshal / *. com.conf .

0
ответ дан 4 December 2019 в 16:00

Я только что переместил свой персональный сервер. Мой сервер размещен в Digital Ocean, но обычно вы можете сделать это с любым сервером, размещенным где угодно.

Вам просто нужно настроить новые блоки для nginx, содержащие ваши домены, после этого вызовите certbot

sudo certbot --nginx -d example .com -d www.example.com

Если вы также хотите перенести сертификаты на новый сервер, я резюмировал все в своем блоге здесь https://peacemoon.de/blog/2019/01/ 13 / moving-servers-and-let-encrypt-Certificates from-apache-to-nginx /

1
ответ дан 4 December 2019 в 16:00

Я сделал это для трех доменов, и это сработало, но попробуйте на свой страх и риск и сделайте резервные копии оригинальных файлов, прежде чем что-либо делать.

  • Убедитесь, что у вас действительно установлен плагин nginx . Вы можете установить его с помощью команды sudo apt-get install python-certbot-nginx
  • Edit / etc / letsencrypt / Renewal / *. Conf с помощью редактора по вашему выбору
    • Я сделал vim /etc/letsencrypt/renewal/DOMAIN.conf
  • В каждом из этих файлов есть две строки, в которых нужно заменить apache2 на nginx
    • Authenticator: nginx
    • installer: nginx

Наконец, чтобы проверить, все ли прошло хорошо, попробуйте обновить свои сертификаты с помощью

certbot --dry-run renew

. Если вы не получите никаких ошибок, это означает, что обновление прошло успешно.

0
ответ дан 4 December 2019 в 16:00

Вы можете попробовать использовать другой подход, используя универсальный аутентификатор -- автономный вместо переключения между Apache или Nginx. Однако вы столкнетесь с проблемой, поскольку они говорят: « Этот плагин должен быть привязан к порту 80, чтобы выполнить проверку домена, поэтому вам может потребоваться остановить существующий веб-сервер. ». Таким образом, если вам необходимо обновить сертификат для веб-сервера, он будет отключен на период проверки домена.

Есть решение, которое поможет вам избежать простоев:

  1. Запустить certbot с параметрами: --standalone --http-01-port 12346 — веб-сервер плагина будет запущен на порту 12346 вместо 80, поэтому вам не нужно будет останавливать свой веб-сервер.

  2. Запустите промежуточный небольшой обратный прокси, например Tinyproxy, прослушивающий порт 12345.

    Этот прокси очень легкий и простой в управлении, так что не бойтесь. Он должен прослушивать HTTP-трафик и перенаправлять запросы между двумя веб-серверами. Прокси фильтрует трафик и перенаправляет запрос проверки Let's Ecnrypt на веб-сервер плагина на порт 12346 и обычные HTTP-запросы на ваш веб-сервер.

  3. Создать перенаправление HTTP-трафика на обратный прокси-сервер с порта 80 на порт 12345 с помощью iptables и принять трафик на новые порты:

     iptables -I INPUT -p tcp -m tcp --dport 12346 -j ACCEPT
    iptables -I INPUT -p tcp -m tcp --dport 12345 -j ПРИНЯТЬ
    iptables -t nat -I PREROUTING -p tcp -m tcp ! -s 127.0.0.1/32 --dport 80 \
     -j ПЕРЕНАПРАВЛЕНИЕ --на порты 12345
     
  4. Сразу после завершения проверки удалите правила брандмауэра и остановите прокси-сервер.

Это все, что у вас есть: автоматическое продление сертификата Let's Encrypt без простоев и без изменений содержимого вашего веб-сервера.

Вы можете ознакомиться с этим рецептом здесь: https://jelastic.com/blog/zero-downtime-renewal-letsencrypt-ssl-certificate/

1
ответ дан 19 March 2021 в 11:53

Теги

Похожие вопросы