---- oh...@cox.net wrote: 
> 
> ---- oh...@cox.net wrote: 
> > 
> > ---- oh...@cox.net wrote: 
> > > Hi,
> > > 
> > > I'm not sure if this is the appropriate list, or if I should post on the 
> > > regular httpd list...
> > > 
> > > I've been trying to work with an Apache module, mod_limitipconn:
> > > 
> > > http://dominia.org/djao/limitipconn2.html
> > > 
> > > This is with Apache 2.2.8/2.2.11.
> > > 
> > > Our use case is slightly different that the original one for this module. 
> > >  The original code is designed to limit the number of connections from 
> > > any given IP address, whereas in my case, we want to limit the total 
> > > number of connections to the entire Apache server instance.
> > > 
> > > To do that, I commented out one line (an 'if'), as shown below:
> > > 
> > >     /* Count up the number of connections we are handling right now from
> > >      * this IP address */
> > >     /* This is modified to not do strcmp(address, ws_record->client 
> > > check, in order
> > >        to count ALL connections to this server. */
> > >     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)
> > > */
> > >                     ip_count++;
> > >                 break;
> > >             default:
> > >                 break;
> > >         }
> > >       }
> > >     }
> > > 
> > > and, after I rebuilt the module, it seems to work ok.
> > > 
> > > Now, I'm trying to get the module's directive "NoIPLimit" to work.  
> > > 
> > > According to the README, plus reading the code, the way that this is 
> > > suppose to work is that if you specify a MIME type string (substring, 
> > > actually), the module won't "count" requests that have any of the MIME 
> > > types in the directive.
> > > 
> > > I have the Apache LogLevel set to debug, and it looks like the 
> > > "content_type" that the module is retrieving from ALL requests is 
> > > "text/plain", and I have confirmed that the actual MIME types are not 
> > > "text/plain" (I see things like "image/gif", "text/css", etc.), so the 
> > > "NoIPLimit" directive doesn't work.
> > > 
> > > From reading the code, I think that the "content_type" is set in this 
> > > snippet:
> > > 
> > >     /* Only check the MIME-type if we have MIME-type stuff in our config.
> > >        The 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;
> > >             }
> > >         }
> > > 
> > > and, in particular:
> > > 
> > >         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);
> > >         }
> > > 
> > > I'm not that familiar with Apache module development, but reading the 
> > > docs, it *seems* like the above *should* work.
> > > 
> > > I'm assuming you all on this list *are* familiar with module development, 
> > > so I was wondering if you might be able to tell me what, if anything, is 
> > > wrong with that code (i.e., why is "content_type" not being set with the 
> > > actual content type?
> > > 
> > > Thanks in advance!!
> > > 
> > > Jim
> > 
> > Hi,
> > 
> > BTW, here's an example of the Apache debug output for mod_limitipconn that 
> > illustrates what I'm seeing:
> > 
> > [Sun Nov 15 02:21:09 2009] [debug] mod_limitipconn.c(143): [client 
> > 192.168.xx.yy] mod_limitipconn: uri: /anewwsclient/css/body.css  
> > Content-Type: text/plain, referer: http://foo.host.com/anewwsclient
> > 
> > As you can see, the URI is for a .css, but the Content-Type comes back as 
> > "text/plain, referer: http://foo.host.com/anewwsclient";, then, since the 
> > mod_limitipconn code checks for the MIME types in the NoIPLimit directive, 
> > (e.g., image/* text/css/*), it fails to detect this as a MIME type that it 
> > should ignore.
> > 
> > Shouldn't the Content-Type be something like "text/css, referer: 
> > http://foo.host.com/anewwsclient";?
> > 
> > Jim
> > 
> 
> 
> Hi,
> 
> I just noticed that when I run "apachectl -M", I get:
> 
> bash-3.00# ./apachectl -M
> Loaded Modules:
>  core_module (static)
>  authn_file_module (static)
>  authn_default_module (static)
>  authz_host_module (static)
>  authz_groupfile_module (static)
>  authz_user_module (static)
>  authz_default_module (static)
>  auth_basic_module (static)
>  include_module (static)
>  filter_module (static)
>  log_config_module (static)
>  env_module (static)
>  setenvif_module (static)
>  ssl_module (static)
>  mpm_prefork_module (static)
>  http_module (static)
>  mime_module (static)
>  status_module (static)
>  autoindex_module (static)
>  asis_module (static)
>  cgi_module (static)
>  negotiation_module (static)
>  dir_module (static)
>  actions_module (static)
>  userdir_module (static)
>  alias_module (static)
>  so_module (static)
>  limitipconn_module (shared)
> Syntax OK
> 
> Notice that the static modules apparently are listed before the shared 
> module.  I'm assuming that this list is in module, order, so it seems like 
> the limitipconn module is "first".
> 
> I'm wondering if *this* might be my problem, i.e., since the mod_limitipconn 
> is first, and the mod_mime (which maps the suffix to mime type) is "after" 
> the mod_limitipconn, if that might be why mod_limitipconn is apparently not 
> able to determine the correct MIME type?
> 
> Jim
> 

Hi,

To try to test the "precedence" theory, I built a new Apache 2.2.14, with all 
shared module.  I then built a new copy of mod_limitipconn.so.

Now, here's the weird thing :(...

When I run this new Apache with the new mod_limitipconn.so, and check in the 
error_log file, it is now SHOWING the PROPER Content-Type!!

Here's the 'apachectl -M'  and '-V' from this new build:

[r...@fed9 htdocs]# ../bin/apachectl -M
Loaded Modules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 authn_file_module (shared)
 authn_dbm_module (shared)
 authn_anon_module (shared)
 authn_dbd_module (shared)
 authn_default_module (shared)
 authz_host_module (shared)
 authz_groupfile_module (shared)
 authz_user_module (shared)
 authz_dbm_module (shared)
 authz_owner_module (shared)
 authz_default_module (shared)
 auth_basic_module (shared)
 auth_digest_module (shared)
 dbd_module (shared)
 dumpio_module (shared)
 ext_filter_module (shared)
 include_module (shared)
 filter_module (shared)
 substitute_module (shared)
 deflate_module (shared)
 log_config_module (shared)
 log_forensic_module (shared)
 logio_module (shared)
 env_module (shared)
 mime_magic_module (shared)
 cern_meta_module (shared)
 expires_module (shared)
 headers_module (shared)
 ident_module (shared)
 usertrack_module (shared)
 unique_id_module (shared)
 setenvif_module (shared)
 version_module (shared)
 mime_module (shared)
 dav_module (shared)
 status_module (shared)
 autoindex_module (shared)
 asis_module (shared)
 info_module (shared)
 cgi_module (shared)
 dav_fs_module (shared)
 vhost_alias_module (shared)
 negotiation_module (shared)
 dir_module (shared)
 imagemap_module (shared)
 actions_module (shared)
 speling_module (shared)
 userdir_module (shared)
 alias_module (shared)
 rewrite_module (shared)
 limitipconn_module (shared)
Syntax OK
[r...@fed9 htdocs]# ../bin/apachectl -V
Server version: Apache/2.2.14 (Unix)
Server built:   Nov 14 2009 18:20:52
Server's Module Magic Number: 20051115:23
Server loaded:  APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture:   32-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/apps/httpd-2.2.14"
 -D SUEXEC_BIN="/apps/httpd-2.2.14/bin/suexec"
 -D DEFAULT_PIDLOG="logs/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="logs/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"
[r...@fed9 htdocs]#

The above looks similar to the Apache that doesn't work.  The main thing is the 
old Apache had all modules except for mod_limitipconnn.so as "static", whereas 
the new Apache has all modules as "shared", and the old Apache was on 64-bit 
Redhat, whereas the new Apache is on 32-bit Fedora 9.

Anyone have any ideas about what might be causing the missing Content-Type on 
the old Apache?

Thanks,
Jim


Reply via email to