Обработка сессий PHP при помощи сервера Redis в Ubuntu 14.04

Redis – это открытая нереляционное хранилище данных и кэша типа «ключ-значение». Также Redis является сервером преобразования структур данных, предназначенным для расширенной поддержки нескольких типов данных (хэша, списков, множеств и битовых массивов и т.п.). Кроме того, Redis поддерживает кластеризацию, потому его часто используют в высокопроизводительных и масштабируемых средах.

Данное руководство поможет установить и настроить сервер Redis для обработки PHP-сессий приложения в системе Ubuntu 14.04.

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

Требования

Для выполнения данного руководства использовалось два сервера.

Примечание: Из соображений безопасности и производительности важно, чтобы оба сервера находились в одном центре обработки данных с включенной частной сетью.

Итак, для работы понадобится:

  • Сервер 1 (в руководстве он будет называться web): Предварительно установленный веб-сервер; можно использовать стек LAMP или LEMP.
  • Сервер 2 (в руководстве он будет называться redis): свежий сервер Ubuntu 14.04, на котором будет установлен Redis.
  • Доступ SSH.

1: Установка Redis

Сначала нужно установить сервер Redis.

Для этого подойдёт пакет из репозитория PPA.

Важно! Используйте наиболее актуальную версию Redis.

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

Чтобы добавить репозиторий PPA, введите:

sudo add-apt-repository ppa:chris-lea/redis-server

Для подтверждения нажмите Enter.

Обновите кэш пакетного менеджера:

sudo apt-get update

Установите Redis:

sudo apt-get install redis-server

Чтобы убедиться, что установка прошла успешно, введите команду:

redis-cli ping

Команда создаст подключение к Redis с локального хоста на порт 6379. Если установка прошла успешно, команда вернёт:

PONG

2: Настройка Redis для поддержки внешних соединений

По умолчанию Redis поддерживает подключения только с локального хоста. Это значит, что Redis доступен только с того сервера, на котором он установлен. Эту настройку нужно изменить.

Для начала нужно узнать IP-адрес частной сети сервера Redis.

Примечание: Следующие действия нужно выполнить на сервере redis.

Запустите команду ifconfig, чтобы получить сведения о сетевых интерфейсах.

sudo ifconfig

Команда вернёт примерно следующий вывод:

eth0      Link encap:Ethernet  HWaddr 04:01:63:7e:a4:01
inet addr:188.166.77.33  Bcast:188.166.127.255  Mask:255.255.192.0
inet6 addr: fe80::601:63ff:fe7e:a401/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:3497 errors:0 dropped:0 overruns:0 frame:0
TX packets:3554 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4895060 (4.8 MB)  TX bytes:619070 (619.0 KB)
eth1      Link encap:Ethernet  HWaddr 04:01:63:7e:a4:02
inet addr:10.133.14.9  Bcast:10.133.255.255  Mask:255.255.0.0
inet6 addr: fe80::601:63ff:fe7e:a402/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:648 (648.0 B)  TX bytes:578 (578.0 B)

Найдите inet_addr для интерфейса eth1; в данном случае это 10.133.14.9. Это и есть IP-адрес сети, который необходим для настройки подключения сервера web к серверу redis.

При помощи редактора откройте файл /etc/redis/redis.conf и найдите строку bind. После localhost вставьте в неё полученный IP-адрес частной сети.

sudo vim /etc/redis/redis.conf
bind localhost 10.133.14.9

Примечание: Вместо localhost строка может содержать 127.0.0.1.

Перезапустите сервис Redis, чтобы обновить настройки.

sudo service redis-server restart

После этого любой сервер из этой частной сети сможет подключиться к этому серверу Redis.

3: Пароль для сервера Redis

Чтобы повысить уровень безопасности сервера Redis, нужно защитить его данные паролем. Отредактируйте конфигурационный файл /etc/redis/redis.conf.

sudo vim /etc/redis/redis.conf

Раскомментируйте строку requirepass и установите надёжный пароль.

requirepass yourverycomplexpasswordhere

Перезапустите сервис Redis:

sudo service redis-server restart

4: Тестирование подключения и авторизации Redis

Чтобы убедиться в том, что все настройки работают должным образом, подключитесь к Redis с сервера redis:

redis-cli -h 10.133.14.9
10.133.14.9:6379>

Параметр host использовать необязательно, но в этой команде он присутствует для того, чтобы подтвердить, что сервис Redis может принимать соединения, направленные на частный сетевой интерфейс.

Если вы установили пароль, сервер не откроет вам доступа к данным; он вернёт ошибку AUTH:

keys *
(error) NOAUTH Authentication required.

Чтобы пройти аутентификацию, нужно запустить команду AUTH и добавить в неё установленный ранее пароль:

AUTH yourverycomplexpasswordhere

Если пароль правильный, команда вернёт:

OK

Теперь снова запустите:

keys *

На экране появится примерно такой вывод:

(empty list or set)

Это значит, что на сервере Redis пока что нет никаких данных; это нормальное поведение сервера, поскольку сервер web пока что не может использовать его в качестве обработчика сессий.

Оставьте эту сессию SSH открытой и подключитесь к redis-cli. После настройки сервера web нужно будет вернуться в командную строку redis-cli, чтобы убедиться в том, что Redis может хранить данные.

5: Установка расширений Redis на сервер web

Теперь нужно перейти на сервер web и установить расширения Redis, чтобы PHP мог подключаться к серверу Redis.

Обновите кэш пакетного менеджера:

sudo apt-get update

Затем установите пакет php5-redis

sudo apt-get install php5-redis

Теперь веб-сервер может подключаться к серверу redis.

6: Настройка обработки сессий

Оставайтесь на сервере web. Откройте файл php.ini, в котором можно определить стандартный обработчик сессий PHP. Место хранения файла зависит от используемого программного стека. В стеке LAMP в Ubuntu 14.04 этот файл обычно находится в /etc/php5/apache2/php.ini. В стеке LEMP в системе Ubuntu 14.04 файл, как правило, хранится в /etc/php5/fpm/php.ini.

Если вы не знаете точного пути файла php.ini, его можно быстро узнать при помощи функции phpinfo(). Просто поместите в файл info.php следующий код:

<?php
phpinfo();

Затем откройте скрипт в браузере и найдите строку Loaded Configuration File. В ней указано местонахождение нужного файла.

Примечание: После этого рекомендуется удалить файл info.php, поскольку он открывает доступ к конфиденциальным данным о сервере.

Откройте файл php.ini и найдите строку session.save_handler; по умолчанию она содержит значение files. Измените стандартное значение строки, указав redis.

В среде LAMP:

sudo vim /etc/php5/apache2/php.ini

В среде LEMP:

sudo vim /etc/php5/fpm/php.ini

Строка должна выглядеть так: session.save_handler = redis

Теперь вы должны найти строку session.save_path. Раскомментируйте ее и измените значение, указав строку подключения Redis в таком формате:

tcp://IPADDRESS:PORT?auth=REDISPASSWORD. Строка должна выглядеть так:
session.save_path = "tcp://10.133.14.9:6379?auth=yourverycomplexpasswordhere"

В параметре auth нужно указать пароль сервера Redis.

Сохраните и закройте файл, а затем перезапустите сервер php.

В LAMP:

sudo service apache2 restart

В LEMP:

sudo service php5-fpm restart

7: Тестирование обработки сессий

Чтобы убедиться в том, что Redis успешно обрабатывает сессии PHP, создайте PHP-скрипт или приложение, хранящее информацию в сессиях. В данном руководстве используется простой скрипт-счётчик: он увеличивает номер при каждой перезагрузке страницы.

На сервере web создайте файл test.php и поместите его в каталог document root.

sudo vim /usr/share/nginx/html/test.php

Примечание: Если ваш каталог document root находится в другом месте, откорректируйте эту команду.

Добавьте в файл такой код:

<?php
//simple counter to test sessions. should increment on each page reload.
session_start();
$count = isset($_SESSION['count']) ? $_SESSION['count'] : 1;
echo $count;
$_SESSION['count'] = ++$count;

Чтобы получить доступ к скрипту в браузере, откройте ссылку:

http://web/test.php

Номер на странице должен увеличиваться после каждого обновления страницы.

Это значит, что теперь данные сессий хранятся в Redis. Чтобы убедиться в этом, вернитесь в сессию SSH на сервере redis, в которой осталось подключение к Redis при помощи redis-cli. Извлеките данные при помощи команды keys *:

keys *

На экране появится такой вывод:

1) "PHPREDIS_SESSION:j9rsgtde6st2rqb6lu5u6f4h83"

Это значит, что информация сессии хранится на сервере Redis. Аналогичным образом к серверу Redis можно подключить дополнительные веб-серверы.

Tags: , , , ,

1 комментарий

  • apptowns says:

    Ага только USER агент сохранятся не будет, например в битрикс это приведет к ошибки, в некоторых случая, при выгрузке из 1с будет жесткий тупняк. Во всяком случае у нас такое было.

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