====== SuExec PHP/FastCGI under Apache 2 ======
===== PHP/FastCGI =====
We need php4/php5 compiled with FastCGI support and `mod_fastcgi`. On Suse (at
least OpenSuse) both are available as packages so we can just install it through
YAST. On OpenSuse, once installed the binary will be placed at
`/srv/www/cgi-bin`:-
$ cd /srv/www/cgi-bin
$ ./php -v
PHP 4.4.0 (cgi-fcgi) (built: Sep 13 2005 02:19:37)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
$ ./php5 -v
PHP 5.0.4 (cgi-fcgi) (built: Sep 13 2005 02:20:47)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v2.0.4-dev, Copyright (c) 1998-2004 Zend Technologies
Then we edit apache configuration file to have it run PHP through mod_fastcgi.
This is the snipet of apache config (Suse style):-
$ cat /etc/apache2/httpd.conf.local
FastCgiIpcDir /tmp
AddHandler fastcgi-script .fcgi
FastCgiConfig -singleThreshold 100 -killInterval 300 -autoUpdate -idle-timeout
240 -pass-header HTTP_AUTHORIZATION
$ cat /etc/apache2/vhosts.d/hadiah.laptop.int
ScriptAlias /fcgi-bin/ /srv/www/cgi-bin/
Options ExecCGI
SetHandler fastcgi-script
AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /fcgi-bin/php
AllowOverride None
Options +ExecCGI -Includes
Order allow,deny
Allow from all
(actual output trimmed).
This is enough to tell apache that all request to *.php files will be passed to
FastCGI PHP.
You may test this configuration by restarting apache and fire up the virtual
host.
===== Apache2 SuEXEC =====
Now that we have PHP/FCPGI working, let's add suexec so we can execute the php
process under normal userid instead of apache user. Our apache config would look's like:-
$ cat /etc/apache2/httpd.conf.local
FastCgiIpcDir /tmp
AddHandler fastcgi-script .fcgi
FastCgiWrapper /usr/sbin/suexec2 # we specify the suexec wrapper
FastCgiConfig -singleThreshold 100 -killInterval 300 -autoUpdate -idle-timeout
240 -pass-header HTTP_AUTHORIZATION
$ cat /etc/apache2/vhosts.d/hadiah.laptop.int
SuexecUserGroup kamal users # execute under this userid
ScriptAlias /fcgi-bin/ /srv/www/cgi-bin/
Options ExecCGI
SetHandler fastcgi-script
AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /fcgi-bin/kamal/php-wrapper # wrapper to actual php binary
AllowOverride None
Options +ExecCGI -Includes
Order allow,deny
Allow from all
(actual output trimmed) Notice the part that was commented.
I specify a few things here:-
* specify apache suexec wrapper
* specify user/group the cgi would run in virtual host config
* create a wrapper to actual php binary so I can pass some options
to the binary.
The snippet of php-wrapper:-
$ cat /srv/www/cgi-bin/kamal/php-wrapper
#!/bin/sh
PHPRC="/etc"
export PHPRC
PHP_FCGI_CHILDREN=8
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS
/srv/www/cgi-bin/php
This way I can specify different php.ini to each virtual host that I have.
FIXME: The ideal place to put the wrapper is in user's home directory but suexec
only allow cgi execution from the specified --docroot during compile time. Apache
in Suse had set suexec docroot to /srv/www/ and the only way to change this is by
rebuilding apache. So my temporary solution is to create a directory under /srv/www
to put the wrapper and chown it to the user I specified in vhost config.
/Edited by seb
Just wanted to let you know it's quite easy to modify suexec to reflect your personal preferences.
I did it in 30 seconds with Apache22 on FreeBSD6 but it's probably not much different for your situation :)
To check where Apache expects to find the suexec binary..
$ apachectl -V
To check your current suexec settings..
$ suexec -V
Configure Apache with your current suexec settings but change the docroot option..
$ cd ~
$ fetch http://www.apache.org/dist/httpd/httpd-2.0.58.tar.bz2
$ tar -zxvf httpd-2.0.58.tar.bz2
$ cd httpd-2.0.58
$ ./configure --enable-suexec --with-suexec-docroot=/usr/home
$ make
$ cp support/suexec /usr/sbin/suexec2
And your done..
===== Troubleshooting =====
Make sure to take a look to your apache log file. suexec will log any error to
suexec.log in your apache log directory.
$ tail -f /var/log/apache2/hadiah-error_log
$ tail -f /var/log/apache2/suexec.log
Refferences:-
http://fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html\\
http://weblog.textdrive.com/article/36/trade-secret-1\\
http://apache-server.com/tutorials/LPsuexec.html\\
http://httpd.apache.org/docs/2.0/suexec.html\\