Переезд WordPress сайта на https или как настроить SSL в nginx на A+

Настала пора переезжать на новый и безопасный протокол HTTPS. Большинство статей об установке SSL сертификатов и интеграции процесса переезда с Яндексом как оказалось устарели, поэтому пишу свою.

В Яндексе переезд проходит плавно, проседания трафика не замечено, ТИЦ остался тем же и на старом и на новом сайте, за две недели почти все страницы были переиндексированы со старого сайта на новый, а еще через 3 дня Вебмастер показал, что сайты склеились.

Если к страницам сайта были подключены комментарии Facebook, то они в результате переезда будут потеряны, так как формально страница будет иметь новый адрес. Комментарии ВКонтакте при этом не учитывают протокол и остаются на месте.

Порядок действий по переезду на https такой:

1. Делаем бэкап своим любимым способом:
— базы данных сайта
— файлов сайта
— настроек nginx

2. Рекомендуется обновить все пакеты на сервере. У меня на сервере стоит Centos 7 для неё команда такая:

yum update

3. Разрешим на постоянной основе соединение на SSL порт 443/tcp и перегрузим правила

firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --reload

4. Убедимся, что SSL порт 443 открыт:

firewall-cmd --zone=public --list-ports

5. Заходим на сайт https://certbot.eff.org/ Это сайт организации Let’s Encrypt, которая выдаёт SSL-сертификаты бесплатно на 90 дней с возможностью их дальнейшего автоматического продления — так чтобы один раз настроил и забыл. Выбираем там в выпадающих списках nginx и Centos/RHEL 7 — в результате чего внизу появится инструкция на английском.

6. Подключаем репозиторий EPEL (если не подключен, у меня уже подключен) и после этого устанавливаем утилиты

yum -y install yum-utils
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional

7. Устанавливаем сам Certbot — клиент для обновления сертификатов

yum install certbot-nginx

8. Запускаем первоначальную настройку Certbot

certbot --nginx

Запустится программа, которая выдаст несколько диалогов:
8.1. вводим свой email для регистрации на Let’s Encrypt
8.2. читаем и соглашаемся с условиями использования
8.3. соглашаемся или отказываемся от почтовой рассылки
8.4. программа выведет все домены настроенные в nginx — чтобы установить сертификаты для всех доменов сразу, можно просто нажать Enter или ввести номера необходимых доменов через пробел, например для site.ru и www.site.ru
8.5. программа спросит вносить ли изменения в конфиги nginx, чтобы перенаправить весь трафик с http на https — соглашаемся, то есть жмём 2 и Enter

9. Перезагружаем nginx

systemctl restart nginx

С этого момента сайты начинают работать на HTTPS. Если открыть сайт в браузере http://site.ru, то он будет перенаправлен на https://site.ru

В конфигурационных файлах доменов в nginx можно увидеть, какие изменения Certbot внёс в них. Я немного подправил их для удобочитаемости в итоге получилось следующее:

# здесь 301-й редирект с https://www.site.ru на https://site.ru
server {
    listen 443 ssl;
    server_name www.site.ru;
    rewrite ^ https://site.ru$request_uri? permanent;

    ssl_certificate /etc/letsencrypt/live/site.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/site.ru/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

# здесь 301-й редирект с http://www.site.ru на https://site.ru
server {
    listen www.site.ru:80;
    server_name www.site.ru;
    rewrite ^ https://site.ru$request_uri? permanent;
}

# здесь 301-й редирект с http://site.ru на https://site.ru
server {
    listen site.ru:80;
    server_name site.ru;
    rewrite ^ https://site.ru$request_uri? permanent;
}

# здесь основная конфигурация https://site.ru
server {
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/site.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/site.ru/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    server_name site.ru;
    # здесь идут дальнейшие директивы
}

Если на сервере несколько сайтов, то для всех кроме одного можно из бэкапа вернуть конфиги nginx на время пока делаются дальнейшие настройки по переезду. И далее настраивать HTTPS только для одного сайта, а остальные пока будут доступны по HTTP. Кстати, несколько https-сайтов на одном сервере могут спокойно работать через один ip-адрес благодаря технологии Server Name Indication (SNI), которую поддерживает nginx и все современные браузеры.

10. Вносим дополнения в файл /etc/letsencrypt/options-ssl-nginx.conf который подключается в конфигурации nginx выше. Они нам позволят увеличить SSL-рейтинг сайта с A до A+

# эти директивы задал сам Certbot
ssl_session_cache shared:le_nginx_SSL:10m; # здесь я увеличил значение с 1 до 10
ssl_session_timeout 1440m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";

# эти директивы я добавил
ssl on;
add_header Strict-Transport-Security "max-age=31536000;";
resolver 8.8.8.8 8.8.4.4 valid=300s;
ssl_stapling on;
ssl_stapling_verify on;
resolver_timeout 10s;

И вновь перезагружаем nginx. Проверить SSL-рейтинг сайта можно здесь: https://www.ssllabs.com/ssltest/ — там в поле вписать свой домен.

11. Заменим в исходных кодах сайта конструкцию http://site.ru на https://site.ru, где site.ru — наш домен. Для этого можно открыть файл бэкапа базы данных сайта в любимом текстовом редакторе и сделать автозамену http://site.ru на https://site.ru. Затем необходимо импортировать измененный бэкап на сервер БД. После этой манипуляции в WordPress может слететь:
— настройка вывода меню, которая настраивается во Внешний вид — Меню — Управление областями
— фоновое изображение сайта, если оно было назначено средствами WordPress — настраивается во Внешний вид — Фон — Фоновое изображение
— текстовые виджеты в сайдбаре и подвале — они теряются бесследно, поэтому перед импортом изменённой базы данных их лучше где-то сохранить, чтобы потом можно было восстановить как было

12. Аналогично поступаем со всеми файлами сайта, в файлах с расширениями html, php, js, css ищем и заменяем все включения http://site.ru на https://site.ru

13. Заходим в админку WordPress в раздел «Настройки» — «Общие» и проверяем, что там в двух полях указано https://site.ru

14. Если в WordPress используется какой-то плагин для автоматической генерации карты сайта, то перегенерируем карту сайта, чтобы ссылки внутри нее стали с протоколом https.

15. В файле robots.txt нашего сайта в директивах host и sitemap меняем http на https вот так:

Sitemap: https://site.ru/sitemap.xml  
Host: https://site.ru

16. Добавим до тега </head> на страницах сайта нижеследующий код. Он необходим для правильной передачи реферрера сторонним сайтам.

<meta name="referrer" content="origin">

17. Если к сайту подключены скрипты сторонних сервисов:
— ВКонтакте: https://vk.com/apps?act=manage в Настройках приложения для сайта меняем адрес сайта на https
— Facebook https://developers.facebook.com/apps/ в Настройках приложения для сайта меняем адрес сайта на https
— социальные кнопки Share42 http://share42.com/ru — перегенерировать код и заменить его на сайте
— комментарии ВКонтакте для сайта https://vk.com/dev/Comments — перегенерировать код и заменить на сайте
— комментарии FaceBook для сайта https://developers.facebook.com/docs/plugins/comments/?locale=ru_RU — перегенерировать код и заменить на сайте
— виджет группы Одноклассники для сайта https://apiok.ru/ext/group — перегенерировать код и заменить на сайте
— виджет группы Facebook для сайта https://developers.facebook.com/docs/plugins/page-plugin — перегенерировать код и заменить на сайте
— виджет группы ВКонтакте для сайта https://vk.com/dev/Community — перегенерировать код и заменить на сайте

18. Запустим в Вебмастере Mail.ru переезд сайта на https https://webmaster.mail.ru
— зайти в Настройки сайта и отметить галочку Показывать «https»

19. Запустим в Вебмастере Bing переезд сайта на https https://www.bing.com/webmaster/home/mysites
— Заходим в Средства диагностики — Перемещение сайта и выбираем:

  • «Я перемещаю URL-адреса из одного места на текущем сайте в другое (site.ru).»
  • Область: Каталог
  • Исходный: http://site.ru
  • Конечный: https://site.ru
    • — Заходим в Настройка сайта — Sitemaps и добавляем ссылку на xml-карту сайта: https://site.ru/sitemap.xml

      20. Запустим в Яндекс.Вебмастере переезд сайта на https. Где-то с марта 2018 года Яндекс отказался от использования директивы host в файле robots.txt в качестве определяющего фактора при переезде сайта на HTTPS и теперь рекомендует для склейки доменов http и https просто установить 301-й редирект со всех страниц в http на аналогичные им страницы в https. Таким образом теперь механизм переезд сайта на Яндекс аналогичен механизму переезда сайта на Google.
      — Заходим в Вебмастер https://webmaster.yandex.ru/ и добавляем новый сайт https://site.ru
      — Для сайта https заходим в Индексирование — Файлы Sitemap и добавляем ссылку на xml-карту сайта: https://site.ru/sitemap.xml
      — Для сайта http заходим в Индексирование — Переезд сайта, отмечаем галочку Добавить HTTPS и нажимаем Сохранить

      21. Запустим в Google Serch Console переезд сайта на https https://www.google.com/webmasters/tools/home?hl=ru&authuser=0
      — Заходим в Вебмастер и нажимаем Добавить ресурс, вводим https://site.ru
      — Для сайта https заходим в Сканирование — Файлы Sitemap и добавляем ссылку на xml-карту сайта: https://site.ru/sitemap.xml

      22. Настроим бэкап папки /etc/letsencrypt Создадим файл le.sh со следующим содержимым:

      #!/bin/sh
      date_time=`date +"%Y-%m-%d_%H-%M"`
      le_dir='/mnt/disk_backup/letsencrypt'
      tar -czvf $le_dir/le_$date_time.tar.gz -C /etc/ letsencrypt
      /usr/bin/find $le_dir -type f -mtime +30 -exec rm {} \;
      #хранить файлы не старше 30 дней
      

      23. Настроим автопродление сертификатов. На сайте производителя рекомендуется запускать обновление сертификатов дважды в сутки, при этом обновятся сертификаты не ранее, чем за 30 дней до окончания срока своего действия, который составляет 90 дней. Добавим в cron строки:

      0 0 * * * root /usr/bin/certbot renew --allow-subset-of-names --post-hook 'nginx -s reload'
      1 12 * * * root /usr/bin/certbot renew --allow-subset-of-names --post-hook 'nginx -s reload'
      # запустит команду в 00:00 и в 12:01
      # renew - обновит сертификаты
      # --allow-subset-of-names - обновит сертификаты даже если один из доменов был удалён с сервера
      # --post-hook 'nginx -s reload' - перезагрузит nginx после обновления сертификатов
      
      0 2 * * * root /backup/le.sh >/dev/null 2>&1
      # запустит скрипт бэкапа папки letsencrypt в 02:00 и отработает тихо без лишних сообщений
      

      После каждого запуска обновления сертификатов в каталоге /var/log/letsencrypt создаётся log-файл, количество которых ограничено 100 штуками и не регулируется.

      24. Перезагрузим cron

      systemctl restart crond.service
      

      P.S.

      Со временем нам может понадобиться получить SSL-сертификат для нового домена, для этого:

      1. Вновь запускаем настройку Certbot

      certbot --nginx
      

      Запустится программа, которая задаст два вопроса:
      1.1. программа выведет все домены настроенные в nginx — здесь вводим через пробел номера новых доменов newdomain.ru и www.newdomain.ru и нажимаем Enter
      1.2. программа спросит вносить ли изменения в конфиги nginx, чтобы перенаправить весь трафик с http на https — соглашаемся

      2. В конфигурационном файле домена в nginx можно увидеть, какие изменения Certbot внёс в него. Можно подправить его для удобочитаемости аналогично тому, как я сделал это выше в пункте 9. При этом следует обратить внимание на директивы ssl_certificate и ssl_certificate_key — пути до ключей в них будут отличаться от путей для ранее добавленных доменов.

      3. Перезагружаем nginx

      systemctl restart nginx
      

      С этого момента сайт работает на HTTPS. Если открыть сайт в браузере http://www.newdomain.ru, то он будет перенаправлен на https://newdomain.ru

      Обновление сертификата для нового домена будет происходить согласно ранее сделанным настройкам автопродления сертификатов в пункте 23.

      P.P.S.

      Посмотреть какие SSL-сертификаты установлены в системе и сколько дней они ещё действительны можно такой командой:

      certbot certificates
      

      А изменить состав доменов, содержащихся в сертификате или даже заменить домены полностью можно такой командой:

      certbot certonly --cert-name site.ru -d site.com,www.site.com
      

      Поделиться статьей:  

Поделитесь своим мнением

Правила сообщений

Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Копирование материалов разрешено только с указанием источника и прямой индексируемой ссылкой на оригинал.
Яндекс.Метрика
© 2018 Хороший отзыв · Искусство выбирать · Лично · Разумно · Честно