Archive

Posts Tagged ‘php’

Устанавливаем акселлератор APC на CentOS+Apache

August 3rd, 2011

Если у вас нагруженное веб-приложение и тесты показывают, что одно из узких мест это исполнение php-кода, то имеет смысл установить PHP-акселлератор. Один из лучших это APC от разработчиков самого PHP. Принцип его работы такой: он держит скомпилированный код php-файлов в памяти и при повторном обращении быстро его отдает.
Устанавливаем его из репозитория Remi:

yum --enablerepo=remi install php-pecl-apc

Теперь смотрим конфиг /etc/php.d/apc.ini, самые важные параметры:
# Включаем кэширование
apc.enabled=1
# количество блоков с кэшем в памяти
apc.shm_segments=1
# размер каждого блока
apc.shm_size=256M
# время устаревания кэшированных файлов
apc.ttl=3600
apc.max_file_size=1M
# если выключить, apc не будет проверять не изменился ли файл при обращении к нему.
apc.stat=1

Для каждого сервера надо подбирать свои параметры размера блока и срока устаревания кэша. Потому как иногда при заполнении памяти APC может падать с ошибкой “unable to allocate memory for pool” подробнее читать тут.
Для мониторинга состояния кэша APC удобно использовать прилагаемую к дистрибутиву утилиту apc.php. Просто скачиваете дистр и кладете файлик в любой виртуалхост.

php ,

Разные php.ini для Apache и консольных скриптов

February 2nd, 2011

Иногда бывает нужно сделать так, чтобы апач и скрипты запускаемые кроном имели разные php.ini. К примеру, для того чтобы ограничить скрипты апача разными disable_functions.
Просто создаем копию php.ini в любом месте, допустим, это будет версия для Apache. Добавляем в нее:

disable_functions=popen,exec,system,passthru,proc_open,shell_exec

Это серьезно усложнит жизнь злоумышленнику на пути повышения привилегий.
И прописываем путь к этому php.ini в httpd.conf:

PHPIniDir /etc/httpd/php.ini

Перезапускаем апач и простеньким скриптом проверяем что получилось:

<?php
system('ls -la');
?>

Apache, php ,

Переходим с prefork на mpm-worker на Apache с mod_php (CentOS)

October 11th, 2010

Итак, допустим вы решили перейти на worker MPM в Apache чтобы повысить производительность. Имеем CentOS с Apache и PHP установленные из репозитория Remi.
Сначала устанавливаем новый тредобезопасный модуль PHP:

yum --enablerepo=remi install php-zts

Возможно придется обновить PHP до последней версии.

Затем в /etc/sysconfig/httpd раскомментируем строчку:

HTTPD=/usr/sbin/httpd.worker

Убедимся, что в конфиге апача присутствуют примерно такие настройки:

<IfModule worker.c>
StartServers       1
MaxClients         50
MinSpareThreads     15
MaxSpareThreads     35
ThreadsPerChild     25
MaxRequestsPerChild  2000
</IfModule>

Где:
StartServers – сколько процессов стартует при запуске
MinSpareThreads/MaxSpareThreads – сервер будет держать количество свободных потоков (про запас) в этих рамках. Свободные потоки – это сумма потоков во всех процессах
MaxClients – максимально количество одновременных клиентов. Т.е. максимальное количество потоков во всех процессах.
ThreadsPerChild – сколько потоков может создавать каждый процесс. Т.о. если мы разделим MaxClients на ThreadsPerChild, то получим сколько максимум процессов будет создано при максимальной загрузке.
ServerLimit – сколько макс. процессов может быть. Естественно, это число должно быть не меньше MaxClients/ThreadsPerChild – числа процессов при максимальной нагрузке.
MaxRequestsPerChild – через сколько запросов уничтожается процесс.

Если используется Zend или IonCube надо поправить пути к ним (обычно в php.ini), заменив на тредобезопасные варианты.

Рестартуем апач:

/etc/init.d/httpd restart

И получаем результат:

ps auxww |grep http
root     19552  0.0  0.5  31020 11300 ?        Ss   20:50   0:00 /usr/sbin/httpd.worker
apache   19555  150 39.2 1125872 813092 ?      Sl   20:50  17:17 /usr/sbin/httpd.worker

linux ,

Оптимизация использования памяти для Apache

October 6th, 2010

Памяти никогда много не бывает. И по мере роста трафика сервер может начать свопиться, а это очень плохо. Посмотрим что же можно сделать:

  • Во-первых, сначала надо убедиться, что перед апачем установлен nginx (ну или лайти) и он отдает напрямую всю статику: графику, видео, js, css, какие-либо архивы и прочее. Для контроля очень удобно воспользоваться встроенными возможностями апача просмотра статуса:
    <Location /server-status>
            SetHandler server-status
    </Location>
    ExtendedStatus On
  • Обязательно нужно внимательно пройтись по конфигу апача и закомментировать загрузку неиспользуемых модулей
  • Так же нужно проконтролировать, чтобы максимальное одновременное количество клиентов апача не превышало объема установленной на сервере памяти. Просто делим общее количество памяти на количество занимаемое одним процессом апача за минусом памяти под mysql и прочее. Иначе система уйдет в своп и катастрофически деградирует.
    StartServers       3
    MinSpareServers    3
    MaxSpareServers   5
    ServerLimit      12
    MaxClients       12
  • Так же можно поставить MaxRequestsPerChild поменьше (~500) чтобы форки апача почаще перезапускались и освобождали память.
  • Если используется Eaccelerator, то надо проверить что eaccelerator.shm_size не очень большое, = “64” вполне подойдет
  • Если ничего не помогает, то нужно попытаться определить какой из виртуалхостов самый прожорливый. Можно просто по очереди тестировать сайты на сервере при помощи loadimpact и наблюдать за нагрузкой. Скорее всего найдется код создающий максимальную нагрузку по памяти. Далее можно пойти путем оптимизации кода либо попрбовать перенести именно этот виртуалхост на php в режиме fast cgi.
  • Так же нужно не забывать про возможность просто взять более мощный сервер. Благо, например, у Hetzner за смешные деньги можно арендовать сервер с 8 и более ГБ памяти. Часто это может оказаться самым “дешовым” решением.

Apache ,

Ошибка в работе pcre (preg_match) во FreeBSD

April 22nd, 2010

В версиях php5-pcre 5.2 и ниже возможна ошибка проявляющаяся как:

Warning: preg_match() [function.preg-match]: Internal pcre_fullinfo() error

Причина этого проста – при сборке этого порта забыли поставить галочку для поддержки апача. Т.е. надо просто сделать make config этому порту и переустановить его.

FreeBSD, php

Проблема с php5-ffmpeg на FreeBSD

January 28th, 2010

На сегодняшний день имеется проблема выражающаяся в том, что одна из основных функций toGDImage() не работает выдавая ошибку “ffmpeg.so: Undefined symbol img_convert”
Этот патч проблему не решил.
Помогло следующее: порт multimedia/ffmpeg должен быть собран без swscaler. Для этого нужно поправить Makefile. Т.е. сделать –disable-swsсale. После пересборки самого ffmpeg, пересобрать и php-ffmpeg.

FreeBSD, php

Отображение ошибок в PHP

January 11th, 2010

Включить отображение ошибок в PHP-скриптах можно несколькими способами:
Внести изменения в php.ini и релоаднуть апач. Эти изменения затронут все сайты.

error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
log_errors_max_len = 1024
error_log = /var/log/php-error.log

Внести в .htaccess расположенный в папке скрипта. Это рекомендуемый способ:

php_value display_errors 1
php_value display_startup_errors 1

Внести изменения в сам скрипт:

ini_set("display_errors","1");
ini_set("display_startup_errors","1");
ini_set('error_reporting', E_ALL);

С этим методом такой нюанс: ошибки типа не закрытых скобок и не проставленных ; все равно будут приводить к белому экрану. Это происходит потому, что парсинг файла на синтаксическую корретность происходит до его выполнения и, соответственно, установки директив.
Это можно обойти подобным образом:

<?php
 error_reporting(E_ALL);
 ini_set("display_errors", 1);
 include("file_with_errors.php");
?>

Документация по соответствующим директивам PHP

php ,

PHP 5.3 и PHP 5.2.10

September 1st, 2009

После выхода PHP 5.3 в популярном репозитории REMI для RHEL/CentOS PHP-пакеты были заменены на версию 5.3. В некоторых случаях это создает неудобства, так как далеко не все веб-приложения и скрипты работоспособны под этой версией. Поэтому при сетапе или обновлении сервера надо либо отключать этот репозиторий или ставить 5.2.10 пакеты вручную для i386 и для x86_64

php

suPHP для PHP под Apache

August 4th, 2009

Если по простому,то suPHP это штука, которая позволяет выполнять PHP-скрипты под Apache с правами их владельца, а не с правами веб-сервера. Это бывает необходимо если на сервере несколько пользователей (например, фтп), они активно меняют контент сайтов, но веб-серверу тоже нужен доступ к этим файлам. Тут то и происходит конфликт владельцев.
suPHP есть и в портах для FreeBSD:

cd /usr/ports/www/suphp && make install clean

и в пакетах для CentOS:

yum install mod_suphp

Запускается как обычный модуль для апача:

LoadModule php5_module libexec/apache2/libphp5.so
LoadModule suphp_module libexec/apache2/mod_suphp.so

Конфиги в файле suphp.conf

Внимательнее к параметрам:

; Security options
allow_file_group_writeable=false
allow_file_others_writeable=false
allow_directory_group_writeable=false
allow_directory_others_writeable=false

Из-за них может посыпаться много ошибок.

Для активации надо прописать либо в глобальной секции httpd.conf, либо в конкретном виртуал-хосте:

suPHP_Engine on
suPHP_AddHandler application/x-httpd-php

Не путать с модулем для апача suexec!

Замечен такой косяк: если надо запускать что-то через exec и по относительному пути исполняемый файл не находится, то надо убедится, что в suphp.conf прописано с кавычками!

env_path="/bin:/usr/bin"

Apache, php , ,

Закачка больших файлов через PHP

July 7th, 2009

Вот что нужно поправить:
Во-первых, в nginx.conf надо

client_max_body_size 20m;

Иначе если запрос не будет пролазить в этот лимит nginx покажет 413 Request Entity Too Large для некоторых браузеров или просто сбросит соединение.

В apache убедиться что не определено LimitRequestBody или имеет подходящий лимит. Если установлен mod_security то проверить еще SecRequestBodyLimit.

И наконец, в php.ini:

post_max_size = 20M
upload_max_filesize = 20M

Apache, nginx, php , ,

Установка Pear PHP GeoIP расширения на Linux

May 15th, 2009

К сожалению, данного расширения нет в RPM-ках поэтому будем ставить его из сорцов:

yum --enablerepo=remi install GeoIP-devel php-devel
cd /usr/local/src
wget http://pecl.php.net/get/geoip
tar zxvf ./geoip-1.0.7.tgz
cd geoip-1.0.7
phpize
./configure
make
make install

Создаем /etc/php.d/geoip.ini:

extension=geoip.so

Рестартим апач:

service httpd reload

php ,

Сокрытие версии PHP и Apache

April 7th, 2009

В php.ini:

expose_php = off

В httpd.conf:

ServerTokens Prod
ServerSignature Off

Apache, php, безопасность ,

Установка модулей в php собранном из сорцов

March 18th, 2009

Например, может понадобиться добавить модуль для PHP, который поставлен DirectAdmin-ом (т.е. из исходников). Сделаем это на примере модуля для memcached (предварительно надо убедиться что в системе установлен autoconf):

cd /usr/local/directadmin/custombuild/php-5.2.8/ext
wget http://pecl.php.net/get/memcache-2.2.5.tgz
tar xvf ./memcache-2.2.5.tgz
cd ./memcache-2.2.5
phpize
./configure
make && make install

Осталось прописать extension=memcache.so в php.ini. Проверяем присутствие модуля:

php -i |grep memcache
memcache
memcache support => enabled
memcache.allow_failover => 1 => 1
memcache.chunk_size => 8192 => 8192
memcache.default_port => 11211 => 11211
memcache.default_timeout_ms => 1000 => 1000
memcache.hash_function => crc32 => crc32
memcache.hash_strategy => consistent => consistent
memcache.max_failover_attempts => 20 => 20
Registered save handlers => files user sqlite memcache

php , ,

Обновление php на Linux через yum

January 16th, 2009

добавляем репозиторий и обновляемся:

rpm -ihv http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
yum --enablerepo=remi update php

linux, php ,