Как настроить сервер Redis в качестве обработчика сеанса для PHP в Ubuntu 16.04

Вступление

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

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

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

Внешний обработчик сеансов обеспечивает централизованное расположение данных общего сеанса, которые могут использоваться несколькими серверами приложений. Это важно при создании scalable сред PHP за https://www.digitalocean.com/community/tutorials/an- Знакомство с haproxy-and-load-balancing-concept [балансировщик нагрузки], поскольку одни и те же данные сеанса будут доступны независимо от того, какой сервер приложений обслуживает отдельный запрос.

Предпосылки

В этом руководстве будет настроена обработка сеанса с использованием двух серверов. Чтобы следовать, вам понадобится:

  • Веб-сервер PHP, на котором работает LAMP или https: //www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04[LEMP] в Ubuntu 16.04. Мы будем называть этот сервер * web *.

  • Второй, чистый сервер Ubuntu 16.04, где будет установлен Redis. Мы будем называть этот сервер * redis *.

Вам необходимо иметь пользователя без полномочий root с привилегиями + sudo +, настроенными на каждом из этих серверов. Мы также предполагаем, что на каждом из серверов установлен базовый брандмауэр. Вы можете настроить оба эти требования, следуя нашему Ubuntu 16.04 начальному руководству по установке сервера на обоих серверах.

Шаг 1. Установите Redis Server и клиентское программное обеспечение

Нашим первым шагом будет установка необходимого программного обеспечения на обеих наших машинах. Нашей машине * redis * понадобится сервер Redis. На нашей * веб * машине мы установим расширение Redis PHP для обработки сеанса и клиент командной строки Redis для тестирования.

Установка сервера Redis

Первое, что нам нужно сделать, это запустить сервер Redis на нашей машине * redis *.

Мы будем использовать обычный менеджер пакетов Ubuntu с доверенным репозиторием PPA, предоставленным Крисом Ли. Это необходимо для того, чтобы мы получили последнюю стабильную версию Redis.

Сначала добавьте хранилище PPA, выполнив:

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

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

Затем обновите индекс пакета и установите сервер Redis, введя:

sudo apt-get update
sudo apt-get install redis-server

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

redis-cli ping
Redis server outputPONG

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

Установка клиента Redis и расширения PHP

Затем установите клиент командной строки Redis и расширение PHP Redis на сервере * web *. Мы будем использовать клиент командной строки для простого тестирования подключения и аутентификации. Мы будем использовать расширение PHP для хранения данных нашего сеанса.

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

sudo apt-get update
sudo apt-get install redis-tools php-redis

Теперь у вас должен быть доступ к инструменту + redis-cli +, хотя у вас еще нет доступа к серверу для тестирования.

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

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

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

Если Redis развернут в изолированной сети …​

Если ваши серверы работают в изолированной сети, вам, вероятно, нужно настроить файл конфигурации Redis только для привязки к вашему изолированному сетевому IP-адресу.

На сервере * redis * сделайте резервную копию и откройте файл конфигурации Redis:

sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sudo nano /etc/redis/redis.conf

Найдите строку + bind s и добавьте IP-адрес изолированного сетевого сервера Redis:

/etc/redis/redis.conf

bind 127.0.0.1

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

sudo systemctl restart redis-server.service

Откройте доступ к порту Redis:

sudo ufw allow 6379

Redis теперь может принимать соединения от вашей изолированной сети.

Если Redis не развернут в изолированной сети …​

Для сетей, которые не изолированы или которые вы не контролируете, обязательно, чтобы трафик был защищен другими способами. Существует много вариантов защиты трафика на серверах Redis, в том числе:

  • Tunneling with stunnel: вам нужно будет настроить входящий туннель на сервере * redis * и исходящий туннель на сервере * web *. Веб-сервер будет подключаться к локальному порту для связи с удаленной службой Redis.

  • Tunneling with spiped: сервер * web * должен функционировать как клиентская машина + spiped +. Вам нужно будет создать файлы системного модуля на каждом сервере. Веб-сервер будет подключаться к локальному порту для связи с удаленной службой Redis.

  • Setting VPN с PeerVPN: для обоих серверов потребуется быть доступным по VPN. Сервер * web * сможет получить доступ к серверу * redis *, используя свой IP-адрес VPN.

Используя один из описанных выше способов, настройте безопасный доступ с вашего * web * сервера к вашему * redis * серверу. Вам нужно будет знать IP-адрес и порт, которые ваша * веб * машина будет использовать для подключения к службе Redis на удаленной машине.

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

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

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

sudo nano /etc/redis/redis.conf

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

/etc/redis/redis.conf

requirepass

Сохраните и закройте файл, когда вы закончите.

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

sudo systemctl restart redis-server.service

Ваш сервер Redis теперь должен отклонять неаутентифицированные запросы.

Шаг 4. Проверка подключения Redis и аутентификации

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

По умолчанию сервер Redis прослушивает 6379 на локальном интерфейсе, но каждый из рассмотренных выше параметров безопасности сети каким-то образом изменяет настройки по умолчанию для внешних сторон. Мы можем использовать клиент + redis-cli + с опцией + -h +, чтобы указать IP-адрес, и опцию + -p +, чтобы указать порт, необходимый для подключения к удаленному сервису. Вы можете пропустить любой из них, если они используют параметры по умолчанию (127.0.0.1 и 6379 соответственно).

Используемые вами значения будут зависеть от метода, который вы использовали для защиты вашего сетевого трафика:

  • * изолированная сеть *: используйте IP-адрес изолированной сети сервера Redis. Используется порт Redis по умолчанию (6379), поэтому нам не нужно упоминать его: + redis-cli -h +

  • * stunnel * или * spiped *: используйте локальный порт, который туннелирует к удаленной службе Redis: + redis-cli -p +

  • * PeerVPN *: используйте IP-адрес VPN сервера Redis: + redis-cli -h 10.8.0. +

Общая форма:

redis-cli -h  -p

Вы должны иметь возможность подключиться к удаленному экземпляру Redis с сервера * web *.

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

keys *
Web server output(error) NOAUTH Authentication required.

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

AUTH

Вы должны получить * OK * в качестве ответа, указывающего, что ваши учетные данные были приняты.

Web server outputOK

Далее перечислите ключи, которые установлены в Redis:

keys *

Если это свежий сервер Redis, вывод должен быть похож на это:

Web server output(empty list or set)

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

Вернитесь в командную оболочку, набрав:

exit

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

Шаг 5: Установите Redis в качестве обработчика сеанса по умолчанию на веб-сервере

Теперь нам нужно отредактировать файл + php.ini на сервере * web *, чтобы изменить обработчик сеанса по умолчанию для PHP. Расположение этого файла будет зависеть от вашего текущего стека.

Для стека * LAMP * в Ubuntu 16.04, установленного из репозиториев по умолчанию, обычно это + / etc / php / 7.0 / apache2 / php.ini +. Для стека * LEMP * в Ubuntu 16.04 обычно используется путь + / etc / php / 7.0 / fpm / php.ini +. Если вы убедились, что одно из этих мест является правильным, не стесняйтесь пропустить следующий раздел.

(Необязательно) Поиск правильного файла php.ini

Если вы не уверены в местонахождении вашего основного файла + php.ini, вы можете узнать об этом с помощью функции` + phpinfo () + . Откройте файл на вашем * web * сервере с именем `+ info.php + в корневом каталоге вашего документа, который по умолчанию будет + / var / www / html + для LAMP и LEMP:

sudo nano /info.php

Поместите следующий код в файл:

/var/www/html/info.php

<?php
phpinfo();

Посетите доменное имя или IP-адрес вашего * веб * сервера в браузере, после чего введите + / info.php +:

http:///info.php

Найдите строку, содержащую «Loaded Configuration File», и вы должны найти точное местоположение основного загруженного файла + php.ini +.

Удалите файл, когда вы закончите, так как он отображает конфиденциальную информацию о вашей среде:

sudo rm /info.php

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

Изменение конфигурации

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

Если вы используете стек * LAMP * в конфигурации по умолчанию, вам понадобится следующая команда:

sudo nano /etc/php/7.0/apache2/php.ini

Если вы используете стек * LEMP * в конфигурации по умолчанию, вам понадобится следующая команда:

sudo nano /etc/php/7.0/fpm/php.ini

Если вы обнаружили другой путь с помощью метода + phpinfo () +, описанного выше, замените этот путь здесь.

Внутри файла + php.ini найдите строку, содержащую` + session.save_handler`. Значением по умолчанию является + files +. Измените это на + redis +, чтобы использовать расширение Redis PHP.

php.ini

session.save_handler =

Затем найдите строку, содержащую + session.save_path +. Вам необходимо раскомментировать его и изменить значение, чтобы оно содержало строку подключения Redis.

Строка подключения может быть построена в следующем формате, все в одной строке:

tcp://:?auth=

Опять же, правильные значения будут зависеть от выбранной вами стратегии безопасной сети. Используйте те же значения, которые вы указали в команде + redis-cli + ранее. Например, если вы используете + stunnel + или + spiped +, + session.save_path + скорее всего будет выглядеть примерно так:

php.ini

session.save_path = "tcp://:?auth="

Сохраните и закройте файл, когда вы закончите. Затем перезапустите службу PHP, чтобы внести изменения.

В среде * LAMP * введите:

sudo systemctl restart apache2

В среде * LEMP * введите:

sudo systemctl restart php7.0-fpm

Теперь PHP должен быть настроен на использование Redis в качестве обработчика сеанса.

Шаг 6. Проверка обработки сеанса Redis

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

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

sudo nano test.php

Внутри вставьте следующий код:

/var/www/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;

Сохраните и закройте файл.

Для доступа к сценарию укажите вашему браузеру общедоступный IP-адрес * веб * сервера, а затем + / test.php +:

http:///test.php

Он должен увеличивать число, которое вы видите при каждой перезагрузке страницы.

Теперь на вашем компьютере * redis * используйте + redis-cli +, чтобы открыть сеанс. Поскольку мы подключаемся к локальному экземпляру, нам не нужно указывать IP-адрес или порт:

redis-cli

Авторизуйтесь, используя пароль Redis:

AUTH
Redis server outputOK

Теперь проверьте существующие ключи:

keys *

Вы должны увидеть новую запись для нашей сессии PHP:

Redis server output1) "PHPREDIS_SESSION:"

Если вы спросите значение ключа, вы сможете увидеть текущее значение счетчика:

get PHPREDIS_SESSION:
Redis server output"count|i:;"

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

Заключение

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

Related