Поиск по сайту:

Как настроить сервер 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, запустив:

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

Нажмите ENTER для подтверждения.

Теперь вам нужно обновить кеш менеджера пакетов:

  1. sudo apt-get update

И, наконец, давайте установим Redis, запустив:

  1. sudo apt-get install redis-server

Теперь Redis должен быть установлен на вашем сервере. Чтобы проверить установку, попробуйте эту команду:

  1. redis-cli ping

Это подключится к экземпляру Redis, работающему на локальном хосте через порт 6379. В качестве ответа вы должны получить PONG.

Шаг 2 — Настройте Redis для приема внешних подключений

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

Первое, что нам нужно сделать, это узнать IP-адрес частной сети машины Redis. Следующие шаги должны быть выполнены на сервере Redis.

Запустите ifconfig, чтобы получить информацию о ваших сетевых интерфейсах:

  1. 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-адрес частной сети в строку следующим образом:

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

Если вы видите 127.0.0.1 вместо localhost, это нормально; просто добавьте свой частный IP-адрес после того, что уже есть.

Теперь вам просто нужно перезапустить службу Redis, чтобы применить изменения:

  1. sudo service redis-server restart

Если вы установили Redis с помощью нашего приложения в один клик, имя службы будет redis вместо redis-server. Чтобы перезапустить его, вы должны запустить: sudo service redis restart .

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

Шаг 3 — Установите пароль для сервера Redis

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

  1. sudo vim /etc/redis/redis.conf

Теперь раскомментируйте строку, содержащую requirepass, и установите надежный пароль:

requirepass yourverycomplexpasswordhere

Перезапустите службу Redis, чтобы изменения вступили в силу:

  1. sudo service redis-server restart

Шаг 4 — Проверка соединения и аутентификации Redis

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

  1. redis-cli -h 10.133.14.9
Output
10.133.14.9:6379>

Несмотря на то, что здесь не обязательно указывать параметр host (поскольку мы подключаемся с localhost), мы сделали это, чтобы убедиться, что служба Redis будет принимать соединения, нацеленные на частный сетевой интерфейс.

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

  1. keys *
Output
(error) NOAUTH Authentication required.

Для аутентификации вам просто нужно запустить команду AUTH, указав тот же пароль, который вы указали в файле /etc/redis/redis.conf:

  1. AUTH yourverycomplexpasswordhere

В ответ вы должны получить OK. Теперь, если вы запустите:

  1. keys *

Вывод должен быть похож на этот:

Output
(empty list or set)

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

Держите этот сеанс SSH открытым и подключенным к redis-cli, пока мы выполняем следующие шаги — мы вернемся к подсказке redis-cli, чтобы проверить, являются ли данные сеанса должным образом сохранены после того, как мы внесем необходимые изменения в веб-сервер.

Шаг 5 — Установите расширение Redis на веб-сервере

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

Сначала обновите кеш менеджера пакетов, запустив:

  1. sudo apt-get update

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

  1. 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 в корневом каталоге вашего веб-сайта:

  1. <?php
  2. phpinfo();

При доступе к сценарию из браузера найдите строку, содержащую \Загруженный файл конфигурации, и вы должны найти точное местоположение загруженного основного php.ini.

Не забудьте после этого удалить файл info.php, так как он содержит конфиденциальную информацию о вашей среде.

Откройте файл php.ini и найдите строку, содержащую session.save_handler. Значение по умолчанию — файлы. Вы должны изменить его на redis.

В среде LAMP:

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

В средах LEMP:

  1. 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:

  1. sudo service apache2 restart

В средах LEMP:

  1. sudo service php5-fpm restart

Шаг 7 — Проверка обработки сеанса Redis

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

Создайте файл с именем test.php на веб-сервере и поместите его в корневую папку вашего документа:

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

Не забудьте изменить /usr/share/nginx/html, чтобы отразить корневой путь вашего документа.

  1. [label /usr/share/nginx/html/test.php]
  2. <?php
  3. //simple counter to test sessions. should increment on each page reload.
  4. session_start();
  5. $count = isset($_SESSION['count']) ? $_SESSION['count'] : 1;
  6. echo $count;
  • $_SESSION['count'] = ++$count;
  • Укажите в браузере http://web/test.php, чтобы получить доступ к сценарию. Он должен увеличивать число каждый раз, когда вы перезагружаете страницу.

    Теперь у вас должна быть информация о сеансе, хранящаяся на сервере Redis. Чтобы проверить, вернитесь к сеансу SSH на компьютере с Redis, где мы ранее подключались к службе Redis с помощью redis-cli. Снова получите содержимое с помощью keys *:

    1. keys *

    И вы должны получить вывод, подобный этому:

    Output
    1) "PHPREDIS_SESSION:j9rsgtde6st2rqb6lu5u6f4h83"

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

    Заключение

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