FastNetMon

Showing posts with label mod_fcgid. Show all posts
Showing posts with label mod_fcgid. Show all posts

Monday, 1 November 2010

mod_fcgid +eAccelerator + SHM

Как бы это глупо ни звучало, но при использовании eAccelerator в режиме PHP FastCGI он создает блок shm памяти для КАЖДОГО рабочего процесса PHP. То есть, если Вы ставитие лимит в 64 мегабайта кэша, то будет выделено дополнительно N*64мб памяти. Жуть не правда ли? Также, очевидно, все скрипты перекомпилируются заново при запуске очередного рабочего процесса, что сводит весь профит на нет.

А вот пруфлинк в баг-трекере eAccelerator: http://eaccelerator.net/ticket/3

На практике же все именно так и есть, имеем 3 рабочих процесса пользователя v001001:
ps aux | grep v001001
v001001 20588 0.2 0.2 336936 69056 ? S 00:33 0:15 /usr/bin/php5-cgi php
root 22492 0.0 0.0 87884 800 pts/2 S+ 02:32 0:00 grep v001001
v001001 24284 0.4 0.2 335060 63152 ? S 00:49 0:30 /usr/bin/php5-cgi php
v001001 24285 0.0 0.2 336712 57952 ? S 00:49 0:05 /usr/bin/php5-cgi php

И смотрим использование SHM памяти:
ipcs -m | grep v001001
0x00000000 266010721 v001001 600 33554432 1 dest
0x00000000 259981492 v001001 600 33554432 1 dest
0x00000000 266043689 v001001 600 33554432 1 dest
0x00000000 1069875720 v001001 600 1048576 0

То есть, 3 по 32 мегабайта. Ну что же, немного... но если у Вас таких процессов сотни 3:

ps aux | grep php5-cgi | wc -l
320

А это ни много ни мало, а целых 9 гигабайт забитых мусором. Что же делать, что же делать? Хранить кэш на диске :)

Wednesday, 19 May 2010

[Wed May 19 19:39:55 2010] [emerg] (13)Permission denied: mod_fcgid: can't get lock, pid: 21627

strace дает следующий результат:
[pid 21841] brk(0xc26000) = 0xc26000
[pid 21841] semop(2555905, 0x7f87e3f84a60, 1) = -1 EACCES (Permission denied)
[pid 21841] write(9, "[Wed May 19 19:45:06 2010] [emerg] (13)Permission denied: mod_fcgid: can't get lock, pid: 21841\n"..., 96) = 96


Причина:

dpkg -l | grep itk
ii apache2-mpm-itk 2.2.6-02-1+lenny2+b3 multiuser MPM for Apache 2.2


Решение - удалить и воткнуть префорк. То есть, mod_fcgid несовместим с Apache mpm_itk.

Tuesday, 13 April 2010

Установка PHP htscanner на Debian - поддержка php_flag в .htaccess для PHP FastCGI / CGI

Офсайт проекта: http://pecl.php.net/package/htscanner

Ставим зависимости:
apt-get install -y php5-dev make patch


cd /usr/src
wget http://pecl.php.net/get/htscanner-0.9.0.tgz
# или зеркало
wget http://fastvps.googlecode.com/svn/trunk/packages/htscanner-0.9.0.tgz
tar -xf htscanner-0.9.0.tgz
cd htscanner-0.9.0
# накладываем патч, без него не будет работать php_flag
wget http://fastvps.googlecode.com/svn/trunk/patches/htscanner.patch
patch -p0 < htscanner.patch # следом накладываем патч для запрета перекрыти memory_limit wget http://fastvps.googlecode.com/svn/trunk/patches/deny_values.patch patch -p0 < deny_values.patch phpize ./configure make



Устанавливаем:
cp modules/htscanner.so /usr/lib/php5/20060613/


Или
make install


Но этого недостаточно, чтобы модуль подключился:
php -m | grep htscanner


Создаем конфиг:
vi /etc/php5/conf.d/htscanner.ini


[htscanner]
extension="htscanner.so"
; The configuration file htscanner needs to scan for php_* directives
config_file=".htaccess"
; The fallback docroot when htscanner can't determine the current docroot
default_docroot="/"
default_ttl=300
; Stop when an error occured in RINIT (no document root, cannot get path_translated,...)
stop_on_error = 0


Теперь создаем в корне сайта .htaccess со следующими строками (поиски по Гуглу и опрос знакомых подтвердили, у htscanner php_flag не работает в принципе):
php_flag register_globals On

но это не сработает почему-то :( А вот такой вариант отлично пашет:

php_value register_globals 1


Обращаю внимание, что после изменения .htaccess необходимо перезапустить рабочие процессы PHP, чтобы изменения применились:
killall -u username


В процессе поиска фикса насткнулся на следующие патчи для htscanner 0.9.0:
http://yourserveradmin.com/ik/htscanner-0.9.0.eol.patch и вот http://blog.hbis.fr/2009/04/02/htscanner-parser-patch/patch-htscanner-parser-20090401/ (как раз, вроде, на мою проблему).

PHP FastCGI + php_admin_value, php_admin_flag, php_value, php_flag

Как известно, эти команды указываются в .htaccess и должны поидее читаться модулем PHP для Апача, но когда последний не используется, а используются, скажем, PHP FastCGI / CGI, то эти директивы будут просто-напросто проигнорированы и эффекта не возымеют.

Но есть проблема - есть фикс! Вот что говорят ребята из Zend: http://kb.zend.com/index.php?View=entry&EntryID=259

А именно:

Using htscanner - htaccess support for PHP
Description: Allow one to use htaccess-like file to configure PHP per directory, just like apache's htaccess.
It is especially useful with fastcgi.


А вот ссылка на этот самый HTScanner: http://pecl.php.net/package/htscanner

Краткое описание от авторов этого самого мегаэкстеншена:
Allow one to use htaccess-like file to configure PHP
per directory, just like apache's htaccess. It is especially useful with fastcgi (ISS5/6/7, lighttpd, etc.).
This package was originally developed by Bart Vanbrabant. Old versions are available
from: http://files.zoeloelip.be/htscanner


Еще есть фича - если у Вас используется FastCGI, но при этом подключен PHP как модуль Апача, то все будет ок - php_* директивы будут проигнорированы, а вот если используется только FastCGI и PHP модуль в принципе отключен, то будет ошибка :) Но тут приходит на модуль модуль mod_fakephp, который подавляет выдачу ошибок при обнаружении опций PHP в .htaccess: http://www.dmi.me.uk/code/apache/mod_fakephp/

За наводку огромный респект arp`у: http://highloaded.blogspot.com/2010/04/htaccess-phpflag-with-fastcgi-on-debian.html и вот еще отличная статья с интересным подходом: http://dromok.ru/?p=104

Вот мой мануал по настройке этого чуда: http://phpsuxx.blogspot.com/2010/04/php-htscanner-debian-phpflag-htaccess.html А вот мануал в моем блоге: http://phpsuxx.blogspot.com/2011/01/modfakephp-debian.html

Friday, 12 February 2010

Как включить register_globals на сервере с ISPManager и PHP FastCGI?

Заходите в "Инструменты" -> "Менеджер файлов". Далее в домашней папке входите в папку php-bin и там видите php.ini, куда требуется добавить строку:
register_globals = On


Но ISP выдаст "Can't open file '/var/www/v001022/data/php-bin/php.ini' for writing", хотя права на файл 400 и владельцем указан владелец аккаунта :( Так что делайте это через FTP либо попросите сделать это саппорт.

Для саппорта нужно сделать следующее:
echo "register_globals = On" >> /var/www/v001022/data/php-bin/php.ini
killall -u v001022


После этого PHP воркеры благополучно погибнут и запустятся с новыми настройками.

Либо после внесения изменений в конфиг необходимо зайти в панель управления ISPManager и открыть настройки указанного www домена и просто их сохранить ничего не меняя (это вызовет релоад Апача, что необходимо для применения настройки из пользовательского php.ini).

Wednesday, 20 January 2010

Установка PHP как FastCGI на панели управления хостингом ISPManager, Debian 5 Lenny

В новых версиях все намного проще! Просто идете в "Возможности", выбираете там "Модуль FastCGI для веб-сервера Apache" и нажимаете на "кнопку с дисками" для установки и ожидаете, пока он поставится на панель. После этого должна появиться опция PHP как FastCGI при создании www-доменов.

Ставим:
apt-get install -y libapache2-mod-fcgid


Перезапускаем апача:
/etc/init.d/apache2 restart


Перезапускаем панель ISPManager:
killall -9 -r ispmgr


Готово, теперь в настройках www домена должна появится возможность "Php как FastCGI".

Но в последних версиях этот фикс не сработает, ибо в панели опять что-то сломали!

Открываем конфиг:
vi /usr/local/ispmgr/etc/ispmgr.conf


И в самый низ добавляем следующее:
Option ForcePhpFCgid



Перезапускаем панель ISPManager:
killall -9 -r ispmgr


И вот теперь уж точно должно появиться :)

Tuesday, 19 January 2010

Новинка в mod_fcgid 2.3.5 - показ статуса процессов в server-status

Display information about active processes in the server-status page. [Ryan Pan]



(c) CHANGES-FCGID

Куда пропал оф сайт mod_fcgid http://fastcgi.coremail.cn/doc.htm ?

Последнюю неделю пытаюсь зайти на http://fastcgi.coremail.cn/doc.htm, но обламываюсь :( Думал, что просто лежит. Оказывается нет:
mod_fcgid was created by Ryan Pan (Pan Qingfeng, pqf or 潘庆峰) in 2004 as a new FastCGI implementation, and was granted to the ASF as an Apache HTTP Server subproject in 2009, shepherded by Chris Darroch (chrisd).


(с) http://httpd.apache.org/mod_fcgid/

Sunday, 3 January 2010

Установка eAccelerator на Debian 5 Lenny для PHP в FastCgi режиме

На офсайте говорится "eAccelerator only works with mod_php or php in fastcgi mode. It can't be used in cgi or cli because eAccelerator needs to set up shared memory, and this can only be done when all php instances that need to access it are forks of the first process".

Что по-русски означает, что eAccelerator работает только, если PHP подключен как модуль Апача либо как FastCGI.

Будем ставить версию 0.9.6.1

Ставим все необходимое для сборки:

apt-get install -y php5-dev bzip2 make


Компилируем:


cd /usr/src
wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2
tar -xf eaccelerator-0.9.6.1.tar.bz2
cd eaccelerator-0.9.6.1
phpize
./configure
make install


Очищаем систему после сборки
apt-get remove php5-dev
cd
rm -rf /usr/src/eaccelerator-0.9.6.1
rm -f /usr/src/eaccelerator-0.9.6.1.tar.bz2


Кстати, крайне рекомендую обратить внимание на файлик control.php в дистрибутиве, который предназначен для управления и мониторинга eAccelerator :) (спасибо Котеровским наблам, где это упомянуто)

--prefix тут, к сожалению, не работает, т.к. configure берет путь до библиотек из:

php-config --extension-dir
/usr/lib/php5/20060613



Создаем конфиг файл:

vi /etc/php5/conf.d/eaccelerator.ini


Вариантов подключения к PHP два - Zend Extension и обычное расширение, мне почему-то второй больше импонирует.

Вот стандартный конфиг:

extension="eaccelerator.so"
# eaccelerator.shm_size="16" # иначе получите проблемы на своем VPS
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"


А вот мой оптимизированный:

extension="eaccelerator.so"
; размер shm памяти в мегабайтах
eaccelerator.shm_size="32"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
; памяти у нас много, будем кэшировать в ней
eaccelerator.shm_only="1"
; рекомендую отлючить
eaccelerator.compress="0"
eaccelerator.compress_level="9"


Создаем папки для кэша (тут, как понимаете, будут проблемы с FastCGI, т.к. в нем скрипты работают от имени юзеров, а не от имени Апача, как это победить - я хз пока что). Кстати, в случае SHM памяти все будет очень безопасно по причине, что shm блоки будут создаваться от имени пользователя, от которого запускается скрипт. Так что самый лучший вариант в случае FastCGI - отключение файлового кэша и расположение скомпилированного кода только в shm.

Это в случае использования только shm не требуется:

mkdir /tmp/eaccelerator
chmod 0777 /tmp/eaccelerator


А испытать работоспособность можно командой:

php -m | grep eAcc
eAccelerator


И, наконец, перезапускаем Апача:

/etc/init.d/apache2 restart


Также в результате может сломаться phpmyadmin, фиксить его так: http://phpsuxx.blogspot.com/2009/11/g-phpmyadmin.html

Основано на: http://www.eaccelerator.net/wiki/InstallFromSource

Обращаю внимание, в мане баг! В Дебияне /tmp/eaccelerator будет удалена при ребуте.

Также обращаю внимание, что при устанвоке размера памяти SHM более 32 бегабайт возможен облом в виде:
eAccelerator: Could not allocate 67108864 bytes, the maximum size the kernel allows is 33554432 bytes. Lower the amount of memory request or increase the limit in /proc/sys/kernel/shmmax.

Это, конечно, тоже фиксится, но нужно немного подтюнить ядро :)

Tuesday, 1 December 2009

mod_fcgid: read data timeout in 40 seconds


vi /etc/httpd/conf.d/fcgid.conf


или (Debian)


vi /etc/apache2/mods-available/fcgid.conf



IPCCommTimeout 300



/etc/init.d/httpd restart

Установка PHP как FastCGI на панели управления хостингом ISPManager, CentOS

Для начала ставим репозиторий, где расположены все требуемые нам пакеты:
rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm


Ставим mod_fcigd:
yum install mod_fcgid -y


Открываем файл конфига:
vi /etc/httpd/conf.d/fcgid.conf


и комментируем в нем строку:
### LoadModule fcgid_module modules/mod_fcgid.so


Открываем файл:
vi /etc/httpd/conf/httpd.conf


Ищем блок "LoadModules" и вставляем туда строку:
LoadModule fcgid_module modules/mod_fcgid.so


Открываем конфиг PHP:
vi /etc/php.ini


ОБЯЗАТЕЛЬНО комментируем строку (иначе будут косяки с сессиями):
;session.save_path = "/var/lib/php/session"


Перезапускам Апача:
/etc/init.d/httpd restart


Перезапускаем панель ISPManager:
killall -9 -r ispmgr


Готово, теперь в настройках www домена должна появится возможность "Php как FastCGI".