Настройка memcached через unix-сокеты

Уже много раз настраивал 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 через unix-сокеты: 1 комментарий

  • 19.03.2020 в 15:00
    Permalink

    Как ни странно бы это звучало, но в итоге на нескольких крупных проектах я совсем отказался от использования memcached. Так как толку от него на хороших серверах никакого нет. Файловый кеш оказался выгоднее. За счёт кеширования на стороне файловой системы, запрашиваемые файлы будут читаться не с диска, а из этого кеша, т.е. из памяти, как и в случае memcached, и получается что сам memcached совершенно не нужен, а только занимает память.

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

    В битриксе тоже не всё так хорошо и многие компоненты не умеют использовать memcached и вовремя обновлять его кеш, как итог мы видим кучу запросов в гугле как вручную сбростиь кеш в memcached.

    Ответить

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *