21 декабря 2011 в 14:40

Установка Redis + Redis PHP + phpRedisAdmin на боевом сервере за 15 минут

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

В данной статье речь пойдет о том, как подготовить Redis, phpredis (С модуль для php) и phpRedisAdmin для работы на боевом сервере.

Для того, чтобы собрать все полноценно, нам нужно иметь на сервере:
  • gcc 4.5.2 (Я компилировал под этой версией, но думаю, что с другими проблем не возникнет)
  • Make 3.81 (Опять же, версия не принципиальна)
  • php5-dev (Версия должна совпадать с версией php)


После того, как мы убедимся, что все зависимости удовлетворены, начинаем собирать все компоненты.
Нам потребуются:
  • Redis 2.4.4 Stable
  • phpredis 2.1.3
  • phpRedisAdmin


Собираем Redis


Для того, чтоб собрать Редис, нам потребуются сами исходники. Получить их можно с github. Поэтому
https://github.com/antirez/redis/zipball/2.4.4 загружаем сразу нужный тег.

$ wget https://github.com/antirez/redis/zipball/2.4.4
$ unzip 2.4.4
$ cd antirez-redis-04bba69


Теперь у нас есть все исходники Redis 2.4.4, осталось их скомпилировать.
Все очень просто
$ make
$ make test


Первой командой мы собрали Redis, второй его проверили на работоспособность.
Make test будет проходить долго (около 2х минут). После теста должна вернуться такая строка "\o/ All tests passed without errors!"

Redis собран, осталось зачистить мусор и унести редис в нужный каталог.
Унесем весь скомпилированный Redis в папку /usr/bin/redis. А чтоб запускать Redis-server, в /usr/bin создадим shell файл redis-server.

Уносим файлы Redis в /usr/bin/redis


Мы все еще остаемся в папке antirez-redis-04bba69, где лежат исходники
$ sudo mkdir /usr/bin/redis
$ sudo cp src/redis-benchmark /usr/bin/redis
$ sudo cp src/redis-check-aof /usr/bin/redis
$ sudo cp src/redis-check-dump /usr/bin/redis
$ sudo cp src/redis-cli /usr/bin/redis
$ sudo cp src/redis-server /usr/bin/redis
$ cd ..
$ rm -rf antirez-redis-04bba69

Мы скопировали все файлы от Redis и удалили папку с исходниками, она нам уже не нужна.
Будьте осторожны с последней командой! sudo для нее не нужен, папка и так в наших владениях.

Теперь нам нужно создать файл для запуска redis-server.

$ sudo vim /usr/bin/redis-server


Вместо vim можете использовать любой другой редактор. Это не принципиально.
В файл вставляем:
cd /usr/bin/redis && ./redis-server redis.conf
Сохраняем, закрываем.

Для этого файла нужно дать право на исполнение.
$ sudo chmod 755 /usr/bin/redis-server


Осталось взять redis.conf
$ cd /usr/bin/redis/
$ sudo wget https://raw.github.com/antirez/redis/unstable/redis.conf
$ sudo vim redis.conf


Redis.conf загружен, осталось его настроить.
Заменяем в файле конфигурации

daemonize no на daemonize yes # Пусть работает как демон
timeout 0 на timeout 30 # В случае баги клиент, который не отсоединяется, навечно зависнет в памяти Redis
loglevel notice на loglevel warning # У нас боевой сервер, минимум отладочных сообщений
Строку 166 нужно расскоментировать и установить пароль к примеру requirepass foobared
Строку 350 комментируем, она не нужна.

Сохраняем, закрываем.

Запуск!


Если все было сделано правильно, то запускаем сервер
$ redis-server
$ telnet localhost 6379


По идее вам должно показать приглашение от Redis
Trying 127.0.1.1…
Connected to localhost.
Escape character is '^]'.

Если вы его получили, значит все отлично, Redis работает.

Тестируем сервер


Теперь мы общаемся с Redis по сокету.
Авторизируемся:
AUTH mypassword


Устанавливаем тестовое значение
SET testkey testvalue
KEYS * # Получаем все ключи
GET testkey # Сервер должен вернуть testvalue
QUIT


Если все прошло успешно, значит сервер работает, и с ним мы заканчиваем. Устанавливаем команду на автозагрузку при старте системы и все.

Redis + PHP5. Компилируем модуль для PHP


Тут тоже все очень просто, так что можно просто следовать командам.
$ cd ~
$ wget https://github.com/nicolasff/phpredis/zipball/2.1.3
$ unzip 2.1.3
$ cd nicolasff-phpredis-43bc590

Тут думаю комментарии не нужны.

Теперь собираем redis.so расширение.
$ phpize
$ ./configure CFLAGS="-O3"
$ make clean all

Теперь в папке modules появился файл redis.so, он-то нам и нужен.

$ sudo cp modules/redis.so /usr/lib/php5/<date>
$ cd ..
$ rm -rf nicolasff-phpredis-43bc590

<date> меняем на имя папки, которое выглядит примерно так: 20090626.

Далее дать информацию php о Redis.so
поэтому
$ sudo vim /etc/php5/apache2/conf.d/redis.ini

и вписываем в него extension=redis.so
По желанию заменяем apache2 на cli, cgi и так далее, в зависимости от того, как у Вас установлен php, и как вы его хотите использовать вместе с Redis.

Теперь рестартим apache2 и в тестовом php файле пишем:
$redis = new Redis();
$redis->connect('localhost:6379');

Если ошибка, что класс Redis не существует, не вылетела, то все отлично.

Проведем benchmark тест непосредственно в php.
try {
    $redis = new Redis();
    $redis->connect('localhost:6379');
} catch(RedisException $e) {
    exit('Connect error');
}

$benchmark = microtime(true);

for($i=0;$i < 80000; $i++)
    $redis->set('key','value');

echo microtime(true) - $benchmark;


У меня появилась информация, что 80000 запросов были обработаны за 2.6 секунд.

На этом с php мы закончили. Далее phpRedisAdmin.

Установка phpRedisAdmin



Установка phpRedisAdmin абсолютно не нужна, но для визуализации данных не помешает.

Качаем из git саму админку.
$ cd /var/www
$ git clone git://github.com/ErikDubbelboer/phpRedisAdmin.git redisadmin
$ cd redisadmin
$ chmod 755 -R /var/www/redisadmin


Мы создаем папку redisadmin в /var/www. Добавляем права на файлы, потому что изначально у меня permission denied на redisadmin.

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

$ vim config.inc.php

Нужно расскоментировать строку 11 и установить пароль к серверу.

Далее нужно расскоментировать блок с 36 по 46 строку, назначив админский пароль, который будет запрашиваться при входе в phpRedisAdmin

PROFIT!
За 15 минут мы смогли поднять Redis сервер, настроить его для работы с PHP и поднять phpRedisAdmin.
+10
19211
118
Zerstoren 4,5

Комментарии (17)

+3
Blackman #
Вот еще бы статьо «Основы работы с Redis + php» — было бы совсем хорошо
+2
akalend #
Зачем? — обычно на такие заявления я отвечаю «курите ман»
Отвечу словами Дерика (известного разработчика ядра РНР, создателя xdebug, дословный перевод):
«если Вы не знаете, как это использовать, то это Вам не надо»
Если Вы считаете, что использование редиса — это круто, то Вы явно ошибаетесь.
0
Cresh #
Именно так!
+1
Blackman #
Не зная что такое Redis, его приемущества и недостатки нельзя с увереностью сказать нужен он или нет. И дело не в крутости, а в полезности использования
0
Stark #
Имеется в виду, что если-бы это вам было действительно нужно, то вы бы взяли и научились пользоваться редисом, а не ждали пока кто-то все по полочкам разложит. Тем более подобных статей в открытом доступе очень много.
0
AndrewStephanoff #
А почему собираете вручную, а не ставите redis из пакетов?
+1
Zerstoren #
Сравните версии Redis и phpredis в репах и в репозиториях.
Версии отличаются на порядок, а значит и стабильность выше и функционал шире.

И как я уже сказал в первых строках статьи, самые лучшие приложения это те которые были скомпилированы на этой машине.
0
AndrewStephanoff #
Полагаю, что у вас LFS?
0
Zerstoren #
На такое количество секса, я пока не готов, по этому нет)
+1
VolCh #
Меня всегда интересовало, а что пользователи делают, пока там что-то собирается. :)

А если серьезно, то не былобы правильней собирать бинарные пакет и уже их устанавливать?
+6
seriyPS #
Какой-то сборник вредных советов и нелогичностей по-моему…

нету init.d файла, копирование бинарников ручками, зачем-то выкачиваем базовый конфиг wget-ом, хотя он есть и в zip с исходником, к редису конектимся телнетом — а зачем тогда компилировали и копировали redis-cli?
0
akalend #
>к редису конектимся телнетом
это нормальная практика для проверки работоспособности любых серверов.
и к мемкешу, и к редису, и к хандлерсокету я всегда коннекчусь телнтом для проверки работоспособности.
+1
akalend #
>нету init.d файла
а вот то, что нет init.d — это верное замечание
НЛО прилетело и опубликовало эту надпись здесь
0
seriyPS #
>sudo cp src/redis-benchmark /usr/bin/redis
эм, а что мешало сделать sudo make install?

Вот вот… Автор пишет
$ sudo mkdir /usr/bin/redis
$ sudo cp src/redis-benchmark /usr/bin/redis
$ sudo cp src/redis-check-aof /usr/bin/redis
$ sudo cp src/redis-check-dump /usr/bin/redis
$ sudo cp src/redis-cli /usr/bin/redis
$ sudo cp src/redis-server /usr/bin/redis

ок, открываем мейкфайл github.com/antirez/redis/blob/2.4.4/src/Makefile и видим

PREFIX= /usr/local
INSTALL_BIN= $(PREFIX)/bin
INSTALL= cp -p
# ... #
PRGNAME = redis-server
BENCHPRGNAME = redis-benchmark
CLIPRGNAME = redis-cli
CHECKDUMPPRGNAME = redis-check-dump
CHECKAOFPRGNAME = redis-check-aof
# ... #
install: all
	mkdir -p $(INSTALL_BIN)
	$(INSTALL) $(PRGNAME) $(INSTALL_BIN)
	$(INSTALL) $(BENCHPRGNAME) $(INSTALL_BIN)
	$(INSTALL) $(CLIPRGNAME) $(INSTALL_BIN)
	$(INSTALL) $(CHECKDUMPPRGNAME) $(INSTALL_BIN)
	$(INSTALL) $(CHECKAOFPRGNAME) $(INSTALL_BIN)
0
Forumsky #
Автозагрузка

1. Забираем init.d скрипт
Меняем пути:
DAEMON=/usr/bin/redis/redis-server
DAEMON_ARGS=/usr/bin/redis/redis.conf

2. Создаём пользователя
adduser redis

3. Меняем права на файлы
chown -R redis:redis /usr/bin/redis

Готово!
0
anatolijd #
как мне кажется, единственная причина собирать Redis из исходников — ето если вам критически важно получить самую последнюю версию с исправлением какого-то специфического бага. Да, верно, в офф.репах часто далеко не самьіе новьіе версии, но на практике ето лечится подключением неофициальньіх repo (привет centosaltru).
Преимущество от компилирования — тоже довольно субективное. Посмотрите сколько лишних телодвижений нужно вьіполнить — и юзера создать, и init.d-скрипт, и logrotate.d-файл, и самому потом следить за появлением обновленний и все ради каких-то +1.5% производительности. А производительность упрется в I/O ( AOF-лог, сеть) намного раньше того момента когда могут потребоваться ети полтора процента…
Кстати, подскажите, зачем вьі phpredis собираете с CFLAGS="-O3"? Так, «на всякий случай» или оно все же действительно бьістрее работает?

Чего можно добавить к статье:
— последний stable version всегда доступен для скачивания сдесь: wget download.redis.io/redis-stable.tar.gz
— не забудьте установить 'sysctl vm.overcommit_memory=1' (redis кричит об етом в логе)

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