Apache2

Apache is described as the worlds most popular webserver, and part of the reason for that is the extensive flexibility it offers.

The flexibility allows many interesting, and useful, things to be done with the server, but the cost is a higher overhead in processing requests. This has lead to the rise of several alternative web-servers aiming to be more lightweight and flexible. (These include products such as nginx and lighttpd.)

Choosing the correct worker

The Apache webserver comes with several different "Multi-Processing Modules", or MPMs. These are server-cores which work in a slightly different fashion.

NOTE: You can only use one MPM.

Although there are more, traditionally you have three main options to choose between:

Although apache2-mpm-event is relatively new, and thus less well known than the alternatives, it is the fastest of the big-three MPMs.

The most important caveat with the different MPM modules is that you cannot use mod_php with either apache-mpm-worker, or apache2-mpm-event, instead you must handle your PHP code via a different mechanism (which turns out to be a speedup in its own right).

Disabling .htaccess files

If you allow configuration files to be present beneath your DocumentRoot directory you cause Apache to constantly test for them.

For example if you have a DocumentRoot set to /var/www and a client requests the URL http://example.com/a/long/path/ Apache will look for each of the following files:

This is clearly a lot of needless searching, and it is needless searching which will be constantly repeated by future HTTP-requests.

To disable this behaviour you need to do two things:

To disable this behaviour simply set:

<Directory />
  AllowOverride None
</Directory>
#
#  Assuming your DirectoryRoot is set to /var/www
#
<Directory /var/www/>
  AllowOverride None
</Directory>

Tuning for PHP

As mentioned above the fastest general-purpose worker is the apache2-mpm-event, and this isn't compatible with PHP.

To solve this the recommended approach is to deploy the php5-fpm module.

On a Debian system you can install the PHP5 FPM module via:

# apt-get install php5-fpm

To further increase performance it is recommended that you connect to FPM via a Unix socket, rather than a network socket. So you should change /etc/php5/fpm/pool.d/www.conf from :

listen = 127.0.0.1:9000

to:

listen = /var/run/php5-fpm.sock

Once you've made that change you can restart via:

# /etc/init.d/php5-fpm restart

With the PHP-FPM part configured you now need to wire up Apache to use it, via the fastcgi module. Again on a Debian system you can install that via:

# apt-get install libapache2-mod-fastcgi
# a2enmod libapache2-mod-fastcgi

Once installed you can update the configuration file /etc/apache2/mods-available/fastcgi.conf to read:

<IfModule mod_fastcgi.c>
       AddHandler php5-fcgi .php
       Action php5-fcgi /php5-fcgi
       Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
       FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
</IfModule>

General Webserver Notes

We also have a page of general notes for webservers.

 

Optimizing

Testing