Fastcgi

Есть несколько сторонних реализаций - mod_fastcgi (используется с 1.3 Apache и 2?) и mod_fcgid (для 2.x Apache). Для PHP более предпочтителен mod_fcgid.

Установка
Установка из портов: make -C /usr/ports/www/mod_fastcgi install clean

При установке из портов в /usr/local/etc/apache/httpd.conf будут добавлены строки, их нужно раскомментировать. 
 * 1) LoadModule fastcgi_module     libexec/apache/mod_fastcgi.so
 * 2) AddModule mod_fastcgi.c

Указать путь до директории, где будут создаваться служебные файлы (файлы unix-socket), через которые взаимодействие организовано. Добавив блок.  FastCgiIpcDir /var/tmp/ 

apachectl restart

При очередном старте или перезапуске Apache автоматически создается директория /var/tmp/dynamic/.

Работа с PHP
При сборке php по умолчанию взведена опция FASTCGI Enable fastcgi support (CGI only). На сборку с таким параметрами указывает секция cgi-fcgi. cgi.check_shebang_line там по умолчанию TRUE и в таком состоянии PHP как CGI должно пропускать shebang. Это сдедано для совместного запуска CGI и standalone (?).

По умолчанию используется менеджер процессов из FastCGI, а не из PHP.

Все из директории (или контейнера) обрабатывать как fastcgi (в контейнер VirtualHost можно) SetHandler fastcgi-script

Только определенные типы файлов AddHandler fastcgi-script fcg fcgi fpl

Целиком блок будет выглядеть следующим образом:     FastCgiIpcDir /var/tmp/ FastCgiConfig -autoUpdate -singleThreshold 100 -killInterval 300 -idle-timeout 240 -pass-header HTTP_AUTHORIZATION AddHandler fastcgi-script              .fcgi .fcg .fpl Action     application/x-httpd-php5    /cgi-bin/php5.fcgi AddType    application/x-httpd-php5    .php .php5  

Создать файл-враппер /usr/local/www/cgi-bin/php5.fcgi  PHP_FCGI_CHILDREN=4 export PHP_FCGI_CHILDREN exec /usr/local/bin/php-cgi  chmod +x /usr/local/www/cgi-bin/php5.fcgi
 * 1) !/bin/sh
 * 2) To use your own php.ini, comment the next line and uncomment the following one
 * 3) PHPRC="/usr/local/etc"
 * 4) export PHPRC

Если делать без враппера, а вызывать интепритатор напрямую из sha-bang (и просто добавив AddHandler fastcgi-script .php в VirtualHost), то в процессах будет отображаться название именно того файла, к к которому обращение произошло. А в случае враппера будет его название.

Проверка
Сообщение из httpd-error.log при обращении к php-файлу [Sat Mar 6 19:34:58 2010] [warn] FastCGI: (dynamic) server "/usr/local/www/cgi-bin/php.php" started (pid 61117) ps -auxww|grep 61117 www  61117  0.0  1.9 18684  9588  ?? I    7:34PM   0:00.03 /usr/local/bin/php-cgi /usr/local/www/cgi-bin/php.php

При директории для socket создается при этом файл ls -alh /var/tmp/dynamic/ "srw--- 1 www  www       0B Mar  6 19:34 ced72f77d8dca2cafe188efa4c1d1e13"

Записи в логах при работе с использованием враппера FastCGI: (dynamic) server "/usr/local/www/cgi-bin/php5.fcgi" started (pid 62520) FastCGI: (dynamic) server "/usr/local/www/cgi-bin/php5.fcgi" (pid 62520) termination signaled FastCGI: (dynamic) server "/usr/local/www/cgi-bin/php5.fcgi" (pid 62520) terminated by calling exit with status '0'<BR> FastCGI: (dynamic) server "/usr/local/www/cgi-bin/php5.fcgi" restarted (pid 62569)<BR>

В случае правильной настройки выдает результаты выполнения php.php cat php.php | ./php5.fcgi | elinks

Ошибки
Если нет sha-bang #!/usr/local/bin/php-cgi в php-файле и не указано запускать через скрипт, где есть exec и путь до интепритатораа, то при обращении к файлу в итоге возникнет ошибка 500. [Sat Mar 6 20:55:28 2010] [warn] FastCGI: (dynamic) server "/usr/local/www/cgi-bin/php.php" started (pid 61905) FastCGI: can't start server "/usr/local/www/cgi-bin/php.php" (pid 61905), execle failed: Exec format error<BR> [Sat Mar 6 20:55:28 2010] [warn] FastCGI: (dynamic) server "/usr/local/www/cgi-bin/php.php" (pid 61905) terminated by calling exit with status '255'<BR> [Sat Mar 6 20:55:43 2010] [warn] FastCGI: (dynamic) server "/usr/local/www/cgi-bin/php.php" has failed to remain running for 30 seconds given 3 attempts, its restart interval has been backed off to 600 seconds<BR> [Sat Mar 6 20:56:02 2010] [error] [client 89.108.68.6] FastCGI: comm with (dynamic) server "/usr/local/www/cgi-bin/php.php" aborted: (first read) idle timeout (30 sec)<BR> [Sat Mar 6 20:56:02 2010] [error] [client 89.108.68.6] FastCGI: incomplete headers (0 bytes) received from server "/usr/local/www/cgi-bin/php.php"<BR> 3

Если запросить файл из директории, где нельзя выполнять CGI (по умолчанию это только cgi-bin), то отобразится сообщение: "[Sat Mar 6 19:39:51 2010] [error] [client 89.108.68.6] FastCGI: 'ExecCGI Option' is off in this directory: /php"

Если не указать корректный путь до директории (посредством FastCgiIpcDir), то при старте Apache в error-log (2)No such file or directory: FastCGI: doesn't exist and can't be created: No such file or directory (2)No such file or directory: FastCGI: can't create dynamic directory "/usr/local/logs/fastcgi/dynamic" FastCGI: process manager initialized (pid 13697) а при вызове файла на исполнение будет отображаться No such file or directory: FastCGI: can't create (dynamic) server "/usr/local/www/cgi-bin/php.php": bind failed [/usr/local/logs/fastcgi/dynamic/ced72f77d8dca2cafe188efa4c1d1e13]<BR> No such file or directory: FastCGI: failed to connect to (dynamic) server "/usr/local/www/cgi-bin/php.php": something is seriously wrong, any chance the socket/named_pipe directory was removed?, see the FastCgiIpcDir directive<BR> FastCGI: incomplete headers (0 bytes) received from server "/usr/local/www/cgi-bin/php.php"<BR>

Если у файла нет права на исполнение, то отобразится следующая ошибка "FastCGI: invalid (dynamic) server '/usr/local/www/data/yally/index.php': access for server (uid 80, gid 80) not allowed: execute not allowed by owner"

Параметры
описание

 -singleThreshold n (0) An integer between 0 and 100 used to determine whether the last instance of a FastCGI application can be              terminated. If the process manager computed load factor for the application is lower than the specified threshold, the last instance is terminated. In order to make your executables run in the "idle" mode for the long time, you would specify a value closer to 1, however if memory or CPU time is of primary concern, a value closer to 100 would be more applicable. A value of 0 will prevent the last instance of               an application from being terminated; this is the default value, changing it is not recommended (especially if -appConnTimeout is set). For historic reasons the mis-spelling singleThreshhold is also accepted. </PRE>


 * http://forum.lissyara.su/viewtopic.php?f=8&t=5052&start=25
 * /usr/local/share/doc/mod_fastcgi/mod_fastcgi.html
 * http://www.fastcgi.com/mod_fastcgi/INSTALL
 * http://www.fastcgi.com/drupal/node/5?q=node/10
 * http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html
 * http://wiki.dreamhost.com/index.php/PHP_FastCGI
 * http://www.lissyara.su/articles/freebsd/www/apache2+php5+mod_fastcgi/