• Новосибирск, Россия
  • (+7 383) 212-72-73
  • sale@anz.ru

Распараллелить нераспараллеливаемое…

В работе над настройкой движка форума phpbb была задача — сделать два совместно работающих сервера web-приложений. Серверы разного поколения (HP gen 9 и HP gen 8), соответственно, разные процессоры, разное число ядер и памяти.

На более мощном сервере размещается nginx, и первый сервер приложений. В nginx имеются широкие возможности для создания балансировщика нагрузки между серверами приложений. Если приложение штатно не поддерживает работу в кластере, лучше использовать режим балансировки ip_hash, в nginx есть соответствующая директива. Что происходит при таком режиме работы — пришел первый запрос с какого-то IP-адреса. Nginx проксирует его на один из серверов приложений, согласно весу (директива weight). После чего сессия, сеанс связи, будет только на этом сервере, nginx не будет перекидывать пользователя между серверами приложений. Пример такой настройки дан ниже. Для «развесовки» серверов я использую число ядер cpu на каждом из них.

upstream phpbb_cluster {
ip_hash;
server 192.168.100.2:8443 weight=32 max_fails=0; # Первый сервер приложений с весом 32
server 192.168.100.4:8443 weight=40 max_fails=0; # Второй сервер приложений с весом 40
}

# Ниже, в секции конкретного сайта (server), где запрос передается апстриму:

location @fallback {
proxy_pass https://phpbb_cluster;
}

Nginx так же обрабатывает все запросы, связанные со статикой (картинками, видеофайлами, ява-скриптами, таблицами стилей и прочее), отдавая серверам приложений только обработку, собственно, скриптов php.

Важно то, что ресурсы обоих серверов должны быть общими. Как можно выйти из положения — на самом мощном сервере хранятся все файлы. Статика должна храниться там, где запущен nginx. Скрипты сайта хранятся там же. Их мы отдаем другим серверам приложений по NFS. Параметр RPCNFSDCOUNT, задающий число потоков RPC NFS, должен быть большим, порядка 500 — 1000. Приоритет сервера задается параметром RPCNFSDPRIORITY, можно задать от -5 до -12.

Второе важное замечание касается кеша приложения. Он должен быть раздельным для разных серверов, иначе будут сыпаться ошибки о правах доступа к файлам, серверы будут пытаться создавать кешируемые файлы поочередно, в директории cache в корне сайта, если, конечно, для кеширования используется драйвер file из phpbb/cache/driver).

Можно было бы выйти из ситуации, храня кеш в базах данных memcached, redis, или использовать xcache, но в состав phpbb входит движок темплейтов twig, который тоже создает свой кеш в той же директории cache, а он ни с чем, кроме файлов, работать не умеет.

Избежать этой проблемы можно. Когда монтируем NFS каталог с главного сервера на остальных серверах приложений, надо затем смонтировать в директорию cache локальную директорию, например /tmp/cache, с опцией bind. В этом случае кеши на разных серверах приложений будут свои. После этого форум phpbb или сайты, построенные на его основе будут работать без проблем на двух, трёх и более серверах приложений php-fpm.

Главный Закон Сисадмина

Во всех непонятных ситуациях СМОТРИТЕ ЛОГИ. Все проблемы скрываются там.

Обязательно синхронизируйте время сервера с серверами точного времени, если есть кластер — создайте свой сервер точного времени, который синхронизируйте со внешними. В роутерах mikrotik для этого есть пакет ntp, с его помощью можно синхронизировать время всей локальной сети. Синхронизация времени поможет работать с логами, разбираться с событиями на разных серверах кластера.

Если логи недостаточно информативны — включайте расширенное логирование в настройках конкретных сервисов.

Логи — главное ваше оружие в поисках и уничтожении проблем.

вернуться наверх
×
Cloudim - онлайн консультант для сайта бесплатно.