The single biggest issue affecting Apache webserver performance is RAM. Have as much RAM as your hardware, OS, and funds allow. The more RAM your system has, the more processes (and threads) Apache can allocate and use - which directly translates into the amount of concurrent requests/clients Apache can serve.
Lower the amount of time the server will wait before failing a request.
This directive allows multiple requests to be sent over the same TCP
connection. This is particularly useful while serving HTML pages with
lots of images. If KeepAlive is set to Off, then for each images, a
separate TCP connection has to be made. Overhead due to establishing
TCP connection can be eliminated by turning On KeepAlive.
KeepAliveTimeout determines how long to wait for the next request.
MaxKeepAliveRequests is the maximum number of requests to allow
during a persistent connection.
KeepAlive On KeepAliveTimeout 3 MaxKeepAliveRequests 50
3. Process Creation - prefork MPM
<ifmodule mpm_prefork_module> StartServers 20 MinSpareServers 10 MaxSpareServers 20 MaxClients 256 MaxRequestsPerChild 5000 </ifmodule>
MaxClients sets a limit on the number of simultaneous
connections/requests that will be served. Set this number too low and
resources will go to waste. Set this number too high and an influx of
connections will bring the server to a stand still. Set this number just
right and your server will fully utilize the available resources. An
approximation of this number should be derived by dividing the amount of
system memory (physical RAM) available by the maximum size of an
apache/httpd process (with a generous amount spared for all other
MaxClients ≈ (RAM - size_all_other_processes) / (size_apache_process)
Get the value of apache process size in KiloBytes (RSS column):
$ ps -ylC apache2 --sort:rss
StartServers directive sets the number of child server
processes created on startup. Apache will continue creating child
processes until the
MinSpareServers setting is reached. This doesn't
have much effect on performance if the server isn't restarted
frequently. If there are lot of requests and Apache is restarted
frequently, set this to a relatively high value.
MinSpareServers determine how many child
processes to keep active while waiting for requests. If the
MinSpareServers is too low and a bunch of requests come in, Apache will
have to spawn additional child processes to serve the requests. Creating
child processes is relatively expensive. If the server is busy creating
child processes, it won't be able to serve the client requests
MaxSpareServers shouldn't be set too high: too many child
processes will consume resources unnecessarily. Tune
MaxSpareServers so that Apache need not spawn more than 4 child
processes per second (Apache can spawn a maximum of 32 child processes
per second). When more than 4 children are spawned per second, a message
will be logged in the ErrorLog.
MaxRequestsPerChild directive sets the limit on the number of
requests that an individual child server process will handle. After
MaxRequestsPerChild requests, the child process will die. It's set to 0
by default, the child process will never expire. It is appropriate to
set this to a value of few thousands. This can help prevent memory
leakage, since the process dies after serving a certain number of
requests. Don't set this too low, since creating new processes does have
overhead. The goal here is to recycle each process once per day, as
apache threads gradually increase their memory allocation as they run.
Options +FollowSymLinks -SymLinksIfOwnerMatch is set for all
directories. Otherwise, Apache will issue an extra system call per
filename component to substantiate that the filename is NOT a symlink,
and more system calls to match an owner.
<directory xxx> Options FollowSymLinks </directory>
Set a default
AllowOverride None for your filesystem. Otherwise, for
a given URL to path translation, Apache will attempt to detect an
.htaccess file under every directory level of the given path.
<directory xxx> AllowOverride None </directory>