LINUX.ORG.RU
ФорумAdmin

Настройка https для wordpress на haproxy/nginx

 , ,


0

1

Добрый день.

Есть стенд, из балансера (haproxy) и веб-серверной связки nginx+apache.

Прикручиваю сертификаты letsencrypt'а к доменам. Сертификаты располагаю на haproxy, дальше расшифрованный запрос приходит на Nginx, далее пересылается apache. Т.е. связка nginx+apache работает с расшифрованным запросом.

Теперь нужно сайт на вордпрессе перевести на https. В настройках админки «Общие» меняю http на https - выбивает из админки, зайти в нее нельзя - страница не найдена, адрес заменен на https, сам сайт становится недоверенным...

Убираю хапрокси из цепочки, перекидываю сертификаты на nginx, прописываю из в конфиге nginx - Так же меняю в настройках http на https - опять всё ломается...

Другие сайты на других движках при такой схеме работают. Проблема (насколько мне видно) в объяснении вордпрессу, что ходить надо по https, что-то недопрописано для админки и для самого. Сайт новый, чистый, тема стандартная.

1. Пробовала и с настройкой на хапрокси редиректа с 80 порта на 443, и без;

2. Проверила правильность установки сертификата через сайт ssllabs.com/ssltest/ - сертификат установлен правильно.

Конфиги при полной цепочке (хапрокси с сертификатом --> nginx --> apache):

/etc/haproxy/haproxy.cfg

global
   log         127.0.0.1 local2
   chroot      /var/lib/haproxy
   pidfile     /var/run/haproxy.pid
   maxconn     10000
   user        haproxy
   group       haproxy   daemon
   tune.ssl.default-dh-param 2048
   stats socket /var/lib/haproxy/stats
ssl-default-bind-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-default-bind-options no-sslv3 no-tls-tickets
   ssl-default-server-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-default-server-options no-sslv3 no-tls-tickets
...

frontend http
 bind :80
 reqadd X-Forwarded-Proto:\ http
 default_backend localhost

use_backend name.domen.ru if { hdr_dom(host) -i name.domen.ru }     { dst_port 80 }

frontend https
 bind :443 ssl crt-list /etc/haproxy/certs/crt.txt
  http-request set-header X-SSL %[ssl_fc]
  http-request add-header X-Forwarded-Proto https if { ssl_fc }
  reqadd X-Forwarded-Proto:\ https
default_backend localhost
  http-response set-header Strict-Transport-Security max-age=15768000

use_backend name.domen.ru if { hdr_dom(host) -i name.domen.ru }     { dst_port 443 }


backend name.domen.ru
redirect scheme https if { hdr(Host) -i name.domen.ru } !{ ssl_fc }
server name.domen.ru 192.168.1.101:80
 /etc/nginx/conf.d/name.domen.ru


upstream name.domen.ru.80 {
   server 192.168.1.101:8080;
   }

server {
   listen 192.168.1.101:80;
   server_name name.domen.ru;
   error_log /var/log/name.domen.ru80-error.log;
   access_log /var/log/name.domen.ru80-access.log;
   location / {
      proxy_pass http://name.domen.ru.80;
      proxy_redirect off;
      proxy_set_header Host $host;
   }
}
/etc/httpd/conf.d/httpd-vhost.conf

VirtualHost *:8080>
    ServerName www.name.domen.ru
    ServerAlias name.domen.ru
    ServerAdmin name@domen.ru
    DocumentRoot /var/www/name.domen.ru
    ErrorLog "/var/www/name.domen.ru/log/apache_error.log"
    CustomLog "logs/name.domen.ru-access.log" common
 </VirtualHost>

Пробовала напрямую принимать запрос https на nginx, тогда конфиг апача не трогаю, конфиг nginx такой:

/etc/nginx/conf.d/name.domen.ru.conf

upstream name.domen.ru.443 {
  server 192.168.1.101:8080;
  }

server {
  listen 192.168.1.101:443;
  server_name name.domen.ru;
  error_log /var/log/name.domen.ru443-error.log;
  access_log /var/log/name.domen.ru443-access.log;
 listen 443 ssl;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/name.domen.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/name.domen.ru/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS:!AES256";
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/ssl/name.domen.ru/dhp-2048.pem;
 
location / {
     proxy_pass http://name.domen.ru.443;
     proxy_redirect off;
     proxy_set_header Host $host;
 }
}

Во всех мануалах замена c http на https происходит в админке. Подскажите, что не так делаю?

После прочтения описания я понял так, что вы не можете даже банально на nginx навесить сертификаты безо всякого wordpress'а

так?

что вот это значит

адрес заменен на https, сам сайт становится недоверенным

?

В браузере зашли на «недоверенный сайт» нажали на url - посмотрели, что за сертификат вам подсунули, на который браузер ругается. Проверили url в строке браузера и в hostname сертификата - добились, что все рабоает, поехали дальше схему усложнять

zgen ★★★★★
()
Последнее исправление: zgen (всего исправлений: 1)

location / {
proxy_pass http://name.domen.ru.443;

Куда ведет оно? что это за имя домена? Не припомню такой зоны первого уровня как «443». Это опечатка или что вы этой фигней хотели сказать?

zgen ★★★★★
()
Ответ на: комментарий от zgen

Спасибо за ответ.

адрес заменен на https

это в админке вордпресса «Общие» меняю http на https. Админка - недоступна ни по http, ни по https, при переходе по адресу https://name.domen.ru - сайт недоверенный, проблема в конфиге движка, т.к. тестирование ssl-сертификата по домену выдает А+.

manik207
() автор топика
Ответ на: комментарий от zgen

proxy_pass http://name.domen.ru.443;

ведет в директиву upstream, указанную в начале того же конфига. И это не имя домена, а буквенное обозначение перенаправления, которое генерится скриптом из доменного имени и порта.

manik207
() автор топика
Ответ на: Спасибо за ответ. от manik207

это в админке вордпресса «Общие» меняю http на https.

Нда, это д.б. последний шаг.

1. Сделайте обычный vhost на nginx, внутри примитивного server на порту 443 с включенным ssl и прицепленными сертификатами
2. по vhost name зайдите в корень с помощью браузера и проверьте, что все работает. Какие-то данные иметь необязательно. Можно любой пустой каталог.

Когда это получится, можно будет двигаться дальше.

zgen ★★★★★
()
Ответ на: комментарий от manik207

ведет в директиву upstream

ага, просмотрел мимо, сорри.

zgen ★★★★★
()

Спасибо за ответы! Решение оказалось проще:

Сам сайт вордпресса остается на http, но конфиг wp-config.php нужно привести к виду:

 <?php
define('DB_NAME', 'name.domen.ru);
define('DB_USER', 'name.domen.ru');
define('DB_PASSWORD', 'pass');
define('DB_HOST', '192.168.1.100:3306');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');
$table_prefix  = 'wp_';

define('WP_DEBUG', false);

define('WP_HOME','http://name.domen.ru');
define('WP_SITEURL','http://name.domen.ru');

define('FORCE_SSL_ADMIN', true);

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
   $_SERVER['HTTPS'] = 'on';
}
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
require_once(ABSPATH . 'wp-settings.php'); 

Остальные настройки не трогала. Сертификат установлен на хапрокси. Переадресация настроена на нем же с http на https.

Единственный косяк, при установке самого вордпресса, шаблон слетает, но после установки, шаблон подгружается и сайт, и админка работают. Спасибо!!!!

manik207
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.