Как поделиться сессиями PHP на нескольких серверах Memcached в Ubuntu 14.04

Вступление

Memcached - это распределенная система кэширования объектов, которая хранит информацию в памяти, а не на диске, для более быстрого доступа. Модуль Memcache в PHP может использоваться для обработки сеансов, которые в противном случае были бы сохранены в файловой системе. Хранение сеансов PHP в Memcached имеет то преимущество, что они могут распределяться между несколькими облачными серверами, на которых работает Memcached, чтобы поддерживать избыточность сеансов.

Без этой настройки Memcached, если ваше приложение балансируется нагрузкой на нескольких серверах, было бы необходимо настроить привязку сеанса к балансировщику нагрузки. Это поддерживает взаимодействие с пользователем и предотвращает его внезапный выход из системы. Настройка Memcached для обработки сеансов обеспечит одинаковый набор данных сеанса на всех облачных серверах в пуле Memcached, что устраняет необходимость быть привязанным к одному серверу для сохранения сеанса.

Предпосылки

В этом руководстве предполагается, что вы знакомы с настройками https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-14-04 настройки LAMP. серверы в Ubuntu. + Эта настройка будет использовать 3 капли с изображением * Ubuntu 14.04 *.

  • Капелька 1 *

  • Имя: lamp01

  • Публичный IP: 1.1.1.1

  • Частный IP: 10.1.1.1

  • Капелька 2 *

  • Имя: lamp02

  • Публичный IP: 2.2.2.2

  • Частный IP: 10.2.2.2

  • Капелька 3 *

  • Имя: lamp03

  • Публичный IP: 3.3.3.3

  • Частный IP: 10.3.3.3

Убедитесь, что флажок Private Networking установлен при создании дроплетов. Кроме того, запишите частные IP-адреса, так как они понадобятся нам позже.

Установите ЛАМПУ на всех трех серверах.

Сначала обновите репозиторий и установите Apache.

apt-get update
apt-get install apache2

Установите PHP и расширение mod_php для Apache.

apt-get install php5 libapache2-mod-php5 php5-mcrypt

Для получения дополнительной информации см. Https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-14-04[th this article].

Шаг первый - установка пакетов Memcache

На * lamp01 * установите демон Memcached и PHP-модуль Memcache.

apt-get install php5-memcache memcached

PHP имеет два пакета: php5-memcache и php5-memcached (обратите внимание на «d» в конце). Мы будем использовать первый пакет (memcache), так как он легче без каких-либо зависимостей. Прочитайте сравнение между memcache и memcached.

Сервис Memcached прослушивает только локальный хост (127.0.0.1). Это должно быть изменено, чтобы принимать соединения из частной сети.

nano /etc/memcached.conf

Найдите следующую строку:

-l 127.0.0.1

Измените его, чтобы прослушивать частный IP-адрес этого сервера.

-l

Перезапустите сервис + memcached +.

service memcached restart

Повторите эти шаги на двух других серверах, заменив + 127.0.0.1 + на соответствующий частный IP-адрес.

  • Lamp02 *

-l
  • Lamp03 *

-l

Перезапустите сервис + memcached + на вторых двух серверах.

Шаг второй - Установите Memcached в качестве обработчика сессии PHP

На * lamp01 * откройте файл + php.ini для редактирования.

nano /etc/php5/apache2/php.ini

Этот файл находится в + / etc / php5 / fpm / php.ini + при установке PHP-FPM.

Найдите следующие директивы конфигурации:

session.save_handler =
session.save_path =

Измените их, чтобы использовать Memcache следующим образом. Используйте все три частных IP-адреса в + session.save_path +.

session.save_handler = memcache
session.save_path = 'tcp://:11211,tcp://:11211,tcp://:11211'

Возможно, вам придется раскомментировать + session.save_path +, удалив точку с запятой в начале. Не забудьте вводить номер порта * 11211 * после каждого IP-адреса, поскольку Memcached прослушивает этот порт.

Добавьте точно такие же настройки на двух других серверах.

Вкл * lamp02 *:

session.save_handler = memcache
session.save_path = 'tcp://:11211,tcp://:11211,tcp://:11211'

Вкл * лампа03 *:

session.save_handler = memcache
session.save_path = 'tcp://:11211,tcp://:11211,tcp://:11211'

Эта конфигурация должна быть одинаковой на всех каплях, чтобы общий доступ к сеансу работал правильно.

Шаг третий - настройка Memcache для избыточности сеанса

На * lamp01 * отредактируйте файл + memcache.ini +.

nano /etc/php5/mods-available/memcache.ini

Добавьте следующие директивы конфигурации в конец этого файла.

memcache.allow_failover=1
memcache.session_redundancy=4

Директива + memcache.session_redundancy + должна быть равна числу серверов memcached + 1, чтобы информация сеанса была реплицирована на все серверы. Это связано с bug в PHP.

Эти директивы включают аварийное переключение и избыточность сеанса, поэтому PHP записывает информацию о сеансе на все серверы, указанные в + session.save_path +; похож на настройку RAID-1.

Перезапустите веб-сервер или демон PHP FPM в зависимости от того, что используется.

service apache2 reload

Повторите эти шаги точно на * lamp02 * и * lamp03 *.

Шаг четвертый - избыточность тестовой сессии

Чтобы проверить эту настройку, создайте следующий скрипт PHP на всех каплях.

<?php
   header('Content-Type: text/plain');
   session_start();
   if(!isset($_SESSION['visit']))
   {
       echo "This is the first time you're visiting this server\n";
       $_SESSION['visit'] = 0;
   }
   else
           echo "Your number of visits: ".$_SESSION['visit'] . "\n";

   $_SESSION['visit']++;

   echo "Server IP: ".$_SERVER['SERVER_ADDR'] . "\n";
   echo "Client IP: ".$_SERVER['REMOTE_ADDR'] . "\n";
   print_r($_COOKIE);
?>

Этот скрипт предназначен только для тестирования и может быть удален после настройки Droplets.

Получите доступ к этому файлу на первой капле, используя curl, и извлеките информацию о куки.

curl -v -s http:///session.php 2>&1 | grep 'Set-Cookie:'

Это вернет вывод, подобный следующему.

< Set-Cookie: PHPSESSID=8lebte2dnqegtp1q3v9pau08k4; path=/

Скопируйте файл cookie + PHPSESSID + и отправьте запрос другим капелькам, используя этот файл cookie. Этот сеанс будет удален PHP, если в течение 1440 секунд не будет выполнено ни одного запроса, поэтому убедитесь, что вы завершили тестирование в течение этого периода времени. Прочитайте о PHP session.gc-maxlifetime, чтобы узнать больше об этом.

curl --cookie "" http:///session.php http:///session.php http:///session.php

Вы обнаружите, что сеанс переносится на все капли.

Your number of visits: 1
Server IP: 1.1.1.1
Client IP: 117.193.121.130
Array
(
   [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)
Your number of visits: 2
Server IP: 2.2.2.2
Client IP: 117.193.121.130
Array
(
   [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)
Your number of visits: 3
Server IP: 3.3.3.3
Client IP: 117.193.121.130
Array
(
   [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)

Чтобы проверить отказоустойчивость, остановите службу + memcached + и получите доступ к этому файлу.

service memcached stop

Капля прозрачно использует информацию о сеансе, хранящуюся на двух других серверах.

curl --cookie "" http:///session.php

Выход:

Your number of visits: 4
Server IP: 1.1.1.1
Client IP: 117.193.121.130
Array
(
   [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)

Теперь балансировщик нагрузки может быть сконфигурирован для равномерного распределения запросов без проблем с настройкой стабильности сеанса.

Запустите + memcached + снова, как только вы закончите тестирование:

service memcached start

Шаг пятый - Безопасный Memcached с IPTables

Даже если Memcached использует частную сеть, другие пользователи DigitalOcean в том же центре обработки данных могут подключаться к вашей капле, если они знают ваш частный IP-адрес. Итак, мы будем set IPTables правила, чтобы разрешить только облачные серверы в нашем пуле Memcached для связи друг с другом.

Мы делаем этот шаг после тестирования на избыточность сеанса, чтобы было легче устранять проблемы, которые могут возникнуть, если применяются неправильные правила.

Создайте правила брандмауэра для * lamp01 * с частными IP-адресами * lamp02 * и * lamp03 *.

iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT

На типичном сервере LAMP следующее будет полным набором правил:

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
iptables -P INPUT DROP

Введите правила брандмауэра для * lamp02 * с частными IP-адресами * lamp01 * и * lamp03 *.

iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT

Сделайте то же самое для * lamp03 * с частными IP-адресами * lamp01 * и * lamp02 *.

iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT

Повторите тесты в * Шаг 4 *, чтобы подтвердить, что брандмауэр не блокирует наш трафик.

Related