Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > d265f71d7fce441fd72dd0a77d0f8893 > files > 258

apache-ssl-1.3.41_1.59-1mdv2010.0.i586.rpm

<html>
<head>
<title>
Snert . Com - Software - mod_throttle/3.1.2 for Apache 1.3
</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta name="keywords" content="Apache module mod_throttle connection request bandwidth throttle request">
<meta name="description" content="An Apache module to limit the bandwidth usage and server
load of virtual hosts, directories, locations, or users according to selected policies.">
<style type="text/css">
<!--
a { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; }
ul { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; padding-right: 60px; }
h2 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 16pt; }
h3 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; }
p { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; padding-right: 60px; }
.small { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 8pt; }
.normal { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; padding-right: 60px; }
.syntax { font-family: monospace; color:#000080; font-weight: normal; }
.param { color:#0000cc; font-style: italic; font-weight: normal }
.deep { padding-left: 40px; }
-->
</style>
</head>

<body background="Img/wave1.jpg" bgcolor="#ffffff" text="#000000" link="#0000ff" vlink="#000080" alink="#ff00ff">

<!-- MARGINS -->

<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
	<td rowspan="2">
		<img alt="" src="Img/mrpixel.gif" width="100" height="1">
	</td><td>
		<img alt="Snert . Com" src="Img/sun-logo.jpg" width="110" height="110">
	</td><td align="left">
		<b><font size="+3" color="#3099ff">mod_throttle/3.1.2</font></b>
		<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
		<font size="3">from</font>&nbsp;&nbsp;
		<b><font size="+1">Snert . Com</font></b>
	</td><td>
		<img alt="" src="Img/mrpixel.gif" width="130" height="1">
	</td>
</tr><tr>
	<td colspan="3">

<!-- PAGE BODY -->
<div class="normal">

<center>
<h2>Bandwidth &amp; Request Throttling for Apache 1.3</h2>
</center>

<p>
<center>
| <a href="#Description">Description</a>
| <a href="#download">Download</a>
| <a href="#Installation">Installation</a>
| <a href="#Configuration">Configuration</a>
| <a href="#Notes">Notes</a>
| <a href="CHANGES.txt">Changes</a>
|<br>
| <a href="#License">License</a>
| <a href="#Disclaimer">Disclaimer</a>
| <a href="#Credits">Credits</a>
|<br>
| <a href="../../index.shtml">Welcome</a>
| <a href="../../Software/index.html">Software</a>
|
</center>
</p>

<a name="Description"></a>
<h3>Description</h3>
<p>
This Apache module is intended to reduce the load on your server &amp; bandwidth
generated by popular virtual hosts, directories, locations, or users according
to supported polices (see below) that decide when to delay or refuse requests.
Also mod_throttle can track and throttle incoming connections by IP address
or by authenticated remote user.
</p>
<p>
Every request now passes through four levels of throttling, which are:
by client's IP address (<a href="#ThrottleClientIP">ThrottleClientIP</a>),
by authenticated remote user name (<a href="#ThrottleRemoteUser">ThrottleRemoteUser</a>),
by local user ID (<a href="#ThrottleUser">ThrottleUser</a>),
and by directory, location, virtual host, or server (<a href="#ThrottlePolicy">ThrottlePolicy</a>).
</p>
<p>
In the list below, is a detailed description of each policy. Every policy
expects two parameters: a limit and a time period.
</p>

<p>
<dl>
<a name="PolicyNone"></a>
<dt><span class="syntax">None</span>
<dd>
<span class="normal">
This policy imposes no restrictions on a request and used as a place holder to allow
monitoring. The limit currently serves no purpose. The period specifies how long
data is accumulated before the counters are reset.
</span>
</dd>

<br>

<a name="PolicyConcurrent"></a>
<dt><span class="syntax">Concurrent</span>
<dd>
<span class="normal">
Impose a limit on the number of concurrent requests at any one time.
The period specifies how long data is accumulated before the counters are reset.
This policy <em>cannot</em> be used with either <a href="#ThrottleClientIP">ThrottleClientIP</a>
or <a href="#ThrottleRemoteUser">ThrottleRemoteUser</a>.
</span>
</dd>

<br>

<a name="PolicyDocument"></a>
<dt><span class="syntax">Document</span>
<dd>
<span class="normal">
Excluding requests for HTML page elements such as images and style sheets,
impose a limit on the number of requests per period. When this limit is
exceeded all further requests are refused, until the elapsed time exceeds
the period length, at which point the elapsed time and the
counters are reset. Note that the requests (hits) column of the throttle
status display does not include the requests for page elements.
</span>
</dd>

<br>

<a name="PolicyIdle"></a>
<dt><span class="syntax">Idle</span>
<dd>
<span class="normal">
Impose a mimimum idle time between requests. When the miminum is not
reached, then the request incurs a calculated delay penalty or is
refused.
</span>
<p>
First, whenever the elapsed time exceeds the period length, then the
counters are reset.
</p>
<p>
Second, if the idle time between requests exceeds the minimum, then the
the request proceeds without delay. Otherwise the request is delayed
between one and <a href="#ThrottleMaxDelay">ThrottleMaxDelay</a> seconds.
If the delay would exceed <a href="#ThrottleMaxDelay">ThrottleMaxDelay</a>,
then we refuse the request entirely to avoid occupying servers unnecessarily.
</p>
<p>
The delay is computed as the policy minimum less the idle time between requests.
<p>
</dd>

<a name="PolicyOriginal"></a>
<dt><span class="syntax">Original</span>
<dd>
<span class="normal">
Original mod_throttle 2.0 heuristic.
</span>
<p>
Impose a limit on the volume (kbytes sent) per period, which when exceeded
the request incurs a counter-based delay penalty or is refused.
</p>
<p>
First, whenever the elapsed time exceeds the period length, then the volume
and elapsed time are halved.
</p>
<p>
Second, if the volume is below the limit, then the delay counter is
decreased by one second if it is not yet zero. Otherwise, when the limit
is exeeded, the delay counter is increased by one second. The delay can be
between zero and <a href="#ThrottleMaxDelay">ThrottleMaxDelay</a> seconds, after
which the request will be refused to avoid occupying servers unnecessarily.
</p>
</dd>

<a name="PolicyRandom"></a>
<dt><span class="syntax">Random</span>
<dd>
<span class="normal">
Randomly accept a percentage (limit) of the requests. If the percentage
is zero (0), then every request is refused; if the percentage
is 100, then all requests are accepted. The period specifies how long
data is accumulated before the counters are reset.
</span>
</dd>

<br>

<a name="PolicyRequest"></a>
<dt><span class="syntax">Request</span>
<dd>
<span class="normal">
Impose a limit on the number of requests per period. When this limit is
exceeded all further requests are refused until the elapsed time exceeds
the period length, at which point the elapsed time and counters are reset.
</span>
</dd>

<br>

<a name="PolicySpeed"></a>
<dt><span class="syntax">Speed</span>
<dd>
<span class="normal">
Impose a limit on the volume (kbytes sent) per period, which when exceeded
the request incurs a calculated delay penalty or is refused.
</span>
<p>
First, whenever the elapsed time exceeds the period length, then the limit
(allowance) is deducted from the volume, which cannot be a negative result;
also the period length is deducted from the elapse time.
</p>
<p>
Second, if the volume is below the limit, in which case the request
proceeds without delay. Otherwise the request is delayed between one and
<a href="#ThrottleMaxDelay">ThrottleMaxDelay</a> seconds. If the delay would
exceed <a href="#ThrottleMaxDelay">ThrottleMaxDelay</a>, then we refuse the
request entirely to avoid occupying servers unnecessarily.
</p>
<p>
The delay is computed as one plus the integer result of the
volume times 10 divided by the limit.
</p>
</dd>

<a name="PolicyVolume"></a>
<dt><span class="syntax">Volume</span>
<dd>
<span class="normal">
Impose a limit on the volume (kbytes sent) per period. When this limit is
exceeded all further requests are refused, until the end of the period at
which point the elapsed time and counters are reset.
</span>
</dd>
</dl>
</p>

<a name="Installation"></a>
<h3>Installation</h3>
<ol>
<a name="download"></a>
<li><p>
<a href="mod_throttle312.tgz">Download mod_throttle312.tgz</a>
and unpack the archive. (The previous series
<a href="http://www.snert.com/Software/mod_throttle-2.11/">mod_throttle/2.11</a>
can also be downloaded.)
</p></li>
<li><p>
Depending on your operating system, you must edit the #undef and #define found
at the top of mod_throttle.c source file to specify the semaphore &amp; shared
memory API to use.
</p>
<p>
For the semaphore support you must #define only one of the following and #undef
the rest. If you do not #define one of these, then mod_throttle will operate
without semaphore support, which will have undefined results:
<blockquote>
<pre>
USE_POSIX_SERIALIZATION
USE_FCNTL_SERIALIZATION
USE_FLOCK_SERIALIZATION
USE_SYSTEM_V_SERIALIZATION
</pre>
</blockquote>
</p>
<p>
For the shared memory support you must #define only one of the following and #undef
the rest. If you do not #define one of these, then mod_throttle will operate without
shared memory, which will have undefined results:
<blockquote>
<pre>
USE_POSIX_SHARED_MEMORY
USE_SYSTEM_V_SHARED_MEMORY
</pre>
</blockquote>
</p>
</li>

<li><p>To build as DSO module, just type:
<blockquote>
<pre>
cd (path to)/mod_throttle-3.1
make install
</pre>
</blockquote>
</p>
<p>To build as a static module:
<blockquote>
<pre>
cd /usr/local/apache_1.3.14	(or where ever you keep the Apache source)
./configure \			(see below in the <a href="#Notes">Notes</a> for additional information)
    --disable-shared=throttle \
    --add-module=(path to)/mod_throttle-3.1/mod_throttle.c \
    ... (your other configuration options) ...
make install
</pre>
</blockquote>
</p>
</li>
<a name="HttpdConf"></a>
<li><p>Configure the <code>httpd.conf</code> file. At the very least add following:
<blockquote>
<pre>
&lt;IfModule mod_throttle.c&gt;
	ThrottlePolicy none

	&lt;Location /throttle-status&gt;
	SetHandler throttle-status
	&lt;/Location&gt;

	&lt;Location /throttle-me&gt;
	SetHandler throttle-me
	&lt;/Location&gt;

	&lt;Location /~*/throttle-me&gt;
	SetHandler throttle-me
	&lt;/Location&gt;
&lt;/IfModule&gt;
</pre>
</blockquote>
</p></li>
<li><p>
Restart the server: <code>apachectl stop; apachectl start</code>
</p></li>
<li><p>
View the status display <code>http://www.mydomain.com/throttle-status</code>.
</p></li>
</ol>


<a name="Configuration"></a>
<h3>Configuration</h3>
<p>
The commands below can be added to the general Apache configuration file,
<code>httpd.conf</code>.
</p>

<dl>

<a name="SetHandlerClientIP"></a>
<dt><span class="syntax">SetHandler throttle-client-ip</span></dt>
<dd>Context: server,  &lt;VirtualHost&gt;, &lt;Directory&gt;, &lt;Location&gt;
<p>
Displays the complete list of recently connected client IP addresses.
There are command links to reset all the clients, or reset individual clients.
</p>
<p>
Each row shows a client IP address,
the percentage of the limit reached,
the total number of requests (hits) made by this client,
number of requests refused to the this client,
volume (kbytes sent) per period,
average volume per request,
the current delay,
the elapsed period time,
and the time idle since the last request.
</p>
</dd>

<a name="SetHandlerRemoteUser"></a>
<dt><span class="syntax">SetHandler throttle-remote-user</span></dt>
<dd>Context: server,  &lt;VirtualHost&gt;, &lt;Directory&gt;, &lt;Location&gt;
<p>
Displays the complete list of recently authenticated remote users.
There are command links to reset all or individual remote users.
</p>
<p>
Each row shows the authenticated remote user name,
the percentage of the limit reached,
the total number of requests (hits) made by this remote user,
number of requests refused to the this remote user,
volume (kbytes sent) per period,
average volume per request,
the current delay,
the elapsed period time,
and the time idle since the last request.
</p>
</dd>

<a name="SetHandlerStatus"></a>
<dt><span class="syntax">SetHandler throttle-status</span></dt>
<dd>Context: server,  &lt;VirtualHost&gt;, &lt;Directory&gt;, &lt;Location&gt;
<p>
Displays the complete list of server, virtual hosts, directories, locations, and
local users who are to be throttled. There are command links to reset all or individual
entries, and preserve &amp; restore runtime data.
</p>
<p>
Each row shows the item being throttled,
the percentage of the limit reached,
the total number of requests (hits) received,
number of requests refused,
volume (kbytes sent) per period,
average volume per request,
the current delay,
policy, limit, period,
elapsed period time,
and the time idle since the last request.
</p>
<blockquote>
<span class="deep">
<code>http://my.domain.com/throttle-status</code>
</span>
</blockquote>
</dd>

<a name="SetHandlerMe"></a>
<dt><span class="syntax">SetHandler throttle-me</span></dt>
<dd>Context: server,  &lt;VirtualHost&gt;, &lt;Directory&gt;, &lt;Location&gt;
<p>
Similar to <a href="#SetHandlerStatus">SetHandler throttle-status</a> in content,
except it only displays one individual entry for either a ~user or the
server of which the request was made. The intent of this handler is to provide
the system administrator a means by which customers can monitor their
throttles without seeing those belonging to others.
</p>
<p>
Assuming the handler has been installed as <a href="#HttpdConf">outlined above</a>,
then a URL of the form:
<p>
<blockquote>
<span class="deep">
<code>http://my.domain.com/~user/throttle-me</code>
</span>
</blockquote>
<p>
will display the throttle status for <code>user</code>, if a
ThrottleUser was specified for the user in question; otherwise
a Not Found error page. A URL of the form:
</p>
<blockquote>
<span class="deep">
<code>http://my.domain.com/throttle-me</code>
</span>
</blockquote>
<p>
will display the throttle status of <code>my.domain.com</code>,
if it has a ThrottlePolicy; otherwise a Not Found error page.
</p>
</dd>

<a name="ThrottleClientIP"></a>
<dt><span class="syntax">ThrottleClientIP <span class="param">size policy limit period</span></span></dt>
<dd>Context: server
<p>
Specify the <span class="param">size</span> of the client IP address list and the global policy
to be applied to all incoming connections based on information recorded for a client IP address.
The policy <a href="#PolicyConcurrent">Concurrent</a> is ignored.
</p>
<p>
When the list <span class="param">size</span> is greater than zero, then throttling by
client IP address is enabled (the default is zero). Requests from a client IP address can be
tracked for a short period of time and subject to the policy specified. The period of
time that a client IP address is tracked depends on the size of the client IP address
list, which is ordered most recent request to oldest.  Every time a new client IP address
connects, the oldest entry in the list is lost and reassigned to the new client IP address.
Every time an existing entry makes a request, it is moved to the top of the list.
</p>
</dd>

<a name="ThrottleContentType"></a>
<dt><span class="syntax">ThrottleContentType <span class="param">string</span></span></dt>
<dd>Context: server
<p>
Specifies the default Content-Type to be used for the throttle status
display.  Only two supported types: <span class="syntax">text/html</span>,
<span class="syntax">text/plain</span>.  <span class="syntax">text/html</span> is
a nicely formatted and coloured table.  <span class="syntax">text/plain</span> is
a tab separated list of columns as seen for <span class="syntax">text/html</span>,
without headers and footers. When not specified, the default is
<span class="syntax">text/html</span>. This can be overridden by specifying
the content-type in the URL, for example:
</p>
<blockquote>
	<span class="deep">
	<code>http://my.domain.com/throttle-status?content-type=text/plain</code>
	</span>
</blockquote>
</dd>

<a name="ThrottleIndicator"></a>
<dt><span class="syntax">ThrottleIndicator green <span class="param">percentage</span>
<br>ThrottleIndicator yellow <span class="param">percentage</span>
<br>ThrottleIndicator red <span class="param">percentage</span></span></dt>
<dd>Context: server
<p>
Specify the default thresholds used for the visual warnings by the
throttle status display.  The default indicators are green 50, yellow 75,
and red 90.
</p>
</dd>

<a name="ThrottleLockFile"></a>
<dt><span class="syntax">ThrottleLockFile <span class="param">string</span></span></dt>
<dd>Context: server
<p>The lock file used with fcntl() or flock() serialization. Must be stored on a
local disk.
</p>
</dd>

<a name="ThrottleMaxDelay"></a>
<dt><span class="syntax">ThrottleMaxDelay <span class="param">seconds</span></span></dt>
<dd>Context: server
<p>
This directive affects all policies that use delays.  It imposes an upper limit on
the throttle delay that can be applied by a policy.  The default is 60 seconds.  A
value of zero (0) disables the limit, allowing a delay to be as high as the policy
wants.
</p>
</dd>

<a name="ThrottlePolicy"></a>
<dt><span class="syntax">ThrottlePolicy <span class="param">policy limit period</span></span></dt>
<dd>Context: server,  &lt;VirtualHost&gt;, &lt;Directory&gt;, &lt;Location&gt;
<p>
The <span class="param">policy</span> parameter can be one of the previously above
mentioned policies.
</p>
<p>
The <span class="param">limit</span> is a number followed by an optional suffix K, M, or G
for kilo-bytes, mega-bytes, or giga-bytes respectively.  When no suffix is given the default
is kilo-bytes.
</p>
<p>
The <span class="param">period</span> is a number followed by an optional suffix s, m, h, d, or w
for seconds, minutes, hours, days, or weeks respectively.  When no suffix is given the default
is seconds.
</p>

</dd>

<dt><span class="syntax">ThrottleRefresh <span class="param">seconds</span></span></dt>
<dd>Context: server
<p>
Specifies the refresh time for the throttle status display.  When
not specified, the default is 60 seconds.  This can be overridden by
specifying the refresh time in the URL as well, for example:
</p>
<blockquote>
	<span class="deep">
	<code>http://www.domain.com/throttle-status?refresh=20</code>
	</span>
</blockquote>
</dd>

<a name="ThrottleRemoteUser"></a>
<dt><span class="syntax">ThrottleRemoteUser <span class="param">size policy limit period</span></span></dt>
<dd>Context: server
<p>
Specify the size of the authenticated remote user list and the global policy to be applied
to all requests based on information recorded for an authenticated remote user.
The policy <a href="#PolicyConcurrent">Concurrent</a> is ignored.
</p>
<p>
When the list size is greater than zero, then throttling by authenticated remote user
is enabled (the default is zero). When the web server restricts access to a resource,
authentication is required to be sent by the remote user. The user name supplied for
that authentication is then used to control short term usage by the policy
specified. The period of
time that a remote user can be tracked depends on the size of the remote user
list, which is ordered most recent request to oldest.  Every time a new remote user
connects, the oldest entry in the list is lost and reassigned to the new remote user.
Every time an existing entry makes a request, it is moved to the top of the list.
</p>
</dd>

<dt><span class="syntax">ThrottleRuntimeFile <span class="param">filename</span></span></dt>
<dd>Context: server
<p>
The location and file name of the runtime data file used to preserve state information
across shutdowns &amp; restarts.
</p>
</dd>

<a name="ThrottleUser"></a>
<dt><span class="syntax">ThrottleUser <span class="param">user policy limit period</span></span></dt>
<dd>Context: server
<p>
Each request for files belonging to the given <span class="param">user</span>
name or #ID are throttled according to the selected policy as described above.

If the <span class="param">user</span> is an asterisk (*), then all the users from
the system user databases are throttled with the same policy, limit, and period.

If the <span class="param">user</span> is an absolute path to an htpasswd file,
/etc/passwd, or a file with one user per line, then all the users from that file
are throttled with the same policy, limit, and period. User names with no corresponding
system user ID are ignored.
</p>
</dd>

</dl>

<a name="Notes"></a>
<h3>Notes</h3>

<ul>
<li><p>mod_throttle/3.0 tested on following platforms (please
<a href="mailto:achowe@snert.com?subject=mod_throttle/3.1.2 platform">email me</a>
your platform if you've made it work on something different):

	<br><br>

	<dl>
	<dt><u>FreeBSD 4.1.1, Apache 1.3.14</u></dt>
	<dd>
	<span class="normal">
	The USE_SYSTEM_V_SERIALIZATION, and USE_SYSTEM_V_SHARED_MEMORY code
	was successfully tested on this platform.
	</span>
	<p>
	The USE_POSIX_SERIALIZATION and
	USE_POSIX_SHARED_MEMORY compiles and links (with &amp; without -pthread),
	but fails on sem_init() when execute - help anyone?.
	</p>
	</dd>

	<dt><u>RedHat Linux 5.1+ (MIPS &amp; Intel), Apache 1.3.14</u></dt>
	<dd>
	<span class="normal">
	The USE_FCNTL_SERIALIZATION, USE_FLOCK_SERIALIZATION,
	USE_SYSTEM_V_SERIALIZATION, and USE_SYSTEM_V_SHARED_MEMORY code was
	successfully tested on this platform.
	</span>
	</dd>

	<br><br>

	<dt><u>Solaris 5.7, Apache 1.3.12</u></dt>
	<dd>
	<span class="normal">
	To build as a DSO module, Apache must be built with --enable-rule=SHARED_CORE.
	The USE_POSIX_SERIALIZATION and USE_POSIX_SHARED_MEMORY code was successfully
	tested on this platform, but must be linked with the library "-lrt"; when
	compiling DSO, edit the	Makefile and uncomment the LIB= macro; when compiling
	statically, specify:  LIBS='-lrt' ./configure ...
	</span>
	</dd>
	</dl>
</p></li>
<li><p>The context diff "patch.proxy_util.c" should be applied to
<code>/src/modules/proxy/proxy_util.c</code> from the Apache 1.3.14 distribution.
This patch allows mod_throttle/3.0 to monitor proxy requests when mod_proxy
is in use. (This patch has been submitted to the Apache Server project.)
</p></li>
<li><p>
The policies <a href="#PolicyOriginal">Original</a>, <a href="#PolicySpeed">Speed</a>,
and <a href="#PolicyVolume">Volume</a> all impose limits on volume (kilobytes sent).
The differences lie in how adjustments are made each period and whether to delay
or refuse the conection.
</p></li>
<li><p>
Here is a shell command that can be used for a cron job to restart the Apache server
on a set schedule in order to reload your configuration file.  This assumes that you
do not change the location of the "PidFile" in your configuration and that httpd is on
root's PATH.
<blockquote>
<pre>
kill -USR1 $(cat $(httpd -V | sed -n '/DEFAULT_PIDLOG/s/.*"\(.*\)"/\1/p'))
</pre>
</blockquote>
</p></li>
</ul>

<a name="License"></a>
<h3>License</h3>
<p>
This source distribution is made freely available and there is no charge
for its use, provided you retain this notice, disclaimers, author's
copyright, and credits.
</p>

<a name="Disclaimer"></a>
<h3>Disclaimer</h3>
<p>
THIS SOFTWARE IS PROVIDE "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO WAY SHALL THE
AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.
</p>

<a name="Credits"></a>
<h3>Credits</h3>
<p>
Original design for mod_throttle/1.0 goes to Mark Lovell
&lt;<a href="mailto:mlovell@bigrock.com">mlovell@bigrock.com</a>&gt;.
</p>
<p>
Elements of the critical &amp; shared memory code, as of mod_throttle/3.0,
originally derived from the Apache Web Server source code.
</p>
<p>
Thank You to Lu Vo &lt;<a href="mailto:LVo@SUPERB.NET">LVo@SUPERB.NET</a>&gt;
for providing a Solaris POSIX compliant machine to test on; to Travis Doherty
&lt;<a href="mailto:travis@terradelta.net">travis@terradelta.net</a>&gt;
for a FreeBSD machine for testing and several suggestions; to David M. Shirley
&lt;<a href="mailto:david@webquarry.com">david@webquarry.com</a>&gt; for
constructive and helpful reports concerning design and testing.
</p>

<br>

<p>
<center>
| <a href="#Description">Description</a>
| <a href="#download">Download</a>
| <a href="#Installation">Installation</a>
| <a href="#Configuration">Configuration</a>
| <a href="#Notes">Notes</a>
| <a href="CHANGES.txt">Changes</a>
|<br>
| <a href="#License">License</a>
| <a href="#Disclaimer">Disclaimer</a>
| <a href="#Credits">Credits</a>
|<br>
| <a href="http://www.snert.com/">Welcome</a>
| <a href="http://www.snert.com/Software/">Software</a>
|
</center>
</p>

<!-- COPYRIGHT -->
<p>
<center>
<font size="2"><i>
Copyright 1999, 2000 by
<a href="mailto:achowe@snert.com">Anthony C Howe</a>.
<nobr>All rights reserved.</nobr>
</i></font>
</center>
<!-- END COPYRIGHT -->

<center>
<font size="1">
<!--#include virtual="/WIL/counter.pl/Software/mod_throttle-3.1/version3.cnt" -->
fluffy bunnies since 15 Nov. 2000</font>
</center>

</div>
<!-- END PAGE BODY -->

	</td>
</tr>
</table>

<!-- END MARGINS -->

</body>
</html>