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

Статья обновлена 16 января 2021 года.

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

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

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

Порядок действий по переезду на 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

7.1 Определим, какие плагины certbot установлены (нам нужен плагин nginx)

certbot plugins

Если плагина nginx нет, то его нужно установить.

7.2 Устанавливаем плагин certbot-nginx (pip3 - это менеджер пакетов Pyton версии 3, так как certbot написан на языке Pyton)

pip3 install certbot-nginx

7.3 Проверим ещё раз, какие плагины certbot установлены

certbot plugins

Плагин nginx должен появиться.

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

certbot --nginx

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

С этого момента отмеченные на предыдущем шаге сайты начинают работать на 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 и все современные браузеры.

9. После внесения исправлений в конфигурационные файлы nginx для домена, перезагружаем nginx

systemctl restart nginx

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

# эти директивы задал сам Certbot (здесь стоит только увеличить значение ssl_session_cache до 50m)
ssl_session_cache shared:le_nginx_SSL:50m;
ssl_session_timeout 1440m;
ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;

ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

# эти директивы я добавил
# ssl on; # устарела с версии nginx 1.15.0
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
- социальные кнопки Share42 http://share42.com/ru - перегенерировать код и заменить его на сайте
- комментарии ВКонтакте для сайта https://vk.com/dev/Comments - перегенерировать код и заменить на сайте
- виджет группы Одноклассники для сайта https://apiok.ru/ext/group - перегенерировать код и заменить на сайте
- виджет группы ВКонтакте для сайта 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

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

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

3. Перезагружаем nginx после внесённых изменений

systemctl restart nginx

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

P.P.S.

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

certbot certificates

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

// в сертификате с именем site.ru заменяет содержащиеся в нём домены на site.com и www.site.com
certbot certonly --cert-name site.ru -d site.com,www.site.com

// в сертификате с именем site.ru заменяет содержащиеся в нём домены на site.ru, www.site.ru, pdd.site.ru и www.pdd.site.ru (по сути добавляет поддомен pdd.site.ru к уже имеющемуся сертификату домена site.ru)
certbot certonly --cert-name site.ru -d site.ru,www.site.ru,pdd.site.ru,www.pdd.site.ru

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

Читайте также статьи из ITИнтернет технологии:

Обсуждение: есть 1 комментарий
  1. Dmitry Pavlenko:

    Спасибо за статью. Всё просто и ясно изложено и разложено по пунктам. Это лучшая инструкция по переезду с http на https. Отдельное спасибо за информацию о настройках в Вебмастере. Сделал всё по вашему руководству. Надеюсь, что переезд пройдет без проседаний трафика.

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

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

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

Хороший отзыв
Разумно · Дельно · Опытно · Идейно
Яндекс.Метрика
© 2016 - 2024 Хороший отзыв · Разумно · Дельно · Опытно · Идейно