Wordpress: прячемся за CloudFlare — Fastenv

Fastenv - системное администрирование от профессионалов индустрии. Работаем с linux, уважаем opensource.

Wordpress: прячемся за CloudFlare
Сложность: Низкая | Автор: fastenv | June 5, 2016

CloudFlare — великолепный сервис, который для нас решает следующие задачи:

  1. CDN — кеширование статики, снижение трафика, снижение нагрузки на сервер.
  2. HTTPS сертификат — повышает доверие пользователей, улучшает SEO.
  3. Базовая защита от DDOS и подобных атак.

Самое приятное в cloudflare это цена. Всё вышесказанное предоставляется бесплатно. Теперь закончим с комплиментами и перейдем к делу. Особенность этой заметки в том, что мы используем haproxy и хотели сохранить доступность по http.

WordPress & HAProxy

wp-art1-4
Наш сайт располагается на двух равноправных нодах, каждая из которых работает под управлением nginx, который слушает только 80-й порт. Для корректной работы обоих протоколов нам требуется обучить вордпресс отличать https трафик от обычного. С этой целью силами haproxy все ssl запросы пометим специальным заголовком, а в WP добавим его обработку.

HAProxy & Ssl

  1. Создадим самоподписанный сертификат:
    mkdir -p /etc/haproxy/keys
    openssl req \
      -x509 \
      -newkey rsa:2048 \
      -keyout /etc/haproxy/keys/fastenv.pem \
      -out /etc/haproxy/keys/fastenv.pem \
      -days 3650 \
      -nodes \
      -subj "/C=RU/ST=Saint-Petersburg/L=SPB/O=Fastnev/CN=fastenv.ru"
  2. Настроим бекенд:
    backend wordpress
            server wordpress1 10.0.2.12:80 check
            server wordpress2 10.0.2.13:80 check
  3. Настроим фронтенд:
    frontend wordpress
            bind *:80
            bind *:443 ssl crt /etc/haproxy/ssl/fastenv.pem
            option forwardfor
            http-request add-header X-Fastenv-Https https if { ssl_fc }
     
            use_backend wordpress
    • bind *:443 ssl crt — включает терминирование ssl соединения.
    • { ssl_fc } — анонимная acl принимающая значение true всякий раз, как соединение установлено с использованием ssl.
    • option forwardfor — добавляем X-Forwarded-For заголовок, что бы видеть реальный ip клиента. С CF эта опция не нужна т.к. сервис сам проставляет XFF, но и не мешает.

WordPress & X-Fastenv-Https

В wp-config.php добавим:

function isHttps() {
        return (!empty($_SERVER['HTTP_X_FASTENV_HTTPS']));
}
 
$web_site_domain = 'fastenv.ru';
 
if (isHttps()) {
        define('WP_HOME',   'https://' . $web_site_domain);
        define('WP_SITEURL','https://' . $web_site_domain);
        $_SERVER['HTTPS'] = 'on';
}
else {
        define('WP_HOME',   'http://' . $web_site_domain);
        define('WP_SITEURL','http://' . $web_site_domain);
}

Настройка CloudFlare

На вкладке Crypto включаем SSL->Full. С этого момента CF будет обращаться по ssl к нашему серверу для https соединений. Тем самым защищается трафик от компрометации на всех участках сети user -> CF -> наш сервер.

Как вообще это работает?

Первым делом Вы переносите домен на CF, т.е. делегируете сервису управление dns записями. Далее сайт начинает резолвиться в их адреса и все пользователи желающие его просмотреть приходят(по anycast) на ближайший сервер CloudFlare, который по многим параметрам оценивает, является ли трафик хорошим. Если трафик покажется подозрительным, то будет запрошена капча. На практике их фильтры очень щадящие и капчей лишний раз не беспокоят. Далее запрос будет передан на Ваш сервер или же обработан локально согласно настройкам кеширования.

Бонусы

  1. Always Online — если сервер упадет, то CF будет показывать последнюю статическую версию из кеша.
  2. Гибкая настройка кеширования — на вкладке Page Rules можно настроить правила хоть под каждую страницу сайта.
  3. Оптимизация объема кода — это опции семейства Speed->Auto Minify, которые умеют удалять комментарии, пробелы, и похожие «лишние» символы не несущие полезной информации для интерпретатора. Работает для js, css и html кода.
  4. Исторические графики — сколько уников, сколько запросов, сколько трафика по ssl, сколько отдано из кеша и так далее. До яндекс метрики не тянет, но с общим представлением о ресурсе справляется отлично.
  5. Api — позволяет многое. Например, сбросить кеш при публикации нового поста.
  6. Поддержка IPv6.