You are here

Apache Configuration for Performance

You can make your Apache based Web server faster by cleaning up the Apache configuration files. The changes do have an effect when your Web server is close to overloaded and you need the extra margin of processing power.

You configure Apache by changing the settings in httpd.conf. In Windows, http.conf is located in directory C:\Program Files\Apache Software Foundation\Apache2.2\conf. http.conf includes other files that are stored in directory C:\Program Files\Apache Software Foundation\Apache2.2\conf\extra. For most Apache installations, you change httpd.conf then you change extras/httpd-vhosts.conf. Everything else can remain unchanged.

Documentation

The Apache documentation for the latest Apache, 2.2, is available online at httpd.apache.org/docs/2.2/. When you install Apache, you can optionally install a copy of the documentation on your own machine so you can read the documentation when not online.

httpd.conf

httpd.conf is the important configuration file for performance. Look at the default you get when you install Apache. In Windows, the default is saved in C:\Program Files\Apache Software Foundation\Apache2.2\conf\default so you can always go back to the default.

ThreadsPerChild

Your Windows default httpd.conf contains the following two lines. 250 means 250 threads can run at once and each one takes up memory. The same applies to requests and the 0 means you can have unlimited requests but you will have no more requests than the number generated by a thread. That makes threads the limiting factor and a thread is approximately one page request; which means 250 pages requests at one time.
ThreadsPerChild 250
MaxRequestsPerChild 0

There are some other settings that match with these. The more activity you allow, the faster your Web site becomes until the computer starts to run out of memory. If you have too many threads running, you can starve your database and get worse performance because every page waits on the database. Buy the maximum memory that will fit in your computer and adjust these settings up until performance starts to drop. Adjust the database memory settings up at the same time so you grow everything in parallel until you hit the limit of available memory.

LoadModule

Look for a long list of LoadModule lines, such as the following load of mod_actions. Every module uses memory and creates one extra thing that Apache has to check, sometimes for every page request. If you are not using a module, do not load it. Most of the modules are turned off in my sites.
LoadModule actions_module modules/mod_actions.so

mod_autoindex

LoadModule autoindex_module modules/mod_autoindex.so

Use mod_autoindex as an example. mod_autoindex is used when a browser requests a directory without a page. On my site, you can request petermoulding.com/australia/ without specifying a page name. My software presents the main content page automatically. If I did not have that software installed and let Apache choose the default page, Apache would look for a page specified in DirectoryIndex. When Apache cannot find DirectoryIndex, or cannot find the page specified by DirectoryIndex, Apache can automatically build an index page. Usually you want the page generated by your software and do not want an Apache automatic index because the Apache automatic index can reveal files you do not want revealed. You turn off automatic indexing for security. If you are not using automatic indexing then do not load the module.

When you remove automatic indexes, you can remove the following line. If Options contains more than Indexes, remove Indexes and leave the other options.
Options Indexes

mod_include

LoadModule include_module modules/mod_include.so

mod_include processes SSI, Server Side Includes. You do not need SSI when using PHP. SSI is loaded by default so turn it off.

What is SSI? SSI looks like the following line which displays the date. You can do more with PHP, achieve finer control with PHP, and reduce the duplicate processing of Web pages by doing everything once in PHP, not PHP then SSI.

AllowOverride

Look for the following AllowOverride. If it says anything other than none, change it to none. You have to remove .htaccess files an other settings to reach the point where you can set AllowOverride to none so read the rest of this page and work back towards removing overrides.
AllowOverride None

.htpasswd

.htpasswd contains passwords for access to restricted parts of your Web site. You do not need .htpasswd files with a good content management system. If you do use a .htpasswd file, never place it within your Web site directories. If your Web site is hosted and your host will not let you place files outside your Web directory, change hosts.

.htaccess

Your Web site may contain files named .htacces. They slow down your Web server because your Web server has to read every directory looking for possible .htaccess files and the process is repeated for every page request.

What would happen if my site had .htaccess turned on and you visited petermoulding.com/australia/animals/ring_tailed_possum? Apache would look for .htaccess files in /australia/ then /australia/animals/.

Most .htaccess settings can be moved from .htaccess to httpd.conf and extras/httpd-vhosts.conf. httpd.conf and extras/httpd-vhosts.conf are read only once when Apache starts.When your Web site is stable, you can stop experimenting with setting in .htaccess, moce the settings to httpd.conf, and remove all the .htaccess files. You then set AllowOverride to none to stop Apache looking for .htaccess files.

After the .htaccess files disappear and the override option is turned off, you can remove the following setting.


Order allow,deny
Deny from all

AddType application

Your .htaccess file might contain a line similar to the following. The example is adding PHP processing to files of type .html and .php. Specify this in httpd.conf, not .htaccess.
AddType application/x-httpd-php .html .php

FilesMatch

The following FilesMatch is placed in .htaccess by the default installation of Drupal to limit access to some of the files installed by Drupal. Move the Drupal settings to your virtual server definition in extras/httpd-vhosts.conf.
# Protect files and directories from prying eyes.

Order allow,deny

Options

The following lines are also from the default Drupal settings. The indexing option should already be turned off in httpd.conf so delete this option.
# Don't show directory listings for URLs which map to a directory.
Options -Indexes

The following lines are from Drupal and set values that are the default in PHP 5. Make sure your PHP settings are correct and remove them from here.
# PHP 5, Apache 1 and 2.

php_value register_globals 0

For an explanation of the individual PHP settings, read one of the articles I wrote back when PHP 4 was first released; explaining how to make PHP secure. Fortunately the PHP developers responded and the right defaults were put in place for PHP 4.2. There is now an explanation of the settings in PHP's php.ini-recommended.

Database

If you have your database on the same server as Apache, they will fight for the same memory and you will have to tune both sets of software in parallel to share the memory. If you have your database on a separate server, you have double the memory and Apache gets unrestricted use of all the memory on the Web server but your system may be limited by the speed of the network connection between the two servers. When you change your Web server settings, measure the load on both the Web server and the database.

Conclusion

You can make your Apache based Web server faster by cleaning up the Apache configuration files. You may not see the difference because most changes have little visible effect on a lightly loaded system. The changes do have an effect when your Web server is close to overloaded and you need an extra margin of processing power.