Базы данных 11 мин чтения 2026-09-20

Настройка и безопасность Redis на Linux VDS: кэширование сайтов, защита от OOM-Killer и блокировка атак через порт 6379

Настройка высокопроизводительного и защищенного сервера Redis на Linux VDS: расчет и ограничение maxmemory от аварийного OOM-Killer, выбор политики вытеснения allkeys-lru, отключение THP, работа через Unix Domain Socket для максимальной скорости и блокировка атак майнеров через порт 6379.

Инженерная редакция SysKit Проверено инженерами SysKit.ru

Сетевое хранилище структур данных в оперативной памяти Redis (Remote Dictionary Server) является стандартом де-факто для высоконагруженных веб-проектов. Его внедрение в качестве объектного кэша для систем управления контентом (WordPress, 1С-Битрикс, OpenCart) и фреймворков (Laravel, Django, Node.js) способно сократить время отклика страниц (TTFB) с 800–1200 мс до молниеносных 50–120 мс, разгрузив реляционную СУБД (MySQL, MariaDB или PostgreSQL) на 70–90%.

Однако установка Redis «из коробки» со стандартными настройками на виртуальном сервере (VDS) несет в себе две критические угрозы:

  • Аварийное падение сервера из-за Linux OOM-Killer: по умолчанию Redis не имеет ограничений по объему потребляемой памяти или настроен с политикой noeviction. При росте базы кэша он вытесняет MySQL и PHP-FPM, после чего ядро операционной системы экстренно убивает самый тяжелый процесс (чаще всего базу данных).
  • Массовые атаки ботнетов через порт 6379: сканеры уязвимостей непрерывно прощупывают диапазоны IPv4 в поисках открытых инстансов Redis без пароля. Злоумышленники эксплуатируют штатные команды сохранения дампа на диск (CONFIG SET dir /root/.ssh и CONFIG SET dbfilename authorized_keys) для мгновенного захвата root-доступа и внедрения скрытых майнеров.

Ниже подробно разбираем развертывание и тонкую настройку защищенного инстанса Redis на сервере с Ubuntu 24.04 LTS: ограничение памяти, устранение предупреждений ядра Linux, переключение на локальный Unix-сокет и полную изоляцию от внешнего интернета.

1. Роль Redis в ускорении сайтов: разница между объектным кэшированием и кэшем страниц

Частая ошибка начинающих администраторов — путаница между полностраничным кэшированием (FastCGI Cache в Nginx) и объектным кэшированием (Object Cache в Redis):

Характеристика Полностраничный кэш (Nginx) Объектный кэш (Redis)
Что сохраняется Готовый HTML-код страницы целиком Результаты тяжелых SQL-запросов, сессии, метаданные
Авторизованные пользователи Отключается (личный кабинет, корзина) Работает всегда, ускоряя генерацию страниц
Место хранения Файлы на NVMe-диске Оперативная память (RAM) с доступом за микросекунды
Нагрузка на СУБД (MySQL) 0 запросов при попадании в кэш Снижение на 75–90% даже при динамических запросах
Инвалидация данных Сброс всей страницы при обновлении Точечное обновление только измененных ключей

Для интернет-магазинов и каталогов связка двух уровней кэширования дает синергетический эффект: Nginx мгновенно отдает статический контент анонимным гостям, а Redis берет на себя ускорение корзины, оформления заказов и фильтрации товаров для авторизованных клиентов.

2. Системные требования к VDS и расчет объема памяти под кэш

Поскольку Redis хранит все ключи непосредственно в оперативной памяти, расчет лимитов памяти — главный шаг при проектировании сервера. Недопустимо отдавать под кэш всю свободную память: операционная система, веб-сервер Nginx, пулы PHP-FPM и база данных MySQL также требуют гарантированных ресурсов.

Рекомендуемая пропорция распределения RAM на типовых конфигурациях VDS:

  • VDS с 1 ГБ RAM: maxmemory 128mb (экстремальный минимум, только для небольших блогов с легким кэшем).
  • VDS с 2 ГБ RAM: maxmemory 256mb – 384mb (оптимально для большинства сайтов на WordPress / WooCommerce со средним трафиком).
  • VDS с 4 ГБ RAM: maxmemory 512mb – 1024mb (комфортная конфигурация для крупных каталогов с тысячами товаров и частыми обновлениями цен).

Совет инженера: точный расчет ресурсов сервера

Для гармоничного распределения оперативной памяти между процессами ознакомьтесь с практическим руководством Тюнинг PHP-FPM под объем RAM на платформе SysKit. Оно поможет рассчитать точное количество воркеров pm.max_children с учетом выделенной квоты под Redis и буферный пул MySQL.

3. Установка и оптимизация параметров ядра Linux (Overcommit и THP)

Установим официальный пакет Redis из репозитория Ubuntu 24.04 LTS:

sudo apt update && sudo apt upgrade -y
sudo apt install -y redis-server php-redis

Сразу после установки и запуска служба Redis в логах (/var/log/redis/redis-server.log) выводит три критических системных предупреждения, влияющих на стабильность работы при высоких нагрузках:

  1. WARNING: vm.overcommit_memory is 0! Background save may fail under low memory condition.
  2. WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis.
  3. WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

Устраним их на системном уровне.

1. Настройка overcommit_memory и somaxconn

Параметр vm.overcommit_memory = 1 разрешает ядру выделять память процессам сверх физического объема (память выделяется по требованию при записи — Copy-on-Write). Без этого фоновый процесс сброса кэша (BGSAVE) может упасть с ошибкой нехватки памяти, даже если физически свободной RAM достаточно.

# Добавление параметров в системную конфигурацию sysctl
cat <<'EOF' | sudo tee -a /etc/sysctl.d/99-redis.conf
vm.overcommit_memory = 1
net.core.somaxconn = 1024
EOF

# Немедленное применение настроек без перезагрузки сервера
sudo sysctl --system

2. Отключение Transparent Huge Pages (THP)

Механизм Transparent Huge Pages объединяет стандартные страницы памяти по 4 КБ в гигантские блоки по 2 МБ. Для Redis, который непрерывно оперирует мелкими строками и хэшами, это катастрофа: любое мелкое изменение в ключе вызывает копирование всего блока в 2 МБ, провоцируя дикие скачки задержки (latency spikes) и раздувание потребления RAM.

Создадим постоянный systemd-юнит для гарантированного отключения THP при каждой загрузке ОС:

cat <<'EOF' | sudo tee /etc/systemd/system/disable-thp.service
[Unit]
Description=Disable Transparent Huge Pages for Redis Performance
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=redis-server.service

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag'

[Install]
WantedBy=basic.target
EOF

# Активация и запуск службы
sudo systemctl daemon-reload
sudo systemctl enable --now disable-thp.service

Проверьте статус отключения: команда cat /sys/kernel/mm/transparent_hugepage/enabled должна вывести always madvise [never].

4. Рекомендуемые надежные VDS-провайдеры с быстрой памятью и NVMe

Производительность In-Memory хранилищ напрямую зависит от тактовой частоты процессора и пропускной способности оперативной памяти (DDR4/DDR5), а также надежности NVMe-накопителей. Ниже представлены проверенные российские провайдеры для размещения нагруженных баз данных и кэш-серверов:

Рекомендуемые VDS-провайдеры

Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с

Выбор редакции
⚡

Timeweb Cloud

Отличная платформа для высоконагруженных сайтов с Redis: современные процессоры с высокой частотой до 3.8 ГГц, быстрая память DDR4/DDR5, сверхскоростные NVMe-накопители и автоматические бэкапы.

Конфигурация
1–2 vCPU / 2–4 GB RAM / 25–40 GB NVMe
Tier III ЦОД
🔷

Selectel

Премиальные серверы корпоративного класса в дата-центрах Москвы и Санкт-Петербурга. Гарантированные аппаратные ресурсы без оверселлинга, низкий пинг и защита от DDoS-атак на сетевом уровне.

Конфигурация
1–2 vCPU / 2–4 GB RAM / 30–50 GB NVMe
Простой старт
🟠

Beget

Надежные облачные серверы с удобной панелью, мгновенным запуском чистой Ubuntu 24.04 LTS, круглосуточной квалифицированной поддержкой и прозрачными тарифами без скрытых списаний.

Конфигурация
1–2 vCPU / 2 GB RAM / 25 GB NVMe

5. Конфигурация redis.conf: лимиты памяти maxmemory и политики вытеснения

Откроем основной конфигурационный файл /etc/redis/redis.conf и настроем жесткие границы потребления ресурсов.

Ограничение памяти и политика allkeys-lru

Найдите блок управления памятью и задайте параметры (для сервера с 2 ГБ RAM выделим 384 МБ под Redis):

# Жесткий лимит оперативной памяти для хранения ключей
maxmemory 384mb

# Алгоритм вытеснения при достижении лимита
maxmemory-policy allkeys-lru

# Точность выборки ключей для алгоритма LRU
maxmemory-samples 5

Важное предупреждение: опасность политики noeviction

По умолчанию в старых версиях активна политика noeviction. Когда память заполнится на 100%, Redis перестанет принимать любые новые команды записи (возвращая ошибку OOM command not allowed when used memory > 'maxmemory'), что немедленно приведет к сбою оформления заказов и авторизации на сайте. Политика allkeys-lru (Least Recently Used) автоматически удаляет наименее востребованные старые ключи, освобождая место под свежие данные.

Отключение ненужных снимков на диск для экономии I/O

Если Redis используется исключительно как кэш для WordPress или Битрикс, сохранение данных на диск при перезагрузке не требуется: при перезапуске кэш прогреется заново естественным путем. Постоянная фоновая запись дампов dump.rdb на медленных виртуальных дисках создает паразитный I/O-трафик и держит ядро процессора.

Отключите RDB-снимки, закомментировав или обнулив директивы save:

# Отключение сохранения снимков RDB на диск
save ""

# Отключение журнала предзаписи AOF (если не нужен для транзакций)
appendonly no

6. Безопасность и защита от взлома: изоляция порта 6379 и пароль

Более 80% взломов серверов с установленным Redis происходят по одной схеме: администратор оставляет директиву bind 0.0.0.0 или разворачивает контейнер Docker с публикацией порта 6379:6379 без пароля. Злоумышленник подключается через утилиту redis-cli и выполняет следующую цепочку команд:

CONFIG SET dir /root/.ssh/
CONFIG SET dbfilename "authorized_keys"
SET evil_key "

ssh-rsa AAAAB3NzaC1yc2E... hacker@root

"
SAVE

После выполнения команды SAVE вредоносный SSH-ключ записывается в файл /root/.ssh/authorized_keys, и атакующий получает полный шелл-доступ к серверу от имени суперпользователя. Подробное расследование таких инцидентов читайте в руководстве Взлом Linux VDS: расследование и удаление скрытых майнеров.

Для 100% защиты от этой уязвимости внедрим комплекс мер в /etc/redis/redis.conf:

# 1. Привязка строго к локальному сетевому интерфейсу
bind 127.0.0.1 ::1

# 2. Включение защищенного режима
protected-mode yes

# 3. Установка стойкого криптографического пароля
requirepass ЗАМЕНИТЕ_НА_ВАШ_ДЛИННЫЙ_СЛУЧАЙНЫЙ_ПАРОЛЬ

# 4. Переименование или блокировка опасных административных команд
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG "SYSKIT_SECRET_CONFIG_COMMAND"
rename-command DEBUG ""
rename-command SHUTDOWN "SYSKIT_SECRET_SHUTDOWN_COMMAND"

Сгенерировать надежный 32-значный пароль можно с помощью онлайн-сервиса Генератор надежных паролей онлайн на SysKit.

Директива rename-command ... "" полностью отключает выполнение команды, делая невозможным манипуляцию путями к файловой системе даже в случае утечки пароля.

7. Подключение Redis к сайтам: Unix Domain Socket и WordPress

Если веб-сервер и Redis работают на одном и том же физическом или виртуальном сервере, обращение через TCP-сокет (127.0.0.1:6379) создает лишние накладные расходы на сетевой стек TCP/IP (формирование пакетов, проверка контрольных сумм, handshake). Переключение на Unix Domain Socket увеличивает пропускную способность передачи данных на 15–25% и дополнительно изолирует сервис от сетевых атак.

Активация Unix-сокета в redis.conf

Раскомментируйте и настройте следующие строки в /etc/redis/redis.conf:

unixsocket /var/run/redis/redis-server.sock
unixsocketperm 770

Добавьте системного пользователя веб-сервера (в Ubuntu это www-data) в группу redis, чтобы PHP имел права на чтение и запись в сокет:

sudo usermod -aG redis www-data
sudo systemctl restart redis-server
sudo systemctl restart php8.3-fpm # укажите вашу версию PHP

Подключение к WordPress (Redis Object Cache)

Установите популярный плагин Redis Object Cache через панель WordPress или WP-CLI. В файле wp-config.php перед строкой /* That's all, stop editing! */ добавьте настройки подключения через Unix-сокет:

// Настройки подключения Redis Object Cache через Unix Socket
define('WP_REDIS_SCHEME', 'unix');
define('WP_REDIS_PATH', '/var/run/redis/redis-server.sock');
define('WP_REDIS_PASSWORD', 'ВАШ_ДЛИННЫЙ_ПАРОЛЬ_ИЗ_REQUIREPASS');

// Предотвращение пересечения кэша между разными сайтами на одном сервере
define('WP_CACHE_KEY_SALT', 'my_unique_site_salt_');

// Таймауты подключения
define('WP_REDIS_TIMEOUT', 1);
define('WP_REDIS_READ_TIMEOUT', 1);

Перейдите в консоль WordPress в раздел Настройки → Redis и нажмите Включить объектный кэш (Enable Object Cache). Статус изменится на Connected, а нагрузка на MySQL моментально снизится.

8. Мониторинг здоровья и производительности: redis-cli stat и info

Для контроля за эффективностью работы кэша используйте встроенные инструменты командной строки.

Подключитесь к CLI с указанием пароля:

redis-cli -a "ВАШ_ПАРОЛЬ"

1. Проверка коэффициента попадания в кэш (Hit Rate)

Выполните команду получения статистики:

127.0.0.1:6379> INFO stats

Найдите строки keyspace_hits и keyspace_misses. Коэффициент попадания рассчитывается по формуле:

Hit Rate = keyspace_hits / (keyspace_hits + keyspace_misses) * 100%

На прогретом сайте показатель должен составлять от 85% до 98%. Если значение ниже 70%, это признак того, что объем maxmemory недостаточен и нужные ключи слишком быстро вытесняются, либо время жизни ключей (TTL) настроено некорректно.

2. Мониторинг в реальном времени (stat mode)

redis-cli -a "ВАШ_ПАРОЛЬ" --stat

Команда выводит компактную таблицу с ежесекундным обновлением: текущее число ключей, потребление оперативной памяти, количество подключенных клиентов и число обрабатываемых запросов в секунду (RPS).

9. Чек-лист безопасности и сетевой фаервол UFW

Проверьте, к каким сетевым адресам привязан порт демона с помощью утилиты ss:

sudo ss -tulpn | grep 6379

Вывод должен содержать исключительно адреса 127.0.0.1:6379 и [::1]:6379. Ни при каких обстоятельствах там не должно быть 0.0.0.0:6379 или *:6379.

Убедитесь, что фаервол UFW блокирует любые внешние попытки подключения к порту:

# Порт 6379 не должен быть разрешен в правилах UFW
sudo ufw status verbose

Проверить видимость порта из внешнего мира можно прямо из браузера с помощью сервиса Сканер открытых портов онлайн на SysKit: введите IP вашего VDS и порт 6379 — статус обязан быть «Закрыт» (Closed/Filtered).

10. Резюме и чек-лист готовности к промышленной эксплуатации

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

Перед вводом в постоянную эксплуатацию сверьтесь с контрольным чек-листом:

  • [x] В ядре Linux включен параметр vm.overcommit_memory = 1 в файле /etc/sysctl.d/99-redis.conf.
  • [x] Служба disable-thp.service деактивирует Transparent Huge Pages при старте ОС.
  • [x] В redis.conf строго задан параметр maxmemory (не более 20–30% от общей RAM сервера).
  • [x] Установлена политика вытеснения maxmemory-policy allkeys-lru вместо опасной noeviction.
  • [x] Установлен надежный пароль через requirepass и заблокированы команды FLUSHALL и CONFIG.
  • [x] Порт 6379 привязан строго к 127.0.0.1 или отключен в пользу Unix-сокета (/var/run/redis/redis-server.sock).
  • [x] Пользователь веб-сервера www-data добавлен в системную группу redis.

Готовы ускорить свои сайты в разы без риска сбоев?

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

Вопросы и ответы (FAQ)

Популярные вопросы вебмастеров и сисадминов по данной теме

Чем грозит отсутствие параметра maxmemory в redis.conf на сервере с сайтом?
Если директива maxmemory не задана, Redis считает, что ему доступна вся физическая память сервера. По мере накопления ключей кэша его процесс начнет вытеснять буферы операционной системы, пулы PHP-FPM и кэш базы данных MySQL. Когда свободная память исчерпается, сработает системный механизм Linux OOM-Killer, который принудительно завершит самый тяжелый процесс (как правило, MySQL/MariaDB), вызвав отказ в обслуживании сайта с ошибкой «Error establishing a database connection».
Почему подключение через Unix-сокет быстрее и безопаснее, чем через TCP (127.0.0.1:6379)?
Unix Domain Socket работает напрямую через память ядра операционной системы без накладных расходов на сетевой стек TCP/IP (отсутствует фрагментация пакетов, вычисление контрольных сумм и сетевая маршрутизация). Это снижает задержку на 15–25% при миллионах микрозапросов. Кроме того, Unix-сокет полностью защищен правами доступа файловой системы Linux (доступ имеет только группа redis и www-data) и принципиально недоступен для сканеров портов извне.
Как часто нужно сбрасывать кэш Redis и замедляет ли это работу сайта?
Регулярно сбрасывать кэш вручную (командами flushall или через плагины) не требуется: грамотно настроенная политика allkeys-lru сама удаляет старые и неиспользуемые ключи при заполнении лимита maxmemory. Частый ручной сброс кэша вреден: он вызывает «эффект толпы» (Cache Stampede), когда сотни одновременных запросов пользователей устремляются напрямую в MySQL, вызывая 100% загрузку CPU и зависание базы данных.

Читайте также в блоге SysKit

Смежные руководства и полезные технические статьи