Установка и настройка Redis на Debian 8

Для начала немного информации.

1. Что такое Redis?

Redis — это высокопроизводительное нереляционное распределённое хранилище данных. В отличие от Memcached, который может в любой момент удалить ваши данные, вытесняя старые записи новыми, Redis хранит информацию постоянно, таким образом он похож на MemcacheDB.

2. Чем Redis отличается от существующих решений?

API для работы с Memcached (MemcacheDB) позволяет хранить массивы, но эти массивы будут сериализованы и сохранены как строки, таким образом атомарные операции над такими массивами не возможны.
Redis позволяет хранить как строки, так и массивы, к которым можно применять атомарные операции pop/push, делать выборки из таких массивов, выполнять сортировку элементов, получать объединения и пересечения массивов.

3. Производительность

110000 запросов SET в секунду, 81000 запросов GET в секунду на Linux-сервере начального уровня (тесты).

Высокая скорость работы Redis обеспечивается тем, что данные хранятся в оперативной памяти и сохраняются на диск либо через равные промежутки времени, либо при превышении определённого количества не сохранённых запросов. Из этого вытекает, что используя Redis, вы можете потерять результаты нескольких последних запросов, что вполне приемлемо для большинства веб-приложений, учитывая, что обращение к Redis по скорости сравнимо с обращением к оперативной памяти. Тем не менее, потерь можно избежать через избыточность — Redis поддерживает неблокирующую master-slave репликацию.

4. Sharding

Redis, как и Memcached, может работать как распределённое хранилище на многих физических серверах. Такой функционал реализуется в клиентских библиотеках, и к сожалению, «из коробки» этот функционал реализован пока только в Ruby API, однако это не мешает вам хешировать ключ самостоятельно и получать ID сервера, к которому с этим ключом обращаться.

Установка и базовая настройка.

Исходные данные: Debian 8.8 Jessie (amd64)

Установка:

apt-get install redis-server

Проверяем

netstat -plunt | grep -i redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1035/redis-server 1

Все нормально, Redis слушает на порту 6379.

Настройка безопасности.

1. Запускаем redis-server только на localhost

В некоторых дистрибутивах Linux после установки Redis принимает запросы на всех интерфейсах, что недопустимо из соображений безопасности, т.к. по-умолчанию доступ к Redis не защищен паролем.

Поэтому будет не лишним проверить в файле /etc/redis/redis.conf
наличие строки

bind 127.0.0.1

Если её нет, обязательно пропишите.

Далее, если прописали, то перезапускаем Redis:

/etc/init.d/redis-server restart

2. Ставим пароль на доступ к redis-server:

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

redis-cli info | grep redis_version

Поэтому создаем пароль:

echo "MEGAPASSWD" | sha256sum

И в файле /etc/redis/redis.conf пишем

requirepass 8e77158d2c7a0348d16fb0ef59af6afbefac9dfb11a8f3a16a7a822b5feaf39e

Далее, если прописали, то перезапускаем Redis:

/etc/init.d/redis-server restart

Теперь при попытке сделать:

redis-cli info | grep redis_version

мы видим, что анонимно заходить нельзя.

А как тогда можно?

Например так:

redis-cli
127.0.0.1:6379> info
NOAUTH Authentication required.
127.0.0.1:6379> AUTH 8e77158d2c7a0348d16fb0ef59af6afbefac9dfb11a8f3a16a7a822b5feaf39e
OK
127.0.0.1:6379> info
# Server
redis_version:2.8.17
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:4c1d5710660b9479
redis_mode:standalone
os:Linux 3.16.0-4-amd64 x86_64
....
127.0.0.1:6379> quit

ВНИМАНИЕ! Запуская redis-cli и вводя в нем команды, включая AUTH с паролем история этих команд сохраняется в файле ~/.rediscli_history
Если злоумышленник получит к нему доступ, то и сможет узнать пароль.
Конечно ~/.rediscli_history доступен только текущему пользователю, например root и никто другой его не прочитает, но об этом лучше знать.
Так же пароль хранится в файле /etc/redis/redis.conf и по-умолчанию этот файл доступен на чтение всем пользователям сервера, что совершенно неправильно и это мы исправим далее.

3. Переименовываем и отключаем особо важные команды, это FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME и DEBUG

Для этого в файле /etc/redis/redis.conf пишем:

rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command SHUTDOWN SHUTDOWN_ARB
rename-command CONFIG CONFIG_ARB

Далее, если прописали, то перезапускаем Redis:

/etc/init.d/redis-server restart

4. Смена прав на директорию с базой и файл конфигурации

Смотрим права по-умолчанию на директорию с базой:

ls -ld /var/lib/redis
drwxr-xr-x  2 redis           redis        4096 Sep  9 10:14 redis

Меняем

chmod 700 /var/lib/redis

Смотрим права по-умолчанию на файл конфигурации

ls -l /etc/redis/redis.conf
-rw-r--r-- 1 root root 33004 Sep  9 10:15 /etc/redis/redis.conf

Меняем

chown redis:root /etc/redis/redis.conf
chmod 600 /etc/redis/redis.conf

Далее, если все сделали, то перезапускаем Redis:

/etc/init.d/redis-server restart

На этом базовая настройка Redis закончена.