Как настроить сервер Redis в качестве обработчика сеансов для PHP в Ubuntu 14.04
Введение
Redis — это система кэширования и хранения данных с открытым исходным кодом, также называемая сервером структуры данных из-за его расширенной поддержки нескольких типов данных, таких как хэши, списки, наборы и растровые изображения, среди прочих. Он также поддерживает кластеризацию, что делает его часто используемым для высокодоступных и масштабируемых сред.
В этом руководстве мы увидим, как установить и настроить внешний сервер Redis для использования в качестве обработчика сеанса для приложения PHP, работающего в Ubuntu 14.04.
Обработчик сеанса отвечает за хранение и извлечение данных, сохраненных в сеансах — по умолчанию PHP использует для этого файлы. Внешний обработчик сеансов можно использовать для создания балансировщика нагрузки, в котором все узлы приложения будут подключаться к центральному серверу для обмена информацией о сеансе.
Предпосылки
В этом руководстве мы будем работать с двумя разными серверами. По соображениям безопасности и производительности важно, чтобы обе капли находились в одном центре обработки данных с включенной частной сетью. Вот что вам понадобится:
- Веб-сервер PHP с запущенным LEMP в Ubuntu 14.04 — мы будем называть этот сервер веб-сайтом.
- Второй чистый сервер Ubuntu 14.04, на котором будет установлен Redis — мы будем называть этот сервер Redis
Вам понадобится надлежащий доступ SSH к обоим серверам в качестве обычного пользователя с разрешением sudo.
Для сервера Redis вы также можете использовать наш Шаг 2.
Шаг 1 — Установите сервер Redis
Первое, что нам нужно сделать, это запустить сервер Redis в нашей капле redis.
Мы будем использовать обычный менеджер пакетов Ubuntu с доверенным репозиторием 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 должен быть установлен на вашем сервере. Чтобы проверить установку, попробуйте эту команду:
- redis-cli ping
Это подключится к экземпляру Redis, работающему на локальном хосте через порт 6379. В качестве ответа вы должны получить PONG.
Шаг 2 — Настройте Redis для приема внешних подключений
По умолчанию Redis разрешает подключения только к localhost
, что в основном означает, что вы будете иметь доступ только изнутри сервера, на котором установлен Redis. Нам нужно изменить эту конфигурацию, чтобы разрешить подключения с других серверов в той же частной сети, что и сервер Redis.
Первое, что нам нужно сделать, это узнать IP-адрес частной сети машины Redis. Следующие шаги должны быть выполнены на сервере Redis.
Запустите ifconfig
, чтобы получить информацию о ваших сетевых интерфейсах:
- sudo ifconfig
Вы должны получить вывод, подобный этому:
Output 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-адрес, который мы будем использовать позже для подключения к серверу Redis с веб-сервера.
Используя ваш любимый редактор командной строки, откройте файл /etc/redis/redis.conf
и найдите строку, содержащую определение bind
. Вы должны добавить свой IP-адрес частной сети в строку следующим образом:
- sudo vim /etc/redis/redis.conf
bind localhost 10.133.14.9
Если вы видите 127.0.0.1
вместо localhost
, это нормально; просто добавьте свой частный IP-адрес после того, что уже есть.
Теперь вам просто нужно перезапустить службу Redis, чтобы применить изменения:
- sudo service redis-server restart
Если вы установили Redis с помощью нашего приложения в один клик, имя службы будет redis вместо redis-server. Чтобы перезапустить его, вы должны запустить: sudo service redis 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
Output10.133.14.9:6379>
Несмотря на то, что здесь не обязательно указывать параметр host
(поскольку мы подключаемся с localhost
), мы сделали это, чтобы убедиться, что служба Redis будет принимать соединения, нацеленные на частный сетевой интерфейс.
Если вы определили пароль и теперь пытаетесь получить доступ к данным, вы должны получить ошибку AUTH:
- keys *
Output(error) NOAUTH Authentication required.
Для аутентификации вам просто нужно запустить команду AUTH
, указав тот же пароль, который вы указали в файле /etc/redis/redis.conf
:
- AUTH yourverycomplexpasswordhere
В ответ вы должны получить OK. Теперь, если вы запустите:
- keys *
Вывод должен быть похож на этот:
Output(empty list or set)
Этот вывод просто означает, что ваш сервер Redis пуст, чего мы и ожидали, поскольку веб-сервер еще не настроен для использования этого сервера Redis в качестве обработчика сеанса.
Держите этот сеанс SSH открытым и подключенным к redis-cli
, пока мы выполняем следующие шаги — мы вернемся к подсказке redis-cli
, чтобы проверить, являются ли данные сеанса должным образом сохранены после того, как мы внесем необходимые изменения в веб-сервер.
Шаг 5 — Установите расширение Redis на веб-сервере
Следующие шаги должны быть выполнены на веб-сервере. Нам нужно установить расширение PHP Redis, иначе PHP не сможет подключиться к серверу Redis.
Сначала обновите кеш менеджера пакетов, запустив:
- sudo apt-get update
Затем установите пакет php5-redis
:
- sudo apt-get install php5-redis
Теперь ваш веб-сервер должен иметь возможность подключаться к Redis.
Шаг 6. Установите Redis в качестве обработчика сеансов по умолчанию на веб-сервере.
Теперь нам нужно отредактировать файл 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();
При доступе к сценарию из браузера найдите строку, содержащую \Загруженный файл конфигурации, и вы должны найти точное местоположение загруженного основного php.ini
.
Не забудьте после этого удалить файл info.php
, так как он содержит конфиденциальную информацию о вашей среде.
Откройте файл php.ini
и найдите строку, содержащую session.save_handler
. Значение по умолчанию — файлы
. Вы должны изменить его на redis
.
В среде LAMP:
- sudo vim /etc/php5/apache2/php.ini
В средах LEMP:
- sudo vim /etc/php5/fpm/php.ini
[label /etc/php5/fpm/php.ini]
session.save_handler = redis
Теперь вы должны найти строку, содержащую session.save_path
. Раскомментируйте его и измените значение, чтобы оно содержало строку подключения Redis. Содержимое должно соответствовать следующему формату, все в одной строке: tcp://IP-АДРЕС:ПОРТ?auth=REDISPASSWORD
[label /etc/php5/fpm/php.ini]
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
Чтобы ваши сеансы теперь обрабатывались Redis, вам понадобится PHP-скрипт или приложение, в котором хранится информация о сеансах. Мы собираемся использовать простой скрипт, который реализует счетчик — каждый раз, когда вы перезагружаете страницу, напечатанное число увеличивается.
Создайте файл с именем test.php
на веб-сервере и поместите его в корневую папку вашего документа:
- sudo vim /usr/share/nginx/html/test.php
Не забудьте изменить /usr/share/nginx/html
, чтобы отразить корневой путь вашего документа.
- [label /usr/share/nginx/html/test.php]
- <?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 *
И вы должны получить вывод, подобный этому:
Output1) "PHPREDIS_SESSION:j9rsgtde6st2rqb6lu5u6f4h83"
Это показывает, что информация о сеансе хранится на сервере Redis. Аналогичным образом вы можете подключить дополнительные веб-серверы к серверу Redis.
Заключение
Redis — это мощная и быстрая служба хранения ключей и значений, которую также можно использовать в качестве обработчика сеансов для PHP, обеспечивая масштабируемую среду PHP, предоставляя распределенную систему для хранения сеансов. Для получения дополнительной информации о масштабировании PHP-приложений вы можете прочитать эту статью: Горизонтальное масштабирование PHP-приложений.