воскресенье, 6 июля 2014 г.

Оптимизация PHP. apc и memcache

Четвёртая, скорее всего последняя заметка из цикла оптимизации веб-сервера на базе apache+nginx+mysql+php.

Сервер работает в режиме CGI. Локальные конфиги создаются в ISPmanager.

Сначала стоит рассказать о конфигах PHP.
Есть три конфига php, чем ниже тем менее приоритетно:
Кастомный (определённые в нём директивы приоритетнее аналогичных директив в других конфигах): /etc/php5/conf.d/custom.ini
Локальный (определённые в нём директивы приоритетнее аналогичных директив в глобальном конфиге): /var/www/php-bin/example.com/php.ini
Глобальный (самый низкоприоритетный конфиг): /etc/php5/cgi/php.ini

Не забудьте проверить /etc/php5/conf.d/custom.ini он должен быть пустым, либо же в нём должны быть упомянуты самые главные директивы.

Локальный конфиг заполняется, как правило ISPmanager'ом или вручную админом сайта.
Пример:
# vim /var/www/php-bin/example.com/php.ini
sendmail_path = "/usr/sbin/sendmail -t -i -f [email protected]"
date.timezone= Europe/Moscow
session.save_path = "/var/www/example/data/bin-tmp"
max_execution_time= 30
memory_limit= 256M
upload_max_filesize= 250M
post_max_size= 250M

Настройка основного конфига PHP:
# cp /etc/php5/cgi/php.ini /etc/php5/cgi/php.ini.bak
# vim /etc/php5/cgi/php.ini
...
# Отключаем некоторые функции
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority
# Максимальное количество памяти, выделяемое каждому скрипту
memory_limit = 128M
# Компрессия на стороне Web-сервера
zlib.output_compression = Off
zlib.output_compression_level = -1
# Включить сборщик мусора
zend.enable_gc = On
# Не отправлять версию PHP вместе с ответом
expose_php = Off
# Ведение лога ошибок об утечках в памяти
report_memleaks = On
# Максимальный размер данных, отсылаемых скрипту с помощью метода POST
post_max_size = 64M
upload_max_filesize = 128M
# Не показывать ошибки PHP-скриптов пользователям
display_errors = Off
# Включение логов
log_errors = On
# Запрет открытия удалённых файлов
;allow_url_fopen = Off
sql.safe_mode = On
...

apc (Alternative PHP Cache) необходим для кэширования байткода скриптов в общую память.

Установка (если всё ещё не установлено):
# apt-get install php-apc

Резервная копия файла:
# cp /etc/php5/cgi/conf.d/20-apc.ini /etc/php5/cgi/conf.d/20-apc.ini.bak

Настройки практически дефолтные, подправить немного:
# vim /etc/php5/cgi/conf.d/20-apc.ini
extension=apc.so
apc.cache_by_default = On
apc.enable_cli = Off
apc.enabled = On
;apc.filters = no value
apc.include_once_override = Off
apc.max_file_size = 4M
apc.num_files_hint = 20000
apc.rfc1867 = Off
apc.shm_segments = 1
; Размер одного сегмента shared memory, используемого apc
apc.shm_size = 128M
; Проверять время модифицирования php-скрипта
apc.stat = On
; Время отсутствия обращения к записи кэша прежде, чем apc перезапишет ее
apc.ttl = 3600

memcache, необходим для хранения сессий PHP не в файлах, а в оперативной памяти вместо файлов на диске.

Установка:
# apt-get install memcached php5-memcache 
# vim /etc/php5/cgi/php.ini
...
session.save_handler = memcache
session.save_path = "tcp://localhost:11211"

# service memcached restart
# service apache2 restart

На сервере у меня также установлен Roundcube, поэтому его тоже нужно сконфигурировать для работы с memcache:
# apt-get install php5-dev php-pear build-essential
# pecl install memcache

Указываем в конфиге, что за сессии отвечает memcache:
# vim /var/www/roundcube/config/config.inc.php
...
$rcmail_config['session_storage'] = 'memcache';
$rcmail_config['memcache_hosts'] = array('localhost:11211');

phpMyAdmin+memcache:
# vim /etc/apache2/conf.d/phpmyadmin.conf
php_admin_value session.save_handler memcache

# service apache2 restart

Проверить настройки можно с помощью phpinfo().
Если не работает глобальный конфиг, то можно создать кастомный /etc/php5/conf.d/custom.ini например.

Полезные ссылки:
Ускорение PHP: apc и memcache для сессий: blog.peter23.com/index.php/2010/11/15/php-apc-memcache-sessions
Полный тюнинг движка: Делаем из nginx непробиваемый Web-сервер: xakep.ru/articles/54168
Настройка систем LAMP, Часть 2: Оптимизация Apache и PHP: ibm.com/developerworks/ru/library/l-tune-lamp-2/l-tune-lamp-2.html
Roundcube in a load-balanced multi-server setup: trac.roundcube.net/wiki/Howto_Config/Loadbalancing

Комментариев нет: