Linux Slackware + Apache2 + PHP + mod_fastcgi
This tutorial assumes that you are already familiar with Slackware Linux and Apache2.
Before you start, make sure you have a working httpd.conf of Apache2 because a detailed configuration is not included in this tutorial. Then, remove the installed packages of Apache2 and PHP using Slackware’s pkgtool.
Go to Apache website and get the latest version of Apache2. In this tutorial I’m using Apache-2.2.9:
cd /usr/local/src
wget http://www.eu.apache.org/dist/httpd/httpd-2.2.9.tar.gz
Go to PHP website and get the latest version of PHP5. In this tutorial I’m using PHP-5.2.6
wget http://www.php.net/get/php-5.2.6.tar.gz/from/de.php.net/mirror
Go to FastCGI website and get the latest version of mod_fastcgi. In this tutorial I’m using mod_fastcgi-2.4.6:
wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
Now, we are going to unzip/configure Apache. In this tutorial we are configuring it Slackware style, with as many things as possible included:
tar -xzvf httpd-2.2.9.tar.gz
./configure \
--prefix=/usr \
--sysconfdir=/etc/httpd \
--libdir=/usr/lib/httpd \
--libexecdir=/usr/lib/httpd/modules \
--datadir=/srv/httpd \
--localstatedir=/var\
--with-mpm=worker \
--with-apr=/usr \
--with-apr-util=/usr \
--enable-mods-shared=all \
--enable-so \
--enable-pie \
--enable-cgi \
--with-pcre \
--enable-ssl \
--enable-rewrite \
--enable-vhost-alias \
--enable-proxy \
--enable-proxy-http \
--enable-proxy-ftp \
--enable-proxy-balancer \
--enable-cache \
--enable-mem-cache \
--enable-file-cache \
--enable-disk-cache \
--disable-speling \
--enable-dav \
--enable-ldap \
--enable-authnz-ldap \
--enable-authn-anon \
--enable-authn-alias
Please notice that we are going to use Apache mpm worker instead of the default prefork:
--with-mpm=worker \
For additional info about mpm-worker, feel free to visit: http://httpd.apache.org/docs/2.2/mod/worker.html
We are going to build apache:
make
make install
Unzip mod_fastcgi:
cd /usr/local/src
tar -xzvf mod_fastcgi-2.4.6.tar.gz
We are going to build mod_fastcgi according to it’s README:
cd mod_fastcgi-2.4.6
apxs -o mod_fastcgi.so -c *.c
Then, we will copy the binary into Apache’s modules folder:
cp .libs/mod_fastcgi.so /usr/lib/httpd/modules/mod_fastcgi.so
Now, you will have to edit /etc/httpd/httpd.conf and add the following line:
LoadModule fastcgi_module lib/httpd/modules/mod_fastcgi.so
Make sure you have the following files:
mkdir /var/run/httpd
mkdir /tmp/fcgi_ipc
chmod 777 /tmp/fcgi_ipc
Before continue with PHP configuration, make sure you have mcrypt/libmcrypt installed. If you don’t want to install mcrypt, just remove the following line from the php configure command:
--with-mcrypt=shared
Anyway, here there are the links where you can get a slackware packed version of mcrypt:
wget http://repository.slacky.eu/slackware-12.0/libraries/libmcrypt/2.5.8/libmcrypt-2.5.8-i486-1sl.tgz
wget http://darkstar.ist.utl.pt/slackware/addon/slacky/slackware-12.0/security/mcrypt/2.6.7/mcrypt-2.6.7-i486-1sl.tgz
installpkg libmcrypt-2.5.8-i486-1sl.tgz mcrypt-2.6.7-i486-1sl.tgz
Now, we are going to unzip/configure PHP. We are using almost the same configuration as Slackware’s default:
EXTENSION_DIR=/usr/lib/php/extensions \
CFLAGS="-O2 -march=i486 -mtune=i686" \
./configure \
--prefix=/usr \
--sysconfdir=/etc \
--enable-fastcgi \
--enable-discard-path \
--enable-force-cgi-redirect \
--disable-safe-mode \
--enable-apc \
--enable-apc-mmap \
--enable-memory-limit \
--enable-suhosin \
--disable-magic-quotes \
--enable-zend-multibyte \
--enable-mbregex \
--enable-tokenizer=shared \
--with-config-file-scan-dir=/etc/php \
--with-config-file-path=/etc/httpd \
--with-mod_charset \
--with-layout=PHP \
--enable-sigchild \
--enable-xml \
--with-libxml-dir=/usr \
--enable-simplexml \
--enable-spl \
--enable-filter \
--disable-debug \
--with-openssl=shared \
--with-pcre-regex=/usr \
--with-zlib=shared,/usr \
--enable-bcmath=shared \
--with-bz2=shared,/usr \
--enable-calendar=shared \
--enable-ctype=shared \
--with-curl=shared \
--with-curlwrappers \
--enable-dba=shared \
--with-gdbm=/usr \
--with-db4=/usr \
--enable-dbase=shared \
--enable-exif=shared \
--enable-ftp=shared \
--with-gd=shared \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-zlib-dir=/usr \
--with-xpm-dir=/usr \
--with-freetype-dir=/usr \
--with-t1lib=/usr \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--with-gettext=shared,/usr \
--with-gmp=shared,/usr \
--with-iconv=shared \
--with-ldap=shared \
--enable-mbstring=shared \
--with-hash \
--with-mhash=shared,/usr \
--with-mysql=shared,/usr \
--with-mysqli=shared,/usr/bin/mysql_config \
--enable-pdo=shared \
--with-pdo-mysql=shared,/usr \
--with-pdo-sqlite=shared \
--with-pspell=shared,/usr \
--with-mm=/usr \
--enable-shmop=shared \
--with-snmp=shared,/usr \
--enable-soap=shared \
--enable-sockets \
--with-sqlite=shared \
--enable-sqlite-utf8 \
--with-regex=php \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-wddx=shared \
--with-xsl=shared,/usr \
--enable-zip=shared \
--with-tsrm-pthreads \
--enable-shared=yes \
--enable-static=no \
--with-gnu-ld \
--with-pic \
--with-mcrypt=shared
make
make install
Edit httpd.conf and add the following (after LoadModule directive):
FastCgiIpcDir /tmp/fcgi_ipc
AddHandler fastcgi-script .fcgi .fcg .fpl
FastCgiConfig -singleThreshold 100 -killInterval 300 -autoUpdate -idle-timeout 240 -pass-header HTTP_AUTHORIZATION
ScriptAlias /php-fcgi "/var/www/cgi-bin/php5.fcgi"
AddHandler application/x-httpd-php .php
Action application/x-httpd-php /php-fcgi
If you want to find more about mod_fastcgi options, visit: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html
Create the file /var/www/cgi-bin/php5.fcgi:
#!/bin/sh
PHP_FCGI_CHILDREN=2
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=500
export PHP_FCGI_MAX_REQUESTS
exec /usr/bin/php-cgi
Make sure the file is own by apache and is executable:
chown apache:apache /var/www/cgi-bin/php5.fcgi
chmod 755 /var/www/cgi-bin/php5.fcgi
Edit /etc/httpd/httpd.conf and make sure the following line is not commented:
Include /etc/httpd/extra/httpd-mpm.conf
Edit /etc/httpd/extra/httpd-mpm.conf and make sure the following lines are not commented:
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
At this point you should be ready to start apache:
apachectl start
Check /var/log/httpd/error_log to see if there are any errors.
[notice] FastCGI: process manager initialized (pid 20046)
[notice] Apache/2.2.9 (Unix) mod_fastcgi/2.4.6 configured -- resuming normal operations
If everything is ok, you should see the following processes after you run ps axf:
20511 ? Ss 0:00 /usr/bin/httpd -k start
20512 ? S 0:00 \_ /usr/bin/fcgi- -k start
20571 ? Ss 0:00 | \_ /usr/bin/php-cgi
20572 ? S 0:00 | \_ /usr/bin/php-cgi
20573 ? S 0:00 | \_ /usr/bin/php-cgi
20574 ? S 0:00 | \_ /usr/bin/php-cgi
20575 ? S 0:00 | \_ /usr/bin/php-cgi
20576 ? S 0:00 | \_ /usr/bin/php-cgi
20577 ? S 0:00 | \_ /usr/bin/php-cgi
20578 ? S 0:00 | \_ /usr/bin/php-cgi
20579 ? S 0:00 | \_ /usr/bin/php-cgi
20580 ? S 0:00 | \_ /usr/bin/php-cgi
20581 ? S 0:00 | \_ /usr/bin/php-cgi
20513 ? Sl 0:00 \_ /usr/bin/httpd -k start
20541 ? Sl 0:00 \_ /usr/bin/httpd -k start
If you want to boost the performance of your PHP scripts, you can use a php cacher. In the example below, I’m going to use APC.
Get the latest apc version available:
cd /usr/local/src
wget http://pecl.php.net/get/APC-3.0.19.tgz
Unzip/configure APC:
tar -xvf APC-3.0.19.tgz
cd APC-3.0.19
phpize
EXTENSION_DIR=/usr/lib/php/extensions \
CFLAGS="-O2 -march=i486 -mtune=i686" \
./configure \
--prefix=/usr \
--sysconfdir=/etc \
--enable-apc-mmap \
--with-php-config=/usr/bin/php-config
make
cp modules/apc.* /usr/lib/php/extensions/
Add the following lines in your /etc/php.ini:
extension=apc.so
apc.enabled=1
apc.shm_segments=1
apc.shm_size=128
apc.ttl=7200
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask=/tmp/apc.XXXXXX
Now, you have to restart apache:
apachectl restart
Later edit:
After successfully running above setup on a box with medium/high traffic for a time, I saw that changing the number of PHP_FCGI_CHILDREN to 2 helped getting better performance and better loading times under high load.
Comments
8 Responses to “Linux Slackware + Apache2 + PHP + mod_fastcgi”
Hi , i just installed php+apache+fcgi from your tutorial , and it works smooth .
Btw , installed httpd 2.2.11 and php 5.2.9 and works just fine .
Thanks for this great tutorial :)
Great work.
I have problem… on slackware 12.1
httpd 2.2.11 php 5.2.9 mod_fastcgi
httpd: Syntax error on line 94 of /etc/httpd/httpd.conf: Cannot load /usr/lib/httpd/modules/mod_proxy.so into server: /usr/lib/httpd/modules/mod_proxy.so: undefined symbol: ap_timeout_parameter_parse
Please help me
da best. Keep it going! Thank you
The best information i have found exactly here. Keep going Thank you
Oh..
Finally..
HoooWaaa..
After more than 3-4 formats for the box..
I finally made it..
But, as it seems that it wouldn’t work with the MPM Worker, I skipped this point, and kept it to the default one.
Thanks a lot for this piece of art.
Hasan
Also, one more thing..
I guess you have to correct this comand:
chmod 777 /tmp/fcgi_ipc
to
chmod -R 777 /tmp/fcgi_ipc
Thanks again..
[...] a good idea to use a php cacher. Feel free to use the instructions from apache tutorial in order to install [...]