Tips & Tricks

Installing Apache and mod_fastcgi and php 4.x

This will show you how to install apache + mod_fastcgi + php 4.x on Nix system.

#to unify the process and to make first a test that all will work fine we will install these first in /opt directory

mkdir /opt/apache

# we will create a source directory where we will download the apache source files

mkdir /opt/apache/source

cd /opt/apache/source

# at the moment i write this article the version of apache is 2.2.8

wget http://www.apache.org/dist/httpd/httpd-2.2.8.tar.gz
tar xvf httpd-2.2.8.tar.gz
cd httpd-2.2.8

# now we will configure apache.

./configure –prefix=/opt/apache –disable-asis –disable-userdir –enable-logio –enable-rewrite –enable-ssl –with-port=81 –enable-suexec –with-suexec-caller=’apache’ –with-suexec-docroot=’/opt/apache/vhosts/’

# I will explain why i used this configure options. The first one is because i do not want this new apache to mess up with
# my production webserver. So is the –with-port setting. userdir and asis are modules which are enabled by default but i have never
# used so I do not really need them. For full configure options you can check http://httpd.apache.org/docs/2.2/programs/configure.html
# Because i used a server which has Plesk installed i gave and system user called apache already.
# The default apache user however is www. so you can drop that option if you want.
# The main reason why i put this is because suexec usually has a a setting for what could be the minimum user and group id (uid and gid respectfully) who can call it.
# Usually that is set to 100 and when user www is added it has uid=gid=80 so we will either have to change the UID and GID to something higher or set apache to use some other user.
# apache user added by plesk has uid=gid=2524 so it is perfect for our case.
# –with-suexec-docroot is again optional. I used it cause I like my virtual hosts to be in directory called vhosts. The default docroot is $PREFIX/docs .
# If you plan to run 1 website (which probably is not the case) or just have your websites in $PREFIX/docs/domain1.com , $PREFIX/docs/domain2.com and so on, probably you can drop that option too.
# If you put the virtual hosts on vhosts $PREFIX/vhosts and do not change –with-suexec-docroot suexec will throw errors that the script is not in its docroot.

# next is to install apache. If you have received any errors along the way of the configuration your best shot is to ask google about it.

make
make install

# now apache should be ready to be used. So lets move on to get mod_fastcgi installed.

cd /opt/apache/source
wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
tar xvf mod_fastcgi-2.4.6.tar.gz
cd mod_fastcgi

# next instructions ave been taken from here : http://www.fastcgi.com/mod_fastcgi/INSTALL.AP2

cp Makefile.AP2 Makefile
make top_dir=/opt/apache
make top_dir=/opt/apache install

# Now apache and mod_fast are almost ready. You have to enable the module in httpd.conf. I prefer to take this out of the main configuration file.
# I have created a file /opt/apacheconf/extra/httpd-fastcgi.conf with this content

#———————httpd-fastcgi.conf—————–

LoadModule fastcgi_module modules/mod_fastcgi.so

FastCgiIpcDir /opt/apache/docs/fcgi_ipc/tmp
AddHandler fastcgi-script .fcgi
FastCgiSuexec /opt/apache/bin/suexec
FastCgiConfig -singleThreshold 100 -killInterval 300 -autoUpdate -idle-timeout 30 -pass-header HTTP_AUTHORIZATION

#—————————END————————–

# note that the directory /opt/apache/docs/fcgi_ipc/tmp have to be created and and apache should be able to read and write to it
# the permission on my system are 660

# now apache and mod-fastcgi are ready. so we will proceed in installing php

mkdir /opt/php
mkdir /opt/php/source
cd /opt/php/source

# I have installed 4.4.7 because my websites are not updated to work on php 5.x series. A very useful resource for that case is http://museum.php.net/

wget http://museum.php.net/php4/php-4.4.7.tar.gz
tar xvf php-4.4.7.tar.gz
cd php-4.4.7
./configure –prefix=/opt/php –enable-versioning –with-layout=GNU –disable-all –enable-ftp –enable-libxml –with-libxml-dir=/usr/local –enable-reflection –with-regex=php –with-zend-vm=CALL –with-mysql=/usr/local/psa/mysql –with-gd=/usr/local –with-pcre-regex=/usr/local –enable-fastcgi

# This configuration again is just for what my websites require. The most important thing is that you should have –enable-fastcgi
# the rest is just what you find best for your needs. We proceed with the install

make
make install

# now we are set to get php added to the mix.

# lets say we have one domain that will work here /opt/apache/vhosts/domain1.com
# for the needs of the php-wrapper I create a directory create /opt/apache/vhosts/domain1.com/php-fastcgi
# In that directory i create a shell script called php-wrapper with the following entries

#!/bin/sh
PHP_FCGI_MAX_REQUESTS=2000
export PHP_FCGI_MAX_REQUESTS
exec /opt/php/bin/php

# Just i will note one of the cool things about this file. Here you can specify PHPRC environmental variable for where the php.ini file for the virtual host is
# Here is a second example foe php-wrapper file

————–php-wrapper———————
#!/bin/sh
PHPRC=”/opt/apache/vhosts/domain1.com/php-fastcgi”
export PHPRC
PHP_FCGI_CHILDREN=3
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=2000
export PHP_FCGI_MAX_REQUESTS
exec /opt/php/bin/php
————-php-wrapper END———————-

# now lets say your virtual host looks like this

ServerAdmin webmaster@domain1.com
DocumentRoot “/opt/apache/vhosts/domain1.com”
ServerName domain1.com
ErrorLog “logs/domain1.com-error_log”
CustomLog “logs/domain1.com-access_log” common

# What it has to be added is

SuexecUserGroup user1 apache

Options ExecCGI
SetHandler fastcgi-script

AddType application/x-httpd-fastphp .php
AddHandler application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fastcgi/php-wrapper

allow from all

# The final version will look like this

ServerAdmin webmaster@domain1.com
DocumentRoot “/opt/apache/vhosts/domain1.com”
ServerName domain1.com
SuexecUserGroup user1 apache

Options ExecCGI
SetHandler fastcgi-script

AddType application/x-httpd-fastphp .php
AddHandler application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fastcgi/php-wrapper

allow from all

ErrorLog “logs/domain1.com-error_log”
CustomLog “logs/domain1.com-access_log” common

# Restart apache (/opt/apache/bin/apachectl restart) and all should be working fine

Author: Stefan Batanov

Leave a Reply