Wolf
Roman Grossi
Tobishua
Digital nomad and originality

Небольшой гайд для самого себя по настройке хранения сессий PHP в Redis вместо файлов.

Используемое окружение: две виртуалки на Ubuntu Server 16.04 (одна сервер приложений с nginx и php-fpm, другая - сервер для Redis).

Версия Redis: 4.0.1

Версия PHP: PHP 7.0.22

Преимущества, которые даёт использование Redis для хранения сессий:

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

Шаг 1. Установка Redis

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

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

 

Обновляем список пакетов (это нужно упоминать?):

sudo apt update

 

Устанавливаем Redis-сервер (мне кажется, все эти команды настолько очевидны, что описание лишнее):

sudo apt install redis-server

 

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

redis-cli ping

В ответ должны получить "PONG"

 

Шаг 2. Настраиваем Redis для доступа извне (если устанавливаете на тот же сервер, на котором стоит PHP-FPM, этот шаг можно пропустить)

Получаем список IP-адресов с сервера (если вдруг не знаете свой внешний и локальный IP):

ip r

 

На моей виртуалке вывод получился такой:

default via 10.0.0.1 dev ens3 
10.0.0.0/24 dev ens3  proto kernel  scope link  src 10.0.0.13

Следовательно, в качестве IP для Redis я использую 10.0.0.13 - IP сервера из своей локалки между виртуалками и хостом.

 

Изменяем конфиг Redis:

sudo nano /etc/redis/redis.conf

 

Нам нужно изменить строку bind 127.0.0.1 на следующую:

bind 127.0.0.1 10.0.0.13

Да, в отличие от MySQL Redis умеет слушать на нескольких адресах.

 

Сразу зададим пароль для подключения к Redis (мы же всё таки за секурность) для этого изменим параметр requirepass:

requirepass SUpeR_PASS

(SUpeR_PASS - совсем не супер-пароль, не нужно такое использовать, пожалуйста)

 

Рестартанём Redis:

service redis-server restart

 

Теперь проверим, всё ли у нас хорошо (я подключался со своей локальной машины, которая имеет доступ в локальную сеть между серверами, но вы можете сделать это и с того же сервера на котором стоит Redis):

redis-cli -h 10.0.0.13

В выводе у нас появится что-то вроде: "10.0.0.13:6379>"

 

Попробуем получить список всех ключей:

10.0.0.13:6379>keys *

А в ответ получим "(error) NOAUTH Authentication required.". Конечно! У нас же настроена аутентификация по паролю, поэтому аутентифицируемся:

10.0.0.13:6379>AUTH SUpeR_PASS

После этого при получении списка ключей у нас будет вывод: "(empty list or set)".

Шаг 3. Устанавливаем Redis для PHP

Сразу оговорюсь, я делаю это уже на другой виртуалке, на той, где стоит php-fpm. Если у вас используется только один сервер под Redis и php-fpm, то вы должны делать это там же, где и предыдущие шаги.

Сначала скачиваем расширение Redis.

Для этого перейдём в /tmp, чтобы не оставлять за собой мусор:

cd /tmp

 

И скачаем архив с расширением:

wget https://github.com/phpredis/phpredis/archive/php7.zip -O phpredis.zip

 

Теперь распакуем и установим его:

unzip -o /tmp/phpredis.zip && mv /tmp/phpredis-* /tmp/phpredis && cd /tmp/phpredis && phpize && ./configure && make && sudo make install

 

Добавляем расширение следующими командами:

sudo touch /etc/php/7.0/mods-available/redis.ini && echo extension=redis.so > /etc/php/7.0/mods-available/redis.ini
sudo ln -s /etc/php/7.0/mods-available/redis.ini /etc/php/7.0/apache2/conf.d/redis.ini
sudo ln -s /etc/php/7.0/mods-available/redis.ini /etc/php/7.0/fpm/conf.d/redis.ini
sudo ln -s /etc/php/7.0/mods-available/redis.ini /etc/php/7.0/cli/conf.d/redis.ini

 

И перезагружаем php-fpm:

service php7.0-fpm restart

 

Теперь настроим PHP для сохранения сессий в Redis. У меня используются разные конфиги для разных сайтов, которые находятся в /etc/php/7.0/pool.d/ и поэтому в те конфиги, на сайтах которых мне нужно хранить сессии в Redis я добавил такие строки:

php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://10.0.0.13:6379?auth=SUpeR_PASS"

 

После этого снова перезагрузим php-fpm:

service php7.0-fpm restart

И вуаля! Теперь при запросе списка ключей в Redis мы будем получать список сохранённых сессий (они начинаются с подстроки "PHPREDIS_SESSION:".