• Новосибирск, Россия
  • (+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.

Поделиться
Категории
Теги
Для этого поста нет тегов
admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

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