Обработка сессий 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: LAMP stack, LEMP Stack, PHP, Redis, Ubuntu 14.04
1 комментарий
Ага только USER агент сохранятся не будет, например в битрикс это приведет к ошибки, в некоторых случая, при выгрузке из 1с будет жесткий тупняк. Во всяком случае у нас такое было.