<html><head>
<title>Apache Status Module</title>
</head><body>

<img src="../images/apache_sub.gif" alt="">
<h1>Apache Status Module</h1>
<hr>

The Status Module is only available in Apache 1.1 and later.<p>

<h2>Function</h2>

The Status module allows a server administrator to find out how well
their server is performing.  A HTML page is presented that gives
the current server statistics in an easily readable form.  If required
this page can be made to automatically refresh (given a compatible
browser).  Another page gives a simple machine-readable list of the current
server state.
<p>
The details given are:
<ul>
<li>The number of children serving requests
<li>The number of idle children
<li>The status of each child, the number of requests that child has
performed and the total number of bytes served by the child (*)
<li>A total number of accesses and byte count served (*)
<li>The time the server was started/restarted and the
time it has been running for
<li>Averages giving the number of requests per second, 
the number of bytes served per second and the average number
of bytes per request (*)
<li>The current percentage CPU used by each child and in total by
Apache (*)
<li>The current hosts and requests being processed (*)
</ul>

A compile-time option must be used to display the details marked "(*)" as
the instrumentation required for obtaining these statistics does not
exist within standard Apache.

<h2>Enabling Status Support</h2>

To enable status reports only for browsers from the foo.com
domain add this code to your <code>access.conf</code> configuration file
<pre>
    &lt;Location /server-status&gt;
    SetHandler server-status
    
    &lt;Limit GET POST&gt;
    order deny,allow
    deny from all
    allow from .foo.com
    &lt;/Limit&gt;
    &lt;/Location&gt;
</pre>
<p>
You can now access server statistics by using a Web browser to access the
page <code>http://your.server.name/server-status</code>
<h3>Automatic Updates</h3>
You can get the status page to update itself automatically if you have
a browser that supports "refresh".  Access the page
<code>http://your.server.name/server-status?refresh=N</code> to refresh the page
every N seconds.
<h3>Machine Readable Status File</h3>
A machine-readable version of the status file is available by accessing the
page <code>http://your.server.name/server-status?auto</code>.  This is useful
when automatically run, see the Perl program in the <code>/support</code>
directory of Apache, <code>log_server_status</code>.

<h2>Full Instrumentation</h2>

To obtain full statistics you must compile Apache with a special
directive.  On some machines there may be a small performance loss
if you do this.  Try full statistics and see if you notice any
difference.  If you do please contact <a href="mailto:mark@ukweb.com">
mark@ukweb.com</a> and tell me your configuration.

<p>
Do this by adding the following to the AUX_CFLAGS line in the
"Configuration" file and then recompiling as usual.
<pre>
	AUX_CFLAGS= (something) -DSTATUS
</pre>




<hr>
<A HREF="../"><IMG SRC="../images/apache_home.gif" ALT="Home"></A>
<A HREF="../"><IMG SRC="../images/apache_index.gif" ALT="Index"></A>

</BODY>
</HTML>

