mirror of
https://github.com/Ponce/slackbuilds
synced 2024-11-24 10:02:29 +01:00
network/mod_limitipconn: Added to 12.1 repository
This commit is contained in:
parent
986bdaf558
commit
3b4c071bc7
6 changed files with 503 additions and 0 deletions
69
network/mod_limitipconn/README
Normal file
69
network/mod_limitipconn/README
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
From:
|
||||||
|
http://www.mail-archive.com/dev@httpd.apache.org/msg37189.html
|
||||||
|
|
||||||
|
Hi!
|
||||||
|
|
||||||
|
|
||||||
|
Attached is a version of mod_limitipconn.c that works in conjunction with
|
||||||
|
mod_cache and httpd-2.2. We've been using this on ftp.acc.umu.se for some
|
||||||
|
time now without any unwanted issues.
|
||||||
|
|
||||||
|
The main problem with mod_limitipconn-0.22 was that since mod_cache runs as
|
||||||
|
a quick handler, mod_limitipconn also must run as a quick handler with all
|
||||||
|
those benefits and drawbacks.
|
||||||
|
|
||||||
|
Download the tarball from http://dominia.org/djao/limitipconn2.html , extract
|
||||||
|
it, and replace mod_limitipconn.c with this version and follow the build
|
||||||
|
instructions.
|
||||||
|
|
||||||
|
I would really wish that this was made part of httpd, it's really needed when
|
||||||
|
running a file-download site due to the scarily large amount of demented
|
||||||
|
download manager clients out there.
|
||||||
|
|
||||||
|
However, I have not received any response from the original author on the
|
||||||
|
matter. From what I have understood of the license it should be OK to merge
|
||||||
|
into httpd if you want though, but I think that you guys are way more clued
|
||||||
|
in that matter than me.
|
||||||
|
|
||||||
|
This is a summary of the changes made:
|
||||||
|
* Rewritten to run as a Quick Handler, before mod_cache.
|
||||||
|
* Configuration directives are now set per VHost (Directory/Location
|
||||||
|
are available after the Quick Handler has been run). This means that
|
||||||
|
any <Location> containers has to be deleted in existing configs.
|
||||||
|
* Fixed configuration merging, so per-vhost settings use defaults set
|
||||||
|
at the server level.
|
||||||
|
* By running as a Quick Handler we don't go through the entire lookup
|
||||||
|
phase (resolve path, stat file, etc) before we get the possibility
|
||||||
|
to block a request. This gives a clear performance enhancement.
|
||||||
|
* Made the handler exit as soon as possible, doing the "easy" checks
|
||||||
|
first.
|
||||||
|
* Don't do subrequest to lookup MIME type if we don't have mime-type
|
||||||
|
specific config.
|
||||||
|
* Count connections in closing and logging state too, we don't want to
|
||||||
|
be DOS'd by clients behind buggy firewalls and so on.
|
||||||
|
* Added debug messages for easy debugging.
|
||||||
|
* Reduced loglevel from ERR to INFO for reject-logging.
|
||||||
|
|
||||||
|
In any case, I hope that this can be of use for others than us.
|
||||||
|
|
||||||
|
|
||||||
|
/Nikke
|
||||||
|
--
|
||||||
|
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||||
|
Niklas Edmundsson, Admin @ {acc,hpc2n}.umu.se | [EMAIL PROTECTED]
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
We are AT&T of Borg, MCI will be assimilated
|
||||||
|
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||||
|
|
||||||
|
(FWIW: copied without explicit permission)
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
The module can be loaded with the following in /etc/httpd/httpd.conf
|
||||||
|
|
||||||
|
LoadModule limitipconn_module lib/httpd/modules/mod_limitipconn.so
|
||||||
|
ExtendedStatus On
|
||||||
|
MaxConnPerIP 5
|
||||||
|
|
||||||
|
To test the 'test.pl' utility from mod_evasive is included in the doc dir.
|
||||||
|
|
69
network/mod_limitipconn/mod_limitipconn.SlackBuild
Normal file
69
network/mod_limitipconn/mod_limitipconn.SlackBuild
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Slackware build script for mod_limitipconn (an Apache limit module)
|
||||||
|
|
||||||
|
# Written by Menno E. Duursma
|
||||||
|
|
||||||
|
# This program is free software. It comes without any warranty.
|
||||||
|
# Granted WTFPL, Version 2, as published by Sam Hocevar. See
|
||||||
|
# http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
|
||||||
|
# Modified by SlackBuilds.org
|
||||||
|
|
||||||
|
PRGNAM=mod_limitipconn
|
||||||
|
VERSION=${VERSION:-0.22}
|
||||||
|
ARCH=${ARCH:-i486}
|
||||||
|
BUILD=${BUILD:-1}
|
||||||
|
TAG=${TAG:-_SBo}
|
||||||
|
|
||||||
|
CWD=`pwd`
|
||||||
|
TMP=${TMP:-/tmp/SBo}
|
||||||
|
PKG=$TMP/package-$PRGNAM
|
||||||
|
OUTPUT=${OUTPUT:-/tmp}
|
||||||
|
|
||||||
|
if [ "$ARCH" = "i486" ]; then
|
||||||
|
SLKCFLAGS="-O2 -march=i486 -mtune=i686"
|
||||||
|
elif [ "$ARCH" = "i686" ]; then
|
||||||
|
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
|
||||||
|
elif [ "$ARCH" = "x86_64" ]; then
|
||||||
|
SLKCFLAGS="-O2 -fPIC"
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -e # exit on most errors
|
||||||
|
|
||||||
|
rm -rf $PKG
|
||||||
|
mkdir -p $TMP $PKG $OUTPUT
|
||||||
|
cd $TMP
|
||||||
|
rm -rf $PRGNAM-$VERSION
|
||||||
|
tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
|
||||||
|
cd $PRGNAM-$VERSION
|
||||||
|
chown -R root:root .
|
||||||
|
chmod -R a-s,u+w,go+r-w .
|
||||||
|
|
||||||
|
# This is patched for Apache v2.2 support so much we might as well replace it
|
||||||
|
cat $CWD/mod_limitipconn.c > mod_limitipconn.c
|
||||||
|
|
||||||
|
# Create target directory
|
||||||
|
mkdir -p $PKG/usr/lib/httpd/modules
|
||||||
|
|
||||||
|
# Compile module as DSO (dynmically shared object)
|
||||||
|
CFLAGS="$SLACKFLAGS" \
|
||||||
|
apxs -ca mod_limitipconn.c
|
||||||
|
|
||||||
|
# copy into place
|
||||||
|
cp -v .libs/mod_limitipconn.so $PKG/usr/lib/httpd/modules
|
||||||
|
|
||||||
|
( cd $PKG || exit 1
|
||||||
|
find . -type f | xargs file | grep -e "executable" -e "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
|
||||||
|
)
|
||||||
|
|
||||||
|
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
|
||||||
|
cp -a ChangeLog INSTALL README $PKG/usr/doc/$PRGNAM-$VERSION
|
||||||
|
cat $CWD/test.pl > $PKG/usr/doc/$PRGNAM-$VERSION/test.pl
|
||||||
|
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
|
||||||
|
|
||||||
|
mkdir -p $PKG/install
|
||||||
|
cat $CWD/slack-desc > $PKG/install/slack-desc
|
||||||
|
|
||||||
|
cd $PKG
|
||||||
|
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.tgz
|
320
network/mod_limitipconn/mod_limitipconn.c
Normal file
320
network/mod_limitipconn/mod_limitipconn.c
Normal file
|
@ -0,0 +1,320 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2000-2002 David Jao <[EMAIL PROTECTED]>
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person
|
||||||
|
* obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without
|
||||||
|
* restriction, including without limitation the rights to use, copy,
|
||||||
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
* of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice, this permission notice, and the
|
||||||
|
* following disclaimer shall be included in all copies or substantial
|
||||||
|
* portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
* DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "httpd.h"
|
||||||
|
#include "http_config.h"
|
||||||
|
#include "http_request.h"
|
||||||
|
#include "http_protocol.h"
|
||||||
|
#include "http_core.h"
|
||||||
|
#include "http_main.h"
|
||||||
|
#include "http_log.h"
|
||||||
|
#include "ap_mpm.h"
|
||||||
|
#include "apr_strings.h"
|
||||||
|
#include "scoreboard.h"
|
||||||
|
|
||||||
|
#define MODULE_NAME "mod_limitipconn"
|
||||||
|
#define MODULE_VERSION "0.22"
|
||||||
|
|
||||||
|
module AP_MODULE_DECLARE_DATA limitipconn_module;
|
||||||
|
|
||||||
|
static int server_limit, thread_limit;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
signed int limit; /* max number of connections per IP */
|
||||||
|
|
||||||
|
/* array of MIME types exempt from limit checking */
|
||||||
|
apr_array_header_t *no_limit;
|
||||||
|
int no_limit_set;
|
||||||
|
|
||||||
|
/* array of MIME types to limit check; all other types are exempt */
|
||||||
|
apr_array_header_t *excl_limit;
|
||||||
|
int excl_limit_set;
|
||||||
|
} limitipconn_config;
|
||||||
|
|
||||||
|
static void *limitipconn_create_config(apr_pool_t *p, server_rec *s)
|
||||||
|
{
|
||||||
|
limitipconn_config *cfg = (limitipconn_config *)
|
||||||
|
apr_pcalloc(p, sizeof (*cfg));
|
||||||
|
|
||||||
|
/* default configuration: no limit (unset), and both arrays are empty */
|
||||||
|
cfg->limit = -1;
|
||||||
|
cfg->no_limit = apr_array_make(p, 0, sizeof(char *));
|
||||||
|
cfg->excl_limit = apr_array_make(p, 0, sizeof(char *));
|
||||||
|
|
||||||
|
return cfg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Simple merge: Per vhost entries overrides main server entries */
|
||||||
|
static void *limitipconn_merge_config(apr_pool_t *p, void *BASE, void *ADD)
|
||||||
|
{
|
||||||
|
limitipconn_config *base = BASE;
|
||||||
|
limitipconn_config *add = ADD;
|
||||||
|
|
||||||
|
limitipconn_config *cfg = (limitipconn_config *)
|
||||||
|
apr_pcalloc(p, sizeof (*cfg));
|
||||||
|
|
||||||
|
cfg->limit = (add->limit == -1) ? base->limit : add->limit;
|
||||||
|
cfg->no_limit = add->no_limit_set ? add->no_limit : base->no_limit;
|
||||||
|
cfg->excl_limit = add->excl_limit_set ? add->excl_limit : base->excl_limit;
|
||||||
|
|
||||||
|
return cfg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The handler runs as a quick handler so we can arrange for it to be called
|
||||||
|
before mod_cache. Being a quick handler means that we have a lot of
|
||||||
|
limitations, the basic ones are that the only thing we know is the URL and
|
||||||
|
that if we return OK it means that we handle the entire reply of the
|
||||||
|
request including populating the brigades with data. */
|
||||||
|
static int limitipconn_handler(request_rec *r, int lookup)
|
||||||
|
{
|
||||||
|
/* get configuration information */
|
||||||
|
limitipconn_config *cfg = (limitipconn_config *)
|
||||||
|
ap_get_module_config(r->server->module_config, &limitipconn_module);
|
||||||
|
|
||||||
|
/* convert Apache arrays to normal C arrays */
|
||||||
|
char **nolim = (char **) cfg->no_limit->elts;
|
||||||
|
char **exlim = (char **) cfg->excl_limit->elts;
|
||||||
|
|
||||||
|
const char *address;
|
||||||
|
|
||||||
|
/* loop index variables */
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
/* running count of number of connections from this address */
|
||||||
|
int ip_count = 0;
|
||||||
|
|
||||||
|
/* Content-type of the current request */
|
||||||
|
const char *content_type;
|
||||||
|
|
||||||
|
/* scoreboard data structure */
|
||||||
|
worker_score *ws_record;
|
||||||
|
|
||||||
|
/* We decline to handle subrequests: otherwise, in the next step we
|
||||||
|
* could get into an infinite loop. */
|
||||||
|
if (!ap_is_initial_req(r)) {
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
|
||||||
|
"mod_limitipconn: SKIPPED: Not initial request");
|
||||||
|
return DECLINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A limit value of 0 by convention means no limit, negative means
|
||||||
|
unset (no limit). */
|
||||||
|
if (cfg->limit <= 0) {
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
|
||||||
|
"mod_limitipconn: OK: No limit");
|
||||||
|
return DECLINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef RECORD_FORWARD
|
||||||
|
if ((address = apr_table_get(r->headers_in, "X-Forwarded-For")) == NULL)
|
||||||
|
#endif
|
||||||
|
address = r->connection->remote_ip;
|
||||||
|
|
||||||
|
/* Only check the MIME-type if we have MIME-type stuff in our config.
|
||||||
|
That extra subreq can be quite expensive. */
|
||||||
|
if(cfg->no_limit->nelts > 0 || cfg->excl_limit->nelts > 0) {
|
||||||
|
/* Look up the Content-type of this request. We need a subrequest
|
||||||
|
* here since this module might be called before the URI has been
|
||||||
|
* translated into a MIME type. */
|
||||||
|
content_type = ap_sub_req_lookup_uri(r->uri, r, NULL)->content_type;
|
||||||
|
|
||||||
|
/* If there's no Content-type, use the default. */
|
||||||
|
if (!content_type) {
|
||||||
|
content_type = ap_default_type(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
|
||||||
|
"mod_limitipconn: uri: %s Content-Type: %s",
|
||||||
|
r->uri, content_type);
|
||||||
|
|
||||||
|
/* Cycle through the exempt list; if our content_type is exempt,
|
||||||
|
* return OK */
|
||||||
|
for (i = 0; i < cfg->no_limit->nelts; i++) {
|
||||||
|
if ((ap_strcasecmp_match(content_type, nolim[i]) == 0)
|
||||||
|
|| (strncmp(nolim[i], content_type, strlen(nolim[i])) == 0))
|
||||||
|
{
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
|
||||||
|
"mod_limitipconn: OK: %s exempt", content_type);
|
||||||
|
return DECLINED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cycle through the exclusive list, if it exists; if our MIME type
|
||||||
|
* is not present, bail out */
|
||||||
|
if (cfg->excl_limit->nelts) {
|
||||||
|
int excused = 1;
|
||||||
|
for (i = 0; i < cfg->excl_limit->nelts; i++) {
|
||||||
|
if ((ap_strcasecmp_match(content_type, exlim[i]) == 0)
|
||||||
|
||
|
||||||
|
(strncmp(exlim[i], content_type, strlen(exlim[i])) == 0))
|
||||||
|
{
|
||||||
|
excused = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (excused) {
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
|
||||||
|
"mod_limitipconn: OK: %s not excluded",
|
||||||
|
content_type);
|
||||||
|
return DECLINED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Count up the number of connections we are handling right now from
|
||||||
|
* this IP address */
|
||||||
|
for (i = 0; i < server_limit; ++i) {
|
||||||
|
for (j = 0; j < thread_limit; ++j) {
|
||||||
|
ws_record = ap_get_scoreboard_worker(i, j);
|
||||||
|
switch (ws_record->status) {
|
||||||
|
case SERVER_BUSY_READ:
|
||||||
|
case SERVER_BUSY_WRITE:
|
||||||
|
case SERVER_BUSY_KEEPALIVE:
|
||||||
|
case SERVER_BUSY_LOG:
|
||||||
|
case SERVER_BUSY_DNS:
|
||||||
|
case SERVER_CLOSING:
|
||||||
|
case SERVER_GRACEFUL:
|
||||||
|
if ((strcmp(address, ws_record->client) == 0)
|
||||||
|
#ifdef RECORD_FORWARD
|
||||||
|
|| (strcmp(address, ws_record->fwdclient) == 0)
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
ip_count++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
|
||||||
|
"mod_limitipconn: vhost: %s uri: %s current: %d limit: %d",
|
||||||
|
r->server->server_hostname, r->uri, ip_count, cfg->limit);
|
||||||
|
|
||||||
|
if (ip_count > cfg->limit) {
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
|
||||||
|
"Rejected, too many connections from this host.");
|
||||||
|
/* set an environment variable */
|
||||||
|
apr_table_setn(r->subprocess_env, "LIMITIP", "1");
|
||||||
|
/* return 503 */
|
||||||
|
return HTTP_SERVICE_UNAVAILABLE;
|
||||||
|
} else {
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
|
||||||
|
"mod_limitipconn: OK: Passed all checks");
|
||||||
|
return DECLINED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the MaxConnPerIP directive */
|
||||||
|
static const char *limit_config_cmd(cmd_parms *parms, void *dummy,
|
||||||
|
const char *arg)
|
||||||
|
{
|
||||||
|
limitipconn_config *cfg = (limitipconn_config *)
|
||||||
|
ap_get_module_config(parms->server->module_config,
|
||||||
|
&limitipconn_module);
|
||||||
|
|
||||||
|
signed long int limit = strtol(arg, (char **) NULL, 10);
|
||||||
|
|
||||||
|
/* No reasonable person would want more than 2^16. Better would be
|
||||||
|
to use LONG_MAX but that causes portability problems on win32 */
|
||||||
|
if ((limit > 65535) || (limit < 0)) {
|
||||||
|
return "Integer overflow or invalid number";
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg->limit = limit;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the NoIPLimit directive */
|
||||||
|
static const char *no_limit_config_cmd(cmd_parms *parms, void *dummy,
|
||||||
|
const char *arg)
|
||||||
|
{
|
||||||
|
limitipconn_config *cfg = (limitipconn_config *)
|
||||||
|
ap_get_module_config(parms->server->module_config,
|
||||||
|
&limitipconn_module);
|
||||||
|
|
||||||
|
*(char **) apr_array_push(cfg->no_limit) = apr_pstrdup(parms->pool, arg);
|
||||||
|
cfg->no_limit_set = 1;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the OnlyIPLimit directive */
|
||||||
|
static const char *excl_limit_config_cmd(cmd_parms *parms, void *dummy,
|
||||||
|
const char *arg)
|
||||||
|
{
|
||||||
|
limitipconn_config *cfg = (limitipconn_config *)
|
||||||
|
ap_get_module_config(parms->server->module_config,
|
||||||
|
&limitipconn_module);
|
||||||
|
|
||||||
|
*(char **) apr_array_push(cfg->excl_limit) = apr_pstrdup(parms->pool, arg);
|
||||||
|
cfg->excl_limit_set = 1;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Array describing structure of configuration directives */
|
||||||
|
static command_rec limitipconn_cmds[] = {
|
||||||
|
AP_INIT_TAKE1("MaxConnPerIP", limit_config_cmd, NULL, RSRC_CONF,
|
||||||
|
"maximum simultaneous connections per IP address"),
|
||||||
|
AP_INIT_ITERATE("NoIPLimit", no_limit_config_cmd, NULL, RSRC_CONF,
|
||||||
|
"MIME types for which limit checking is disabled"),
|
||||||
|
AP_INIT_ITERATE("OnlyIPLimit", excl_limit_config_cmd, NULL, RSRC_CONF,
|
||||||
|
"restrict limit checking to these MIME types only"),
|
||||||
|
{NULL},
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Set up startup-time initialization */
|
||||||
|
static int limitipconn_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp,
|
||||||
|
server_rec *s)
|
||||||
|
{
|
||||||
|
ap_log_error(APLOG_MARK, APLOG_INFO, 0, s,
|
||||||
|
MODULE_NAME " " MODULE_VERSION " started.");
|
||||||
|
ap_mpm_query(AP_MPMQ_HARD_LIMIT_THREADS, &thread_limit);
|
||||||
|
ap_mpm_query(AP_MPMQ_HARD_LIMIT_DAEMONS, &server_limit);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void register_hooks(apr_pool_t *p)
|
||||||
|
{
|
||||||
|
static const char * const after_me[] = { "mod_cache.c", NULL };
|
||||||
|
|
||||||
|
/* We must run as a quick handle so we can deny connections before
|
||||||
|
mod_cache gets to serve them */
|
||||||
|
ap_hook_quick_handler(limitipconn_handler, NULL, after_me, APR_HOOK_FIRST);
|
||||||
|
|
||||||
|
ap_hook_post_config(limitipconn_init, NULL, NULL, APR_HOOK_MIDDLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
module AP_MODULE_DECLARE_DATA limitipconn_module = {
|
||||||
|
STANDARD20_MODULE_STUFF,
|
||||||
|
NULL, /* create per-dir config structures */
|
||||||
|
NULL, /* merge per-dir config structures */
|
||||||
|
limitipconn_create_config, /* create per-server config structures */
|
||||||
|
limitipconn_merge_config, /* merge per-server config structures */
|
||||||
|
limitipconn_cmds, /* table of config file commands */
|
||||||
|
register_hooks
|
||||||
|
};
|
||||||
|
|
8
network/mod_limitipconn/mod_limitipconn.info
Normal file
8
network/mod_limitipconn/mod_limitipconn.info
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
PRGNAM="mod_limitipconn"
|
||||||
|
VERSION="0.22"
|
||||||
|
HOMEPAGE="http://dominia.org/djao/limitipconn2.html"
|
||||||
|
DOWNLOAD="http://dominia.org/djao/limit/mod_limitipconn-0.22.tar.gz"
|
||||||
|
MD5SUM="0f4beb9eb4e7b815ca472ccfe11451b3"
|
||||||
|
MAINTAINER="Menno E. Duursma"
|
||||||
|
EMAIL="druiloor@zonnet.nl"
|
||||||
|
APPROVED="Erik Hanson"
|
19
network/mod_limitipconn/slack-desc
Normal file
19
network/mod_limitipconn/slack-desc
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# HOW TO EDIT THIS FILE:
|
||||||
|
# The "handy ruler" below makes it easier to edit a package description. Line
|
||||||
|
# up the first '|' above the ':' following the base package name, and the '|'
|
||||||
|
# on the right side marks the last column you can put a character in. You must
|
||||||
|
# make exactly 11 lines for the formatting to be correct. It's also
|
||||||
|
# customary to leave one space after the ':'.
|
||||||
|
|
||||||
|
|-----handy-ruler------------------------------------------------------|
|
||||||
|
mod_limitipconn: mod_limitipconn (an Apache connection limit module)
|
||||||
|
mod_limitipconn:
|
||||||
|
mod_limitipconn: This module allows web server administrators to limit the
|
||||||
|
mod_limitipconn: number of simultaneous downloads permitted from a single
|
||||||
|
mod_limitipconn: IP address.
|
||||||
|
mod_limitipconn:
|
||||||
|
mod_limitipconn: mod_limitipconn was written by David Jao
|
||||||
|
mod_limitipconn: The Apache 2.2 port by Niklas Edmundsson
|
||||||
|
mod_limitipconn:
|
||||||
|
mod_limitipconn:
|
||||||
|
mod_limitipconn:
|
18
network/mod_limitipconn/test.pl
Normal file
18
network/mod_limitipconn/test.pl
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# test.pl: small script to test mod_dosevasive's effectiveness
|
||||||
|
|
||||||
|
use IO::Socket;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
for(0..100) {
|
||||||
|
my($response);
|
||||||
|
my($SOCKET) = new IO::Socket::INET( Proto => "tcp",
|
||||||
|
PeerAddr=> "127.0.0.1:80");
|
||||||
|
if (! defined $SOCKET) { die $!; }
|
||||||
|
print $SOCKET "GET /?$_ HTTP/1.0\n\n";
|
||||||
|
$response = <$SOCKET>;
|
||||||
|
print $response;
|
||||||
|
close($SOCKET);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue