There are different things to be taken care for improve perfomance of apache server.Iam explaing about different apache modules which helps in tuning its perfomance.
APACHE
MOD_STATUS
To enable
status reports only for browsers from the localhost add this code to
your httpd.conf configuration file
#vi
/etc/httpd/conf/httpd.conf(centos/Redhat)
#vi /etc/apache2/apache2.conf(ubuntu)
<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from localhost
</Location>
Order Deny,Allow
Deny from all
Allow from localhost
</Location>
Apache mod_status also
offers an option called ExtendedStatus, which provides additional
information about each request made to Apache. To enable ExtendedStatus edit
your Apache configuration file:
#vi /etc/httpd/conf/httpd.conf(centos/Redhat)
#vi /etc/apache2/apache2.conf(ubuntu)
ExtendedStatus
On
(Enabling ExtendedStatus consumes additional
system resources.)
To view the
file generated, download Lynx:
#yum install
lynx
Restart
httpd restart
#service
httpd restart
Open the
file
#lynx http://localhost/server-status
MULTI PROCESSING MODULES
Prefork
The prefork
module creates a number of child processes at launch, each child handles only
one thread. Since these processes deal solely with one thread at a time, making
request speed suffer should there be too many concurrent requests. Should this
occur, some requests essentially have to wait in line to be acted upon. To
handle this, increase the number of child processes spawned, but be aware that
this increases the amount of RAM being used. Prefork is the safest module, and
should be used when using mods that are not thread safe.
Worker
The worker
module’s child processes spawn many threads per process, each thread ready to
take on new requests. This allows for a greater number of concurrent requests
to come in, and in turn is easier on the server’s RAM usage. Overall, the
worker module offers higher performance, but is less secure than prefork and
cannot be used with modules that are not thread safe.
Event
The event
module is only available on Apache 2.4 and is based off the
worker MPM. Like the worker, it creates multiple threads per child process,
with a thread dedicated to KeepAlive connections that are handed down to child
threads once the request has been made. This is good for multiple concurrent
connections, especially those that are not all active at the same time but make
the occasional request. The event MPM functions the same as worker in the event
of SSL connections.
Once the MPM
is created we have to change values inside configuration
#
StartServers
# MinSpareServers
#
MaxSpareServers
#
ServerLimit
#
MaxClients
#
MaxRequestsPerChild
StartServers : The StartServers value indicates
the number of child processes created at startup, and is dynamically controlled
depending on load. There is often little reason to alter this number, unless
your server is restarted frequently and contains a large number of requests upon
reboot.
MinSpareServers : Sets the minimum
number of idle child processes. If there are fewer processes than
the MinSpareServer number, more processes are created at the rate of
one per second on Apache 2.2 or lower. With Apache 2.4, this rate increases
exponentially starting with 1 and ending with 32 children spawned per second.
MaxSpareServers : Sets the maximum
number of idle child processes. If there are more idle processes than this
number, then they are terminated. Unless your website is extremely busy, this
number should not be set too high, since even idle processes consume resources.
MaxClients : The maximum amount of
requests that can be served at the same time, with any number going past the
limit being queued. If this is set too low, connections sent to queue
eventually time-out; however, if set too high, it causes the memory to start
swapping. If this value is increased past 256, the ServerLimit value
must also be increased.
ServerLimit : if you need to increase
the MaxClients above 256, then increase
your ServerLimit to match. To do this, add
the ServerLimit line to your MPM code and alter the value:
ServerLimit 256
# prefork MPM
<IfModule
prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
KeepAlive :
The KeepAlive directive,
when set to on allows for multiple requests to come from the same TCP
connection. When a KeepAlive connection is used, it counts as only one request
against the MaxRequestsPerChild directive.
Up toApache
1.3, HostnameLookups defaulted to On. This adds latency to every
request because it requires a DNS lookup to complete before the request is
finished.
Note that it's
possible to scope the directives, such as within a <Location
"/server-status"> section. In this case the DNS lookups are
only performed on requests matching the criteria. Here's an example which
disables lookups except for .html and .cgi files:
HostnameLookups off
<Files
~ "\.(html|cgi)$">
HostnameLookups on
</Files>
Wherever in
your URL-space you do not have an Options FollowSymLinks, or you do have
an Options SymLinksIfOwnerMatch, Apache will need to issue extra system
calls to check up on symlinks. (One extra call per filename component.) For
example, if you had:
DocumentRoot "/www/htdocs"
<Directory
"/">
Options SymLinksIfOwnerMatch
</Directory>
Then request
is made for the URI /index.html, then Apache will
perform lstat(2) on /www, /www/htdocs,
and /www/htdocs/index.html.(note:lstat is a function used in linux to
return information about a file) The results of these lstats are never
cached, so they will occur on every single request. If we really want he
symlinks security checking, we can do
something like this:
DocumentRoot "/www/htdocs"
<Directory
"/">
Options FollowSymLinks
</Directory>
<Directory
"/www/htdocs">
Options -FollowSymLinks
+SymLinksIfOwnerMatch
</Directory>
This at
least avoids the extra checks for the DocumentRoot path. Note that you'll need to
add similar sections if you have any Alias or RewriteRule paths outside of your document
root. For highest performance, and no symlink protection,
set FollowSymLinks everywhere, and never set SymLinksIfOwnerMatch.
Wherever in
your URL-space you allow overrides (typically .htaccess files),
Apache will attempt to open .htaccess for each filename component.
For example,
DocumentRoot "/www/htdocs"
<Directory
"/">
AllowOverride all
</Directory>
and a
request is made for the URI /index.html. Then Apache will attempt to
open /.htaccess, /www/.htaccess, and /www/htdocs/.htaccess. The
solutions are similar to the previous case of Options FollowSymLinks. For
highest performance use AllowOverride None everywhere in your
filesystem.
[For
example:
AllowOverride
means If we are putting some files in / (for eg) and we want to get it in our web page..If we
give AlowOverride all only we will
be able to fetch.otherwise we will not be able.]
If at all
possible, avoid content negotiation if you're really interested in every last
ounce of performance. In practice the benefits of negotiation outweigh the
performance penalties. There's one case where you can speed up the server.
Instead of using a wildcard such as:
DirectoryIndex
index
Use a
complete list of options:
DirectoryIndex index.cgi index.php index.shtml index.html
where you
list the most common choice first.