Назад | Перейти на главную страницу

Как перенести обновление 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 для аутентификатора. (Я также изменил строку «установщик», но не уверен, что это необходимо, поскольку она была установлена ​​под 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.

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

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

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

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

certbot --dry-run renew

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

Мне удалось заставить его работать:

  1. установка аутентификатора на nginx
  2. комментирование скрипта pre_hook
  3. редактирование скрипта post_hook путем изменения systemctl start nginx к systemctl restart nginx в /etc/letsecrypt/renewal/*.com.conf.

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

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

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

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