Speeding up Apache through apache2-mpm-worker and
php5-cgi on Debian / How to improve Apache performance and decrease
server memory consumption
By default most Apache running Linux servers on the Internet are
configured to use with the
mpm prefork apache module
Historically
prefork apache module is the predecessor of the
worker module therefore it's believed to be a way more
tested and reliable, if you need a critical reliable webserver
configuration.
However from my experience by so far with the
Apache MPM
Worker I can boldly say that many of the rumors concerning the
unreliabity of
apache2-mpm-worker are just myths.
The old way Apache handles connections e.g. the
mod prefork
is the well known way that high amount of the daemons on Linux and
BSD are still realying on.
When prefork is a used by Apache, every new TCP/IP connection
arriving at your Linux server on the Apache configured port let's
say on
port 80 is being served by Apache in a way that the
Apache process (mother process)
parent does fork a new
Apache parent copy in order to serve the new request.
Thus by using the prefork Apache needs to fork new process (if it
doesn't have already an empty forked one waiting for connections)
and serve the HTTP request of the new client, after the request of
the client is completed the newly forked Apache usually dies (even
though it again depends on the way the Apache server is configured
via the Apache configuration - apache2.conf / httpd.conf
etc.).
Now you can imagine how slow and memory consuming it is that all
the time the parent Apache process spawns new processes, kills old
ones etc. in order to fulfill the client requests.
Now just to compare the
Apace mpm prefork does not use the
old forking way, but relies on a few Apache processes which handles
all the requests without constantly being destroyed and recreated
like with the
prefork module.
This saves operations and system resources, threaded programming
has already been proven to be more efficient way to handle tasks
and is heavily adopted in GUI programming for instance in Microsoft
Windows, Mac OS X, Linux Gnome, KDE etc.
There is plenty of information and statistical data which compares
Apache running with
prefork and respectively
worker
modules online.
As the goal of this article is not to went in depths with this kind
of information I would not say more on it but let you explore
online a bit more about them in case if you're interested.
The purpose of this article is to explain in short how to
substitute the Apache2-MPM-Prefork and how your server performance
could benefit out of the use of
Apache2-MPM-Worker.
On Debian the default Apache process serving module in Apache
1.3x,Apache 2.0x and 2.2x is prefork thus the installation of
apache2-mpm-worker is not "a standard way" to install Apache
Deciding to swith from the default Debian apache-mpm-prefork to
apache-mpm-worker is quite a serious and responsible decision and
in some cases might cause troubles, if you have decided to follow
my article be sure to consider all the possible negative
consequences of switching to the
apache worker !
Now after having said a bunch of info which might be not necessary
with the experienced system admin I'll continue on with the steps
to install the apache2-mpm-worker.
1. Install the apache2-mpm-worker
debian:~# apt-get install apache2-mpm-worker php5-cgi
Reading state information... Done The following packages were
automatically installed and are no longer required: The following
packages will be REMOVED apache2-mpm-prefork libapache2-mod-php5
The following NEW packages will be installed apache2-mpm-worker 0
upgraded, 1 newly installed, 2 to remove and 46 not upgraded. Need
to get 0B/259kB of archives. After this operation, 6193kB disk
space will be freed.
As you can notice in below's text confirmation which will appear
you will have to remove the
apache2-mpm-prefork and the
apache2-mpm-worker modules before you can proceed to install
the apache2-mpm-prefork.
You might ask yourself if I remove my installed
libphp how
would I be able to use my Apache with my PHP based websites? And
why does the apt package manager requires the
libapache2-mod-php5 to get removed.
The explanation is simple
apache2-mpm-worker is not thread
safe, in other words scripts which does use the
php fork();
function would not work correctly with the Apache worker module and
will probably be leading to PHP and Apache crashes.
Therefore in order to install the apache mod worker it's necessary
that no libapache2-mod-php5 is existent on the system.
In order to have a PHP installed on the server again you will have
to use the
php5-cgi deb package, this is the reason in the
above apt-get command I'm also requesting apt to install the
php5-cgi package next to apache2-mpm-worker.
2. Enable the cgi and cgid apache modules
debian:~# a2enmod cgi
debian:~# a2enmod cgid
3. Activate the mod_actions apache modules
debian:~# cd /etc/apache2/mods-enabled
debian:~# ln -sf ../mods-available/actions.load
debian:~# ln -sf ../mods-available/actions.conf
4. Add configuration options in order to enable mod worker to
use the newly installed php5-cgi
Edit
/etc/apache2/mods-available/actions.conf vim, mcedit or
nano (e.g. your editor of choice and add inside:
<IfModule mod_actions.c>
Action application/x-httpd-php /cgi-bin/php5
</IfModule>
After completing all the above instructions, you might also need to
edit your
/etc/apache2/apache2.conf to tune up, how your
Apache mpm worker will serve client requests.
Configuring the
<IfModule mpm_worker_module> in
apache2.conf is necessary to optimize your newly installed
mpm_worker module for performance.
5. Configure the mod_worker_module in apache2.conf One
example configuration for the mod worker is:
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
Consider the fact that this configuration is just a sample and it's
in no means configured for serving Apache requests for high load
Apache servers and you need to further play with the values to have
a good results on your server.
6. Check that all is fine with your Apache configurations and no
syntax errors are encountered
debian:~# /usr/sbin/apache2ctl -t
Syntax OK
If you get something different from Syntax OK track the
error and fix it before you're ready to restart the Apache
server.
7. Now restart the Apache server
debian:~# /etc/init.d/apache2 restart
All should run fine and hopefully your PHP scripts should be
interpreted just fine through the php5-cgi instead of the
libapache2-mod-php5.
Using the /usr/bin/php5-cgi will increase with some
percentage your server CPU load but on other hand will drasticly
decrease the Webserver memory consumption.
That's quite logical because the libapache2-mod-hp5 is loaded once
during apache server whether a new instance of /usr/bin/php5-cgi is
invoked during each of Apache requests via the mod worker.
There is one serious security flow coming with php5-cgi, DoS
against a server processing scripts through php5-cgi is much easier
to be achieved.
An example for a denial attack which could affect a website running
with mod worker and php5-cgi, could be simulated from a simple user
with a web browser which holds up the f5 or ctrl + r browser
page refresh buttons.
In that case whenever php5-cgi is used the CPU load would rise
drastic, one possible solution to this denial of service issues is
by installing and using libapache2-mod-evasive like
so:
8. Install libapache2-mod-evasive
debian:~# apt-get install
libapache2-mod-evasive
The Apache mod evasive module is a nice apache module to minimize
HTTP DoS and brute force attacks.
Now with mod worker through the php5-cgi, your apache should start
serving requests more efficiently than before.
For some performance reasons some might even want to try out the
fastcgi with the worker to boost the Apache performance but
as I have never tried that I can't say how reliable a a mod worker
with a fastcgi would be.
N.B. ! If you have some specific php configurations within
/etc/php5/apache2/php.ini you will have to set them also in
/etc/php5/cgi/php.ini before you proceed with the above
instructions to install Apache otherwise your PHP scripts might not
work as expected.
Mod worker is also capable to work with the standard mod
php5 Apache module, but if you decide to go this route you will
have to recompile your PHP lib manually from source as in Debian
this option is not possible with the default php
library.