Что будет настроено
Redis часто используют в Laravel для ускорения приложения: кэширования данных, хранения сессий, обработки очередей, rate limiting, временных блокировок, broadcasting и других внутренних механизмов.
Laravel можно подключать к Redis через PHP-расширение PhpRedis или через pure-PHP клиент Predis. Для production обычно лучше использовать PhpRedis: расширение устанавливается на уровне PHP и работает быстрее. Predis остаётся запасным вариантом, если установить PHP-модуль невозможно.
В этой инструкции Redis настраивается как общий локальный сервис для нескольких Laravel-проектов на сервере с ispmanager. Ключевой момент — изолировать проекты друг от друга отдельными Redis-базами и уникальными префиксами ключей.
- Redis будет доступен локально на
127.0.0.1:6379. - Кэш, сессии и очереди разных проектов не должны пересекаться.
- Для каждого Laravel-проекта нужно явно задать Redis-базы и префикс.
Установка Redis-сервера
Подключитесь к серверу по SSH от root или пользователя с sudo-доступом.
Debian / Ubuntu
sudo apt update
sudo apt install redis-server
systemctl status redis-server
sudo systemctl enable redis-server
sudo systemctl start redis-server
redis-cli pingЕсли всё работает, Redis вернёт:
PONGAlmaLinux / Rocky Linux / CentOS
sudo dnf install redis
sudo systemctl enable redis
sudo systemctl start redis
redis-cli pingОжидаемый ответ тот же:
PONGБазовая безопасная настройка Redis
Для Laravel-проектов на том же сервере Redis обычно не нужно открывать наружу. Откройте конфигурационный файл Redis.
sudo nano /etc/redis/redis.confНа RHEL-like системах конфигурация может лежать в другом месте:
sudo nano /etc/redis.confДля локального использования оставьте Redis доступным только с localhost:
bind 127.0.0.1 ::1
protected-mode yesЕсли хотите дополнительно защитить Redis паролем, добавьте:
requirepass СЛОЖНЫЙ_ДЛИННЫЙ_ПАРОЛЬПосле изменения конфигурации перезапустите службу:
sudo systemctl restart redis-serverили:
sudo systemctl restart redisПроверка с паролем:
redis-cli
AUTH СЛОЖНЫЙ_ДЛИННЫЙ_ПАРОЛЬ
PINGУстановка PHP-модуля Redis в ispmanager
Для Laravel лучше использовать PhpRedis. Это PHP-расширение, которое даёт приложению прямой доступ к Redis. В ispmanager важно установить модуль именно для той версии PHP, на которой работает сайт.
На одном сервере могут одновременно жить PHP 8.1, 8.2, 8.3 или 8.4. Если Laravel-проект работает на альтернативной версии PHP, системный модуль Redis может ему не подойти.
Вариант 1. Через интерфейс ispmanager
- Зайдите в ispmanager под root.
- Откройте Settings / Настройки → PHP settings / Настройки PHP.
- Выберите нужную версию PHP.
- Найдите модуль
redis. - Установите и включите его.
После установки перезапустите PHP-FPM нужной версии или веб-сервер.
Вариант 2. Установка вручную через PECL
Если модуля Redis нет в интерфейсе ispmanager, его можно поставить вручную.
Debian / Ubuntu:
sudo apt install autoconf gcc make zlib1g-devAlmaLinux / Rocky Linux / CentOS:
sudo dnf install autoconf gcc make zlib-develДля альтернативных версий PHP в ispmanager PECL обычно запускают из каталога конкретной версии PHP.
Пример для PHP 8.2:
/opt/php82/bin/pecl install redis
echo "extension=redis.so" > /opt/php82/etc/php.d/20-redis.iniПример для PHP 8.3:
/opt/php83/bin/pecl install redis
echo "extension=redis.so" > /opt/php83/etc/php.d/20-redis.iniПути могут отличаться. Найти доступные версии PHP можно так:
ls /opt/
find /opt -name peclПосле установки перезапустите PHP-FPM нужной версии:
systemctl restart php82-php-fpmили:
systemctl restart php8.2-fpmНазвание службы зависит от ОС и сборки PHP. Подходящие службы можно найти так:
systemctl list-units --type=service | grep -i phpПроверьте, что модуль подключился:
/opt/php82/bin/php -m | grep redis
php -m | grep redisЕсли команда выводит redis, PHP-модуль установлен.
Если PhpRedis установить нельзя: Predis
Если нет доступа к установке PHP-расширений, можно использовать Predis:
composer require predis/predisВ .env Laravel укажите:
REDIS_CLIENT=predisДля production-сервера с несколькими Laravel-проектами лучше всё же использовать PhpRedis, если есть возможность поставить расширение.
Настройка Laravel для Redis
Laravel хранит Redis-настройки в config/database.php, а значения обычно берутся из .env. В стандартной конфигурации есть подключения default и cache, а также параметр prefix, который может формироваться на основе APP_NAME.
Минимальный пример .env:
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_DB=0
REDIS_CACHE_DB=1Если Redis защищён паролем:
REDIS_PASSWORD=СЛОЖНЫЙ_ДЛИННЫЙ_ПАРОЛЬВключите Redis для кэша, очередей и сессий:
CACHE_STORE=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redisВ старых версиях Laravel вместо CACHE_STORE может использоваться:
CACHE_DRIVER=redisПосле изменения .env очистите конфигурационный кэш:
php artisan config:clear
php artisan cache:clearЕсли на production используется кэширование конфигурации:
php artisan config:cacheВажная настройка для нескольких Laravel-проектов
Если на одном сервере работают несколько Laravel-проектов, нельзя оставлять одинаковые Redis-префиксы и одни и те же базы без понимания последствий. Иначе очистка кэша, очередей или совпадение ключей могут затронуть соседний проект.
Подход 1. Разные Redis database index
Redis по умолчанию имеет несколько логических баз. Для каждого проекта можно выделить свои базы.
APP_NAME=project_one
REDIS_DB=0
REDIS_CACHE_DB=1
APP_NAME=project_two
REDIS_DB=2
REDIS_CACHE_DB=3
APP_NAME=project_three
REDIS_DB=4
REDIS_CACHE_DB=5REDIS_DB можно использовать для очередей, сессий и default Redis-подключения, а REDIS_CACHE_DB — отдельно для кэша.
Подход 2. Уникальные префиксы ключей
Даже если проекты используют одну Redis-базу, ключи нужно разделять префиксами. В config/database.php обычно есть настройка:
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),Для каждого проекта задайте уникальный APP_NAME и/или REDIS_PREFIX:
APP_NAME=crm_project
REDIS_PREFIX=crm_project_
APP_NAME=shop_project
REDIS_PREFIX=shop_project_
APP_NAME=blog_project
REDIS_PREFIX=blog_project_Рекомендуемые примеры .env
Пример для проекта shop:
APP_NAME=shop
CACHE_STORE=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_DB=0
REDIS_CACHE_DB=1
REDIS_PREFIX=shop_Пример для проекта crm на том же сервере:
APP_NAME=crm
CACHE_STORE=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_DB=2
REDIS_CACHE_DB=3
REDIS_PREFIX=crm_Пример для проекта blog:
APP_NAME=blog
CACHE_STORE=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_DB=4
REDIS_CACHE_DB=5
REDIS_PREFIX=blog_Настройка очередей Laravel через Redis
В .env:
QUEUE_CONNECTION=redisПосле этого задания будут попадать в Redis. Запуск worker:
php artisan queue:work redis --queue=defaultДля production worker лучше запускать через Supervisor или systemd, чтобы он автоматически перезапускался.
Пример systemd-сервиса:
[Unit]
Description=Laravel Queue Worker - shop
After=network.target
[Service]
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /var/www/shop/artisan queue:work redis --sleep=3 --tries=3 --timeout=90
WorkingDirectory=/var/www/shop
[Install]
WantedBy=multi-user.targetФайл можно сохранить как:
/etc/systemd/system/laravel-shop-queue.serviceЗатем выполните:
sudo systemctl daemon-reload
sudo systemctl enable laravel-shop-queue
sudo systemctl start laravel-shop-queueДля каждого проекта создавайте отдельный worker и отдельный systemd-сервис: laravel-shop-queue.service, laravel-crm-queue.service, laravel-blog-queue.service.
Сессии, кэш и проверка работы
Сессии через Redis
SESSION_DRIVER=redis
SESSION_LIFETIME=120
SESSION_COOKIE=shop_sessionЕсли несколько проектов используют один домен или поддомены, задавайте разные SESSION_COOKIE, например shop_session и crm_session.
Кэш через Redis
CACHE_STORE=redisДля старых Laravel-проектов:
CACHE_DRIVER=redisОчистка кэша конкретного проекта:
php artisan cache:clearЕсли у проектов разные REDIS_CACHE_DB и REDIS_PREFIX, эта команда не должна затрагивать кэш других проектов.
Проверка через Laravel
php artisan tinkerCache::put("redis_test", "ok", 60);
Cache::get("redis_test");Ожидаемый результат:
"ok"Проверка Redis напрямую:
redis-cli
KEYS *Если Redis с паролем:
AUTH СЛОЖНЫЙ_ДЛИННЫЙ_ПАРОЛЬ
KEYS *На production лучше не использовать KEYS * на больших базах. Для диагностики безопаснее:
SCAN 0Laravel Horizon и память Redis
Если проект использует Laravel Horizon, Redis обязателен.
composer require laravel/horizon
php artisan horizon:install
php artisan migrate
php artisan horizonДля production Horizon также лучше запускать через Supervisor или systemd. Для каждого проекта должен быть свой REDIS_PREFIX, иначе Horizon и очереди разных проектов могут смешиваться.
Redis хранит данные в памяти, поэтому важно ограничить потребление RAM:
sudo nano /etc/redis/redis.confmaxmemory 512mb
maxmemory-policy allkeys-lruallkeys-lru означает, что при нехватке памяти Redis будет удалять наименее недавно используемые ключи. Для Redis, который используется в основном как кэш, это часто подходящий вариант.
sudo systemctl restart redis-server
redis-cli info memoryЧто важно не делать
- Не используйте один и тот же
REDIS_PREFIXдля нескольких проектов. - Не запускайте все проекты на одной Redis-базе без префиксов.
- Не открывайте Redis наружу через
0.0.0.0, если в этом нет необходимости. - Не храните пароль Redis в публичном репозитории.
- Не забывайте перезапускать PHP-FPM после установки PHP-модуля Redis.
- Не забывайте выполнять
php artisan config:clearиphp artisan config:cacheпосле изменения.envна production.
Быстрый чек-лист
Перед запуском проекта проверьте:
redis-cli ping
php -m | grep redis
php artisan tinkerCache::put("test", "ok", 60);
Cache::get("test");Также проверьте .env:
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_DB=уникальная_база
REDIS_CACHE_DB=уникальная_база
REDIS_PREFIX=уникальный_префикс_
CACHE_STORE=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redisИтог
Redis на сервере с ispmanager можно использовать как общий сервис для нескольких Laravel-проектов. Главное — установить PHP-модуль Redis для нужной версии PHP, подключить Redis в .env и изолировать проекты с помощью разных Redis-баз и уникальных префиксов.
Оптимальная production-схема выглядит так:
REDIS_CLIENT=phpredis
CACHE_STORE=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
REDIS_PREFIX=project_name_
REDIS_DB=отдельная_база
REDIS_CACHE_DB=отдельная_базаТак Redis можно безопасно использовать одновременно для кэша, очередей, сессий и других механизмов Laravel без конфликтов между проектами.