Уже много раз настраивал memcached для работы через unix-сокеты. И каждый раз на это уходит куча времени, потому что все инструкции в гугле попадаются с одинаковой ошибкой. Даже в документации Bitrix про этот нюанс ничего не сказано. Проблема собственно в правах на сам файлик с сокетом. Поэтому напишу свою статью на эту тему, чисто для себя, чтобы не забыть.
Как настроить memcached через unix-сокеты
Для примера возьмём стандартную CentOS. Установка стандартная:
# yum -y install memcached
Далее добавьте memcached в автозагрузку.
# service memcached start# chkconfig memcached on
Установите библиотеку php-memcache (в 1С-Битрикс: Веб-окружение модуль уже подключён). Если у вас изначально была голая CentOS, то этого модуля скорей всего нет, про это во многих инструкциях забывают:
# yum -y install php-pecl-memcache
Далее нужно настроить memcache. В CentOS 6 и 7 версии конфиг находятся в файле /etc/sysconfig/memcached. Выглядеть он должен примерно так:
PORT="0" USER="memcached" MAXCONN="1024" CACHESIZE="1024" OPTIONS="-t 8 -s /tmp/memcached.sock -a 0666"
Самое главное обратите на параметры запуска:
PORT=»0″ позволяет отключить прослушивание TCP-сокета. С точки зрения безопасности это правильно, лишние открытые порты нам не нужны.
USER=»memcached» задаёт владельца сокет-файла, который мы собираемся создать. Никто, кроме владельца, не сможет читать и писать что-либо в сокет.
CACHESIZE=»64″ мы оставили как есть, однако в этом параметре вы можете указать количество памяти (в мегабайтах), которое хотите выделить для кэша.
OPTIONS — это основные настройки создания сокет-файла, их две:
-s /tmp/memcached.sock задаёт путь и имя будущего файла сокета
-a 0600 определяет права доступа к файлу
По дефолту права встают 600, но сайты то ходят не с пользователем memcached или bitrix (как пишут во многих инструкциях), поэтому у них просто не хватаеn прав писать в этот сокет. Собственно поэтому выставляем там права 666 или выставляем нужного юзера и тогда всё будет работать.
Как очистить кеш в memcached, когда он работает через сокет?
Очистить memcached кеш в Unix/Linux довольно просто и в гугле находится куча способов, но большинство из них можно использовать, только когда memcache работает через стандартный 11211 порт. А что делать если memcahed настроене на работу через сокеты, как в инструкции в начале статьи? Тогда можно воспользоваться вот такой конструкцией:
echo "flush_all" | nc -U /tmp/memcached.sock
Ещё как вариант можно просто перезагрузить сервис (не желательно так делать):
service memcached restart
Если утилиты nc нет, она легко ставится из стандартных репозитариев в любом дистрибутиве линукс. В качестве бонуса для тех кто дочитал до конца вот такая команда, которая покажет статистику работы memcahed через сокет:
echo "stats" | nc -U /tmp/memcached.sock
Очистить кеш в memcached, когда он работает через стандартный порт:
telnet 127.0.0.1 11211 // присоединяемся
flush_all // чистим
quit // разрываем соединение
Настройки memcache для Bitrix сайтов
Для того чтобы в битриксе использовать memcached нужно в файле /bitrix/php_interface/dbconn.php
define("BX_CACHE_TYPE", "memcache"); define("BX_CACHE_SID", $_SERVER["DOCUMENT_ROOT"]."#01"); define("BX_MEMCACHE_HOST", "unix:///tmp/memcached.sock"); define("BX_MEMCACHE_PORT", "0");
И в файле /bitrix/.settings_extra.php (если его нет, то создать)
<?php return array( 'cache' => array( 'value' => array( 'type' => 'memcache', 'memcache' => array( 'host' => 'unix:///tmp/memcached.sock', 'port' => '0', ), 'sid' => $_SERVER["DOCUMENT_ROOT"]."#01" ), ), ); ?>
Как ни странно бы это звучало, но в итоге на нескольких крупных проектах я совсем отказался от использования memcached. Так как толку от него на хороших серверах никакого нет. Файловый кеш оказался выгоднее. За счёт кеширования на стороне файловой системы, запрашиваемые файлы будут читаться не с диска, а из этого кеша, т.е. из памяти, как и в случае memcached, и получается что сам memcached совершенно не нужен, а только занимает память.
В каждом конкретном случае нужно смотреть и пробовать, а будет ли вообще хоть какой-то прирост производительности от этого memcached, или стоит переложить всю работу по кешированию на файловую систему.
В битриксе тоже не всё так хорошо и многие компоненты не умеют использовать memcached и вовремя обновлять его кеш, как итог мы видим кучу запросов в гугле как вручную сбростиь кеш в memcached.
Так а наверное у тебя просто все данные не влезли в мемкеш, учитывая как битрикс тратит гигабайты на кэш
Уведомление:Fastpanel - Нихрена не работает!