Установка 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.
    Метки:
    Поделиться публикацией
    Комментарии 17
    • +3
      Вот еще бы статьо «Основы работы с Redis + php» — было бы совсем хорошо
      • +2
        Зачем? — обычно на такие заявления я отвечаю «курите ман»
        Отвечу словами Дерика (известного разработчика ядра РНР, создателя xdebug, дословный перевод):
        «если Вы не знаете, как это использовать, то это Вам не надо»
        Если Вы считаете, что использование редиса — это круто, то Вы явно ошибаетесь.
        • 0
          Именно так!
          • +1
            Не зная что такое Redis, его приемущества и недостатки нельзя с увереностью сказать нужен он или нет. И дело не в крутости, а в полезности использования
            • 0
              Имеется в виду, что если-бы это вам было действительно нужно, то вы бы взяли и научились пользоваться редисом, а не ждали пока кто-то все по полочкам разложит. Тем более подобных статей в открытом доступе очень много.
        • 0
          А почему собираете вручную, а не ставите redis из пакетов?
          • +1
            Сравните версии Redis и phpredis в репах и в репозиториях.
            Версии отличаются на порядок, а значит и стабильность выше и функционал шире.

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

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

              нету init.d файла, копирование бинарников ручками, зачем-то выкачиваем базовый конфиг wget-ом, хотя он есть и в zip с исходником, к редису конектимся телнетом — а зачем тогда компилировали и копировали redis-cli?
              • 0
                >к редису конектимся телнетом
                это нормальная практика для проверки работоспособности любых серверов.
                и к мемкешу, и к редису, и к хандлерсокету я всегда коннекчусь телнтом для проверки работоспособности.
                • +1
                  >нету init.d файла
                  а вот то, что нет init.d — это верное замечание
                • НЛО прилетело и опубликовало эту надпись здесь
                  • 0
                    >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
                    Автозагрузка

                    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
                      как мне кажется, единственная причина собирать 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 кричит об етом в логе)

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