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
Перезапускаем Apachesudo systemctl restart httpd.service
И в браузере по URL http://phpmemcachedadmin можно наблюдать работу Memcached:
не все видят смысл в подключении мемкешед. эффекта нет пишут. Лично сам я не вижу разницы что файловый, что мемкеш.
ОтветитьУдалитьЯ веду разработку сайтов на битриксе на компьютере с тормозным диском, но достаточным запасом оперативки - для меня эффект от Memcache однозначно положительный.
Удалить