Ошибка open_basedir с eAccelerator на ISPManager

Вот чем мне нравятся всякие панельки, типа ISPManager или ISPConfig, так это удобством. Не люблю я командные строки…

И вот, чем уникален для неискшенного пользователя ISPManager — возможностью устанавливать некоторые расширения php через свой интерфейс. Нажал кнопочку, шестеренка покрутилась и всё установилось. Удобно, что еще желать. И именно так я решил поставить на свой сайт ускоритель eAccelerator. Но меня ждало большое разочарование, половина сайта выпала в даун, а остальная половина сыпала ошибками open_basedir restriction… :-(

Стал судорожно гуглить и выяснил, что проблема в eAccelerator. Мол уже долгие годы не могут подружить его с open_basedir, есть патч исправляющий ошибку и все такое, мол применяйте его. Так же был совет открыть вообще весь сервер для доступа, но у меня не получилось, да и опасно это.

В итоге всех мучений решился патчить исходники eAccelerator, но не тут то было — в свежескачаном дистрибутиве подобных строк не было. Поэтому я решил компилить его и проверить на деле и не зря… Оказалось, что ISPManager ставит устаревшую версию 0.9.6.1, в то время, как последняя версия на 28 января 2014 года — 1.0-dev. Глюк с open_basedir в ней поправлен, а сам файл eaccelerator.so в 4 раза большего размера, чем в 0.9.6.1.

И так, забейте на старые инструкции по установке eAccelerator и смотрите сюда.

Качаем архив исходников с eaccelerator.net в архиве tar или zip. Распаковываем его в папку /tmp/eaccelerator или любую, какая вам понравится.

Можно скачать вот так:

  1. cd /tmp
  2. wget https://github.com/eaccelerator/eaccelerator/tarball/master
  3. tar xvf master

Смотрим куда распаковался архив, директория имеет вид eaccelerator-eaccelerator-42067ac (в вашем случае название может отличаться).

Самый простой способ: cd ea далее жмем клавишу tab, имя подставиться автоматически.

Заходим в нее и выполняем следующие команды:

  1. phpize
  2. ./configure
  3. make
  4. make install

Если мы хотим установить eAccelerator для другой версии php, то указываем путь к конфигу, например так

./configure --enable-shared --with-php-config=/opt/php52/bin/php-config

Если вы последовательно собираете eaccelerator для разных версий php, то между сборками стоит почистить дистрибутив от мусора командами

  1. make clean
  2. make distclean

Предварительно ставим дополнительное девелоперское ПО, если оно еще не уставновлено!

  1. yum install php-devel
  2. yum groupinstall "Development Tools"

В директории /etc/php.d/ должен появиться файл eaccelerator.ini, если его там нет, создайте файл следующего содержания:

  1. [eaccelerator]
  2.  
  3. extension="eaccelerator.so"
  4. ;zend_extension="/usr/lib64/php/modules/eaccelerator.so"
  5. ;zend_extension="/usr/lib/php/modules/eaccelerator.so"
  6. ;zend_extension_ts="/usr/lib/php/modules/eaccelerator.so"
  7. eaccelerator.shm_size = "0"
  8. eaccelerator.cache_dir = "/var/cache/php-eaccelerator"
  9. eaccelerator.enable = "1"
  10. eaccelerator.optimizer = "1"
  11. eaccelerator.debug = 0
  12. eaccelerator.log_file = "/var/log/httpd/eaccelerator_log"
  13. eaccelerator.name_space = ""
  14. eaccelerator.check_mtime = "1"
  15. eaccelerator.filter = ""
  16. eaccelerator.shm_ttl = "0"
  17. eaccelerator.shm_prune_period = "0"
  18. eaccelerator.shm_only = "0"
  19. eaccelerator.allowed_admin_path = ""

Создаем временную директорию для файлов eAccelerator и даем ей права на запись:

  1. mkdir /var/cache/php-eaccelerator
  2. chmod 777 /var/cache/php-eaccelerator

Затем перезагружаем апач

service httpd restart

Посмотреть версию можно вот так

  1. php -v
  2. //или для другой версии php
  3. /opt/php52/bin/php-cgi -v

Результат будет примерно таким, в зависимости от вашей версии php

  1. PHP 5.4.27 (cli) (built: Apr  3 2014 07:28:03)
  2. Copyright (c) 1997-2014 The PHP Group
  3. Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
  4.     with eAccelerator v1.0-dev, Copyright (c) 2004-2012 eAccelerator, by eAccelerator

Так же, проверить, что все запустилось и состояние eAccelerator можно выполнив php команду

  1. <?php
  2. ?>

Должно появиться нечто подобное

eAccelerator

eAccelerator supportenabled
Version1.0-dev
Caching Enabledtrue
Optimizer Enabledtrue
Check mtime Enabledtrue
Memory Size67,108,800 Bytes
Memory Available21,282,688 Bytes
Memory Allocated45,826,112 Bytes
Cached Scripts448
Removed Scripts0

Здесь вы можете обратить внимание, что на хранилище eAccelerator у меня выделено 64 мегабайта, а не 32, как стоит по умолчанию, чтобы сделать так же, нужно вписать в конфиг следующую строку

eaccelerator.shm_size = "64"

Но не спешите делать это сразу, возможно ничего не получится, если у вас в системе прописаны меньшие лимиты kernel.shmmax. Проверить это можно командой

cat /proc/sys/kernel/shmmax

Или

sysctl kernel.shmmax

По умолчанию будет показано скорее всего 33554432, тоесть 32 мегабайта и прыгнуть выше головы вы не сможете. Чтобы установить большее значение нужно выполнить следующие команды. Я рекомендую сначала выполнить первую, убедиться, что все работает, а только затем вторую!

  1. echo "67108864" > /proc/sys/kernel/shmmax
  2. echo "kernel.shmmax = 67108864" >> /etc/sysctl.conf

Так же вместо первой строки можно использовать вот такую команду

sysctl -w kernel.shmmax=67108864

Вообще, считается, что безопасно устанавливать значение shmmax равное половине доступной памяти.

Давайте посмотрим как рассчитать два параметра shmmax и shmall и установить их оптимальные значения в систему.

Создаем скриптик с именем shmsetup в директории /opt следующего содержания

  1. #!/bin/bash
  2. # simple shmsetup script
  3. page_size=`getconf PAGE_SIZE`
  4. phys_pages=`getconf _PHYS_PAGES`
  5. shmall=`expr $phys_pages / 2`
  6. shmmax=`expr $shmall \* $page_size`
  7. echo kernel.shmmax = $shmmax
  8. echo kernel.shmall = $shmall

и даем ему права на выполнение

chmod 744 /opt/shmsetup

Выполняем и видим примерно такую картину для сервера с 512 метрами памяти на борту

  1. kernel.shmmax = 268435456
  2. kernel.shmall = 65536

Теперь достаточно выполнить команду

/opt/shmsetup >> /etc/sysctl.conf

Чтобы записать эти настройки в конфиг файл системы. Проверить, что всё вписалось как надо можно командой

sysctl -p

или посмотреть лимиты в системе поможет команда

ipcs -l

и она же для семафоров

ipcs -sl

говорят, для нагруженых систем с большим число процессов значения семафоров необходимо увеличить. Значения прописаны в sysctl.conf, прочитать можно вот так

sysctl kernel.sem

установить временно (до перезагрузки)

sysctl -w kernel.sem="250 32000 100 128"

Так же вы можете установить админку для eAccelerator. Из нее вы сможете включать/выключать разные опции, очищать кэши, а так же смотреть, какие скрипты закешированы и статистику их использования. Очень удобно :-) Вот так это все выглядит

Устанавливается панель просто — копируем из архива файл control.php в директорию нашего сайта. Предварительно меняем внутри логин и пароль на свои. В eaccelerator.ini вписываем в самом низу путь до админки, например, так

eaccelerator.allowed_admin_path = "/var/www/amiweb/data/www/amiweb.ru/control.php"

В браузере набираем путь amiweb.ru/control.php и наслаждаемся :-)