Разворачиваем WordPress за Nginx Proxy Manager
Сейчас вечер, из колонки звучит Ambient-музыка, приглушенный свет, а это значит что самое время поговорить про терминацию SSL и установку WordPress за Nginx Proxy Manager.
Уже довольно продолжительное время поисковые системы начали пессимизировать в результатах поиска те сайты, который отдают контент без шифрования по протоколу HTTP. А так как основная масса контента это блоги в той или иной форме, напомню, что 43% всего интернета – это WordPress – то задача подключения HTTPS к WordPress становится вполне актуальной.
Думаем
Как решать эту задачу – зависит прежде всего от того, а что собственно вам надо. Если у вас маленький бложик на WordPress и нужно просто “добавить SSL”, чтобы поисковики не ругались – то у любого уважающего себя хостера можно это сделать в панельке за пару минут. И наверное вы так и сделали, потом полностью настроили WordPress на HTTPS протокол с помощью какого-нибудь Really SImple SSL, сделали везде относительные ссылки, а там где нельзя использовали плагины вроде Velvet Blues Update URLs . И вроде бы все стало хорошо. Терминацией SSL (дешифрация входящего трафика) у вас занимается веб-сервер (например Apache) и WordPress уже настроен на HTTPS. Но тут внезапно вы решили на той же виртуалке разместить другой софт на поддомене. Встает интересный вопрос. У виртуалки один IP и одна пара портов для веб-трафика (80 + 443). Как же нам в такой ситуации получать на один 443 порт шифрованный трафик для нескольких доменов и перенаправлять его в зависимости от заголовка HOST в шифрованном трафике.
Варианты решения
Ну собственно решения два. Если у вас там прямо хорошая такая контейнерная инфраструктура – то используйте Traefik и будет вам счастье. Если же вы больше по виртуалкам – то отличным решением будет Nginx Proxy Manager. Он поставляется в виде docker-контейнера и умеет терминировать HTTPS на внешнем порту, расшифровывать его и направлять дальше http (или https) трафик на нужный хост или порт. Ставится за 5 минут в общем-то. Вот пример конфига:
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
version: "3" services: nginxproxymanager_nginx: image: nginxproxymanager_nginx build: context: ./docker/nginx container_name: nginxproxymanager_nginx restart: unless-stopped ports: - '80:80' # Public HTTP Port - '443:443' # Public HTTPS Port - '81:81' # Admin Web Port volumes: - ./volumes/data:/data - ./volumes/letsencrypt:/etc/letsencrypt healthcheck: test: [ "CMD-SHELL", "wget -O /dev/null http://localhost:81/ || exit 1" ] timeout: 10s |
./docker/nginx/Dockerfile
1 2 3 |
FROM jc21/nginx-proxy-manager:latest RUN apt-get update RUN apt-get install -y wget mc |
Дьявол в деталях
А вот теперь самое интересное. Я перенес Apache на другой порт, ну скажем 85. Поставил Nginx Proxy Manager, которому указал для одного домена ходить на этот порт. Попробовал открыть сайтик – и меня ждала череда бесконечных редиректов. Часа два я убил на это пока не понял, в чем причина. WordPress ждал https трафика, а к нему приходил уже http. Все решилось элегантным костылем, который надо добавить в wp-config.php
wp-config.php
1 2 3 4 5 6 7 8 |
// **************************************************** // * For correct working behind Nginx Proxy Manager * // **************************************************** define('FORCE_SSL_ADMIN', true); if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false ) { $_SERVER['HTTPS'] = 'on'; } // **************************************************** |
Один заголовок и одна переменная окружения и все заведется. Надеюсь, кому-то я сэкономлю этим постов пару часов его жизни 🙂
Спасибо за статью, очень сильно помогли сэкономить время !
Привет, ну здорово, рад, что смог помочь 🙂