Memcached socket + systemd + selinux + Bitrix

Установка

Установка и настройка на примере ОС Fedora с включенным SELinux.
sudo dnf install php-pecl-memcached.x86_64 phpMemcachedAdmin.noarch memcached.x86_64
phpMemcachedAdmin нужен для мониторинга - не обязателен.
Для того, чтобы memcached стал доступен в настройках "композитного сайта" в Битриксе, надо установить менее продвинутую клиентскую библиотеку (без d в конце названия):
sudo dnf install php-pecl-memcache.x86_64

Настройка

В некоторых источниках говорится, что если используется один сервер, то лучше настроить memcached через socket. Для использования memcached в качестве сокета на Linux с systemd и SELinux нужно проделать довольно многое. Исчерпывающей инструкции я не нашёл, поэтому предлагаю свой вариант.
Для начала скопируем системный сервис-файл в пользовательское пространство, где его можно безопасно править:

sudo cp /usr/lib/systemd/system/memcached.service /etc/systemd/system/memcached.service
Переходим к редактированию. Например, в консоли с помощью редактора nano:

sudo nano /etc/systemd/system/memcached.service
Формируем следующее содержимое:

[Unit]
Description=Memcached
Before=httpd.service
After=network.target

[Service]
Type=simple

# Run ExecStartPre with root-permissions
PermissionsStartOnly=true
ExecStartPre=-/usr/bin/mkdir -p /usr/lib/tmpfiles.d/run/memcached
ExecStartPre=/usr/bin/chown -R memcached:memcached /usr/lib/tmpfiles.d/run/memcached/
EnvironmentFile=-/etc/sysconfig/memcached
# RuntimeDirectory=memcached
# ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
ExecStart=/usr/bin/memcached -u $USER -m $CACHESIZE -c $MAXCONN $OPTIONS

[Install]
WantedBy=multi-user.target
При запуске этого сервиса сначала будет создан каталог для хранения сокета /usr/lib/tmpfiles.d/run/memcached и этому каталогу будет назначен владелец memcached. После этого в указанном каталоге будет создан сокет - это прописано в настройках memcached (/etc/sysconfig/memcached). Вот содержимое этого файла:

# PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="1024"
OPTIONS="-t 8 -s /usr/lib/tmpfiles.d/run/memcached/memcached.socket -a 0766 -v 2>> /var/log/memcached/memcached.$1.log"
Тут заданы максимальное количество одновременных подключений (1024), объём выделяемой памяти для кеша (1 Гб), количество потоков (8), сокет, маска прав доступа к сокету (0766) и логгирование. Порт не устанавливаем, потому что у нас будет соединение через сокет. Чтобы логгирование заработало, создадим каталог:

sudo mkdir /var/log/memcached
И установим ему владельца:

sudo chown memcached:memcached /var/log/memcached
Некоторые настройки позаимствованы из статьи Ускоряем работу с memcached. Сокеты, PECL Memcached, настройки.
Затем изменим контекст SELinux каталогу с сокетом:

sudo semanage fcontext -a -t memcached_var_run_t "/usr/lib/tmpfiles.d/run/memcached(/.*)?"
sudo restorecon -R /usr/lib/tmpfiles.d/run/memcached
Подробности про взаимодействие Memcached и SELinux можно найти тут.
Если ранее сервис был добавлен в автозапуск, то предварительно надо его от туда убрать, т.к. там прописаны системные настройки, а не те, что мы только что сделали в пользовательском пространстве systemd:

sudo systemctl disable memcached.service
sudo systemctl enable memcached.service
Запуск сервиса

sudo systemctl start memcached.service
Автозапуск:

sudo systemctl enable memcached.service
Проверка:

sudo systemctl status memcached.service
Проверка внутреннего состояния (запускать, предварительно переключившись на root):

su

echo stats | nc -U /usr/lib/tmpfiles.d/run/memcached/memcached.socket
Если бы сокет не использовался, то:

echo stats | nc localhost 11211
Если SELinux будет продолжать на что-то ругаться, нужно выполнить его требования (задать те политики, которые он сам предлагает).
Если настраивается не машина разработчика, а сервер, то потребуется также настройка файервола. Например, по инструкции из статьи "Install Memcached on Fedora 24/23, CentOS/RHEL 7.2/6.8/5.11"

Битрикс

В bitrix/php_interface/dbconn.php добавляем:

define("BX_CACHE_TYPE", "memcache");
define("BX_CACHE_SID", $_SERVER["DOCUMENT_ROOT"] . "#01");
define("BX_MEMCACHE_HOST", "unix:///usr/lib/tmpfiles.d/run/memcached/memcached.socket");
define("BX_MEMCACHE_PORT", "0");
В bitrix/.settings.php добавляем:

'cache' => array(
    'value' => array(
        'type' => 'memcache',
        'memcache' => array(
            'host' => 'unix:///usr/lib/tmpfiles.d/run/memcached/memcached.socket',
            'port' => '0',
        ),
        'sid' => $_SERVER["DOCUMENT_ROOT"] . "#01"
    ),
    'readonly' => false,
),
Для проверки, работает ли кеш, можно создать в корне сайта скрипт test-cache.php с содержимым (позаимствовано из статьи "Настройка кэширования в Битриксе — что если не работает?"):

<?
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");

$cache = new CPHPCache();
if ($cache->InitCache(3600, '12356356gt' , '/' )) {
    echo "cache";
    $res = $cache->GetVars();
    $arResult = $res['arResult'];
} elseif ($cache->StartDataCache()) {
    echo "no cache";
    $arResult = array(1,2,3,4,5);
    $cache->EndDataCache(array("arResult" => $arResult));
}

Пробуем обратиться к memcached в качестве сокета (unix:///usr/lib/tmpfiles.d/run/memcached/memcached.socket) в Битриксе в настройках Композитного сайта (там есть проверка соединения). Должно всё получиться:


Обязательно установить порт в 0, - иначе не проходит проверку соединения.
В панели производительности теперь в графе "Хранение кеша" должно стоять "memcache":

phpMemcachedAdmin

Для использования phpMemcachedAdmin совместно с другими виртуальными хостами, я в конфиг /etc/httpd/conf.d/phpMemcachedAdmin.conf добавил в самое начало:
<VirtualHost *:80>
    DocumentRoot /usr/share/phpMemcachedAdmin
    ServerName phpmemcachedadmin
И в самый конец:
</VirtualHost>
Затем добавляем в хосты (/etc/hosts) строку
127.0.0.1       phpmemcachedadmin www.phpmemcachedadmin
Перезапускаем Apache
sudo systemctl restart httpd.service
И в браузере по URL http://phpmemcachedadmin можно наблюдать работу Memcached:

Комментарии

Популярные сообщения из этого блога

Bitrix24 API - разбор демо приложения третьего типа

Мультиязычное приложение Phonegap

Canon LBP 2900B + Linux Mint 17