You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by mi...@apache.org on 2011/12/02 23:42:39 UTC

svn commit: r1209754 - in /httpd/httpd/trunk/modules/proxy: ./ balancers/

Author: minfrin
Date: Fri Dec  2 22:42:39 2011
New Revision: 1209754

URL: http://svn.apache.org/viewvc?rev=1209754&view=rev
Log:
mod_proxy: Make ap_proxy_retry_worker() into an optional function. Allows
mod_lbmethod_bybusyness, mod_lbmethod_byrequests, mod_lbmethod_bytraffic
and mod_lbmethod_heartbeat to be loaded without mod_proxy yet being present,
which happens when modules are loaded in alphabetical order.

Added:
    httpd/httpd/trunk/modules/proxy/proxy_util.h
Modified:
    httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_bybusyness.c
    httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_byrequests.c
    httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_bytraffic.c
    httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_heartbeat.c
    httpd/httpd/trunk/modules/proxy/mod_proxy.c
    httpd/httpd/trunk/modules/proxy/mod_proxy.h
    httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c
    httpd/httpd/trunk/modules/proxy/proxy_util.c

Modified: httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_bybusyness.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_bybusyness.c?rev=1209754&r1=1209753&r2=1209754&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_bybusyness.c (original)
+++ httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_bybusyness.c Fri Dec  2 22:42:39 2011
@@ -22,6 +22,9 @@
 
 module AP_MODULE_DECLARE_DATA lbmethod_bybusyness_module;
 
+static int (*ap_proxy_retry_worker_fn)(const char *proxy_function,
+        proxy_worker *worker, server_rec *s) = NULL;
+
 static proxy_worker *find_best_bybusyness(proxy_balancer *balancer,
                                 request_rec *r)
 {
@@ -36,6 +39,15 @@ static proxy_worker *find_best_bybusynes
 
     int total_factor = 0;
 
+    if (!ap_proxy_retry_worker_fn) {
+        ap_proxy_retry_worker_fn =
+                APR_RETRIEVE_OPTIONAL_FN(ap_proxy_retry_worker);
+        if (!ap_proxy_retry_worker_fn) {
+            /* can only happen if mod_proxy isn't loaded */
+            return NULL;
+        }
+    }
+
     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
                  "proxy: Entering bybusyness for BALANCER (%s)",
                  balancer->s->name);
@@ -66,8 +78,9 @@ static proxy_worker *find_best_bybusynes
                  * The worker might still be unusable, but we try
                  * anyway.
                  */
-                if (!PROXY_WORKER_IS_USABLE(*worker))
-                    ap_proxy_retry_worker("BALANCER", *worker, r->server);
+                if (!PROXY_WORKER_IS_USABLE(*worker)) {
+                    ap_proxy_retry_worker_fn("BALANCER", *worker, r->server);
+                }
 
                 /* Take into calculation only the workers that are
                  * not in error state or not disabled.

Modified: httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_byrequests.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_byrequests.c?rev=1209754&r1=1209753&r2=1209754&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_byrequests.c (original)
+++ httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_byrequests.c Fri Dec  2 22:42:39 2011
@@ -22,6 +22,9 @@
 
 module AP_MODULE_DECLARE_DATA lbmethod_byrequests_module;
 
+static int (*ap_proxy_retry_worker_fn)(const char *proxy_function,
+        proxy_worker *worker, server_rec *s) = NULL;
+
 /*
  * The idea behind the find_best_byrequests scheduler is the following:
  *
@@ -80,6 +83,15 @@ static proxy_worker *find_best_byrequest
     int checking_standby;
     int checked_standby;
 
+    if (!ap_proxy_retry_worker_fn) {
+        ap_proxy_retry_worker_fn =
+                APR_RETRIEVE_OPTIONAL_FN(ap_proxy_retry_worker);
+        if (!ap_proxy_retry_worker_fn) {
+            /* can only happen if mod_proxy isn't loaded */
+            return NULL;
+        }
+    }
+
     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
                  "proxy: Entering byrequests for BALANCER (%s)",
                  balancer->s->name);
@@ -109,7 +121,7 @@ static proxy_worker *find_best_byrequest
                  * anyway.
                  */
                 if (!PROXY_WORKER_IS_USABLE(*worker))
-                    ap_proxy_retry_worker("BALANCER", *worker, r->server);
+                    ap_proxy_retry_worker_fn("BALANCER", *worker, r->server);
                 /* Take into calculation only the workers that are
                  * not in error state or not disabled.
                  */

Modified: httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_bytraffic.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_bytraffic.c?rev=1209754&r1=1209753&r2=1209754&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_bytraffic.c (original)
+++ httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_bytraffic.c Fri Dec  2 22:42:39 2011
@@ -22,6 +22,9 @@
 
 module AP_MODULE_DECLARE_DATA lbmethod_bytraffic_module;
 
+static int (*ap_proxy_retry_worker_fn)(const char *proxy_function,
+        proxy_worker *worker, server_rec *s) = NULL;
+
 /*
  * The idea behind the find_best_bytraffic scheduler is the following:
  *
@@ -52,6 +55,15 @@ static proxy_worker *find_best_bytraffic
     int checking_standby;
     int checked_standby;
 
+    if (!ap_proxy_retry_worker_fn) {
+        ap_proxy_retry_worker_fn =
+                APR_RETRIEVE_OPTIONAL_FN(ap_proxy_retry_worker);
+        if (!ap_proxy_retry_worker_fn) {
+            /* can only happen if mod_proxy isn't loaded */
+            return NULL;
+        }
+    }
+
     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
                  "proxy: Entering bytraffic for BALANCER (%s)",
                  balancer->s->name);
@@ -81,7 +93,7 @@ static proxy_worker *find_best_bytraffic
                  * anyway.
                  */
                 if (!PROXY_WORKER_IS_USABLE(*worker))
-                    ap_proxy_retry_worker("BALANCER", *worker, r->server);
+                    ap_proxy_retry_worker_fn("BALANCER", *worker, r->server);
                 /* Take into calculation only the workers that are
                  * not in error state or not disabled.
                  */

Modified: httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_heartbeat.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_heartbeat.c?rev=1209754&r1=1209753&r2=1209754&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_heartbeat.c (original)
+++ httpd/httpd/trunk/modules/proxy/balancers/mod_lbmethod_heartbeat.c Fri Dec  2 22:42:39 2011
@@ -31,6 +31,9 @@
 
 module AP_MODULE_DECLARE_DATA lbmethod_heartbeat_module;
 
+static int (*ap_proxy_retry_worker_fn)(const char *proxy_function,
+        proxy_worker *worker, server_rec *s) = NULL;
+
 static const ap_slotmem_provider_t *storage = NULL;
 static ap_slotmem_instance_t *hm_serversmem = NULL;
 
@@ -270,6 +273,15 @@ static proxy_worker *find_best_hb(proxy_
         ap_get_module_config(r->server->module_config,
                              &lbmethod_heartbeat_module);
 
+    if (!ap_proxy_retry_worker_fn) {
+        ap_proxy_retry_worker_fn =
+                APR_RETRIEVE_OPTIONAL_FN(ap_proxy_retry_worker);
+        if (!ap_proxy_retry_worker_fn) {
+            /* can only happen if mod_proxy isn't loaded */
+            return NULL;
+        }
+    }
+
     apr_pool_create(&tpool, r->pool);
 
     servers = apr_hash_make(tpool);
@@ -297,7 +309,7 @@ static proxy_worker *find_best_hb(proxy_
         }
 
         if (!PROXY_WORKER_IS_USABLE(*worker)) {
-            ap_proxy_retry_worker("BALANCER", *worker, r->server);
+            ap_proxy_retry_worker_fn("BALANCER", *worker, r->server);
         }
 
         if (PROXY_WORKER_IS_USABLE(*worker)) {

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.c?rev=1209754&r1=1209753&r2=1209754&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.c Fri Dec  2 22:42:39 2011
@@ -19,6 +19,7 @@
 #include "apr_optional.h"
 #include "scoreboard.h"
 #include "mod_status.h"
+#include "proxy_util.h"
 
 #if (MODULE_MAGIC_NUMBER_MAJOR > 20020903)
 #include "mod_ssl.h"
@@ -2512,6 +2513,8 @@ static void register_hooks(apr_pool_t *p
     /* child init handling */
     ap_hook_child_init(child_init, aszPred, NULL, APR_HOOK_MIDDLE);
 
+    /* register optional functions within proxy_util.c */
+    proxy_util_register_hooks(p);
 }
 
 AP_DECLARE_MODULE(proxy) =

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.h?rev=1209754&r1=1209753&r2=1209754&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.h (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.h Fri Dec  2 22:42:39 2011
@@ -27,6 +27,7 @@
  */
 
 #include "apr_hooks.h"
+#include "apr_optional.h"
 #include "apr.h"
 #include "apr_lib.h"
 #include "apr_strings.h"
@@ -769,9 +770,8 @@ PROXY_DECLARE(int) ap_proxy_determine_co
  * @note The error status of the worker will cleared if the retry interval has
  * elapsed since the last error.
  */
-PROXY_DECLARE(int) ap_proxy_retry_worker(const char *proxy_function,
-                                         proxy_worker *worker,
-                                         server_rec *s);
+APR_DECLARE_OPTIONAL_FN(int, ap_proxy_retry_worker,
+        (const char *proxy_function, proxy_worker *worker, server_rec *s));
 
 /**
  * Acquire a connection from worker connection pool

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c?rev=1209754&r1=1209753&r2=1209754&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c Fri Dec  2 22:42:39 2011
@@ -28,6 +28,9 @@ ap_slotmem_provider_t *storage = NULL;
 
 module AP_MODULE_DECLARE_DATA proxy_balancer_module;
 
+static int (*ap_proxy_retry_worker_fn)(const char *proxy_function,
+        proxy_worker *worker, server_rec *s) = NULL;
+
 /*
  * Register our mutex type before the config is read so we
  * can adjust the mutex settings using the Mutex directive.
@@ -224,7 +227,7 @@ static proxy_worker *find_route_worker(p
                      * The worker might still be unusable, but we try
                      * anyway.
                      */
-                    ap_proxy_retry_worker("BALANCER", worker, r->server);
+                    ap_proxy_retry_worker_fn("BALANCER", worker, r->server);
                     if (PROXY_WORKER_IS_USABLE(worker)) {
                             return worker;
                     } else {
@@ -248,7 +251,7 @@ static proxy_worker *find_route_worker(p
                                  * The worker might still be unusable, but we try
                                  * anyway.
                                  */
-                                ap_proxy_retry_worker("BALANCER", rworker, r->server);
+                                ap_proxy_retry_worker_fn("BALANCER", rworker, r->server);
                             }
                             if (rworker && PROXY_WORKER_IS_USABLE(rworker))
                                 return rworker;
@@ -413,7 +416,7 @@ static void force_recovery(proxy_balance
         }
         else {
             /* Try if we can recover */
-            ap_proxy_retry_worker("BALANCER", *worker, s);
+            ap_proxy_retry_worker_fn("BALANCER", *worker, s);
             if (!((*worker)->s->status & PROXY_WORKER_IN_ERROR)) {
                 ok = 1;
                 break;
@@ -696,8 +699,19 @@ static int balancer_post_config(apr_pool
 
     /* balancer_post_config() will be called twice during startup.  So, don't
      * set up the static data the 1st time through. */
-    if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG)
+    if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG) {
         return OK;
+    }
+
+    if (!ap_proxy_retry_worker_fn) {
+        ap_proxy_retry_worker_fn =
+                APR_RETRIEVE_OPTIONAL_FN(ap_proxy_retry_worker);
+        if (!ap_proxy_retry_worker_fn) {
+            ap_log_error(
+                    APLOG_MARK, APLOG_EMERG, 0, s, "mod_proxy must be loaded for mod_proxy_balancer");
+            return !OK;
+        }
+    }
 
     /*
      * Get slotmem setups

Modified: httpd/httpd/trunk/modules/proxy/proxy_util.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.c?rev=1209754&r1=1209753&r2=1209754&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/proxy_util.c (original)
+++ httpd/httpd/trunk/modules/proxy/proxy_util.c Fri Dec  2 22:42:39 2011
@@ -20,6 +20,7 @@
 #include "scoreboard.h"
 #include "apr_version.h"
 #include "apr_hash.h"
+#include "proxy_util.h"
 
 #if APR_HAVE_UNISTD_H
 #include <unistd.h>         /* for getpid() */
@@ -1977,9 +1978,8 @@ PROXY_DECLARE(apr_status_t) ap_proxy_ini
     return rv;
 }
 
-PROXY_DECLARE(int) ap_proxy_retry_worker(const char *proxy_function,
-                                         proxy_worker *worker,
-                                         server_rec *s)
+static int ap_proxy_retry_worker(const char *proxy_function, proxy_worker *worker,
+        server_rec *s)
 {
     if (worker->s->status & PROXY_WORKER_IN_ERROR) {
         if (apr_time_now() > worker->s->error_time + worker->s->retry) {
@@ -3024,3 +3024,7 @@ PROXY_DECLARE(apr_status_t) ap_proxy_syn
     return APR_SUCCESS;
 }
 
+void proxy_util_register_hooks(apr_pool_t *p)
+{
+    APR_REGISTER_OPTIONAL_FN(ap_proxy_retry_worker);
+}

Added: httpd/httpd/trunk/modules/proxy/proxy_util.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.h?rev=1209754&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/proxy/proxy_util.h (added)
+++ httpd/httpd/trunk/modules/proxy/proxy_util.h Fri Dec  2 22:42:39 2011
@@ -0,0 +1,36 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef PROXY_UTIL_H_
+#define PROXY_UTIL_H_
+
+/**
+ * @file  proxy_util.h
+ * @brief Internal interfaces private to mod_proxy.
+ *
+ * @defgroup MOD_PROXY_PRIVATE Private
+ * @ingroup MOD_PROXY
+ * @{
+ */
+
+/**
+ * Register optional functions declared within proxy_util.c.
+ */
+void proxy_util_register_hooks(apr_pool_t *p);
+
+/** @} */
+
+#endif /* PROXY_UTIL_H_ */



Re: svn commit: r1209754 - in /httpd/httpd/trunk/modules/proxy: ./ balancers/

Posted by Stefan Fritsch <sf...@sfritsch.de>.
On Friday 02 December 2011, Graham Leggett wrote:
> On 03 Dec 2011, at 12:42 AM, minfrin@apache.org wrote:
> > Author: minfrin
> > Date: Fri Dec  2 22:42:39 2011
> > New Revision: 1209754
> >
> > 
> >
> > URL: http://svn.apache.org/viewvc?rev=1209754&view=rev
> > Log:
> > mod_proxy: Make ap_proxy_retry_worker() into an optional
> > function. Allows mod_lbmethod_bybusyness,
> > mod_lbmethod_byrequests, mod_lbmethod_bytraffic and
> > mod_lbmethod_heartbeat to be loaded without mod_proxy yet being
> > present, which happens when modules are loaded in alphabetical
> > order.
> 
> The proxy modules need a bunch more refactoring like this so that
> the modules can be loaded cleanly in any order.
> 
> Right now, we've gotten away with this due to the alphabetical
> naming of the proxy modules, sorted alphabetically mod_proxy comes
> before mod_proxy_http, and it just so happens mod_proxy_http
> depends on a lot of symbols provided by mod_proxy, so we work by
> accident.
> 
> The above change solves the problem for the mod_lbmethod_* modules,
> which sort alphabetically before mod_proxy and so cause a problem
> for people.
> 
> While I want to backport this change to v2.4, we don't have to
> backport the rest of the changes if doing so will delay httpd v2.4
> for any length of time. Right now I have a bit of time, so am keen
> to do it.
> 
> There are also functions in mod_proxy that are only used by a
> single mod_proxy_* module which ideally should be moved to the
> module that needs it.

There are also a bunch of utility functions that take a function name 
as argument for logging. I think this should actually be replaced by a 
module_index argument, which should then be passed to ap_log_*. This 
way the utility functions would write log messages in the name of the 
calling module, and be subject of the log config of the calling 
module.

But that's a bit late for 2.4, too.

Re: svn commit: r1209754 - in /httpd/httpd/trunk/modules/proxy: ./ balancers/

Posted by Graham Leggett <mi...@sharp.fm>.
On 03 Dec 2011, at 12:42 AM, minfrin@apache.org wrote:

> Author: minfrin
> Date: Fri Dec  2 22:42:39 2011
> New Revision: 1209754
> 
> URL: http://svn.apache.org/viewvc?rev=1209754&view=rev
> Log:
> mod_proxy: Make ap_proxy_retry_worker() into an optional function. Allows
> mod_lbmethod_bybusyness, mod_lbmethod_byrequests, mod_lbmethod_bytraffic
> and mod_lbmethod_heartbeat to be loaded without mod_proxy yet being present,
> which happens when modules are loaded in alphabetical order.

The proxy modules need a bunch more refactoring like this so that the modules can be loaded cleanly in any order.

Right now, we've gotten away with this due to the alphabetical naming of the proxy modules, sorted alphabetically mod_proxy comes before mod_proxy_http, and it just so happens mod_proxy_http depends on a lot of symbols provided by mod_proxy, so we work by accident.

The above change solves the problem for the mod_lbmethod_* modules, which sort alphabetically before mod_proxy and so cause a problem for people.

While I want to backport this change to v2.4, we don't have to backport the rest of the changes if doing so will delay httpd v2.4 for any length of time. Right now I have a bit of time, so am keen to do it.

There are also functions in mod_proxy that are only used by a single mod_proxy_* module which ideally should be moved to the module that needs it.

The full picture of the functions affected when mod_proxy is not loaded but everything else is looks like below. Seems like there is a lot of stuff that ideally should be moved from mod_proxy to mod_proxy_balancer.

Undefined symbols:
  "_ap_proxy_canon_netloc", referenced from:
      _proxy_ftp_canon in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_balancer_canon in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _proxy_http_canon in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_initialize_balancer", referenced from:
      _balancer_child_init in libmod_proxy_balancer.a(mod_proxy_balancer.o)
  "_ap_proxy_acquire_connection", referenced from:
      _proxy_ftp_handler in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_http_handler in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_pre_http_request", referenced from:
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_location_reverse_map", referenced from:
      _transform_hdrs.13192 in libmod_proxy_http.a(mod_proxy_http.o)
      _transform_hdrs.13192 in libmod_proxy_http.a(mod_proxy_http.o)
      _transform_hdrs.13192 in libmod_proxy_http.a(mod_proxy_http.o)
      _transform_hdrs.13192 in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_string_read", referenced from:
      _ftp_getrc_msg in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _ftp_getrc_msg in libmod_proxy_ftp.a(mod_proxy_ftp.o)
  "_ap_proxy_canonenc", referenced from:
      _proxy_ftp_canon in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_ftp_canon in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_ftp_canon in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_ftp_canon in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_balancer_canon in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _proxy_http_canon in libmod_proxy_http.a(mod_proxy_http.o)
  "_proxy_hook_post_request", referenced from:
      _ap_proxy_balancer_register_hook in libmod_proxy_balancer.a(mod_proxy_balancer.o)
  "_ap_proxy_initialize_worker", referenced from:
      _init_balancer_members in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
  "_ap_proxy_liststr", referenced from:
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_parse_wstatus", referenced from:
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
  "_ap_proxy_ssl_enable", referenced from:
      _proxy_http_handler in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_ssl_connection_cleanup", referenced from:
      _proxy_http_handler in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_get_balancer", referenced from:
      _proxy_balancer_pre_request in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
  "_ap_proxy_connect_backend", referenced from:
      _proxy_ftp_handler in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_http_handler in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_date_canon", referenced from:
      _process_proxy_header in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_release_connection", referenced from:
      _proxy_ftp_cleanup in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_ftp_handler in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
      _ap_proxy_http_cleanup in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_ssl_disable", referenced from:
      _proxy_ftp_handler in libmod_proxy_ftp.a(mod_proxy_ftp.o)
  "_ap_proxy_set_wstatus", referenced from:
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
  "_ap_proxy_cookie_reverse_map", referenced from:
      _transform_hdrs.13192 in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_share_worker", referenced from:
      _balancer_post_config in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
  "_ap_proxy_hex2c", referenced from:
      _decodeenc in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _ftp_check_string in libmod_proxy_ftp.a(mod_proxy_ftp.o)
  "_ap_proxy_connection_create", referenced from:
      _proxy_ftp_handler in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_http_handler in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_define_worker", referenced from:
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
  "_ap_proxy_share_balancer", referenced from:
      _balancer_post_config in libmod_proxy_balancer.a(mod_proxy_balancer.o)
  "_ap_proxy_determine_connection", referenced from:
      _proxy_http_handler in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_make_fake_req", referenced from:
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_get_worker", referenced from:
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
  "_ap_proxyerror", referenced from:
      _ftp_set_TYPE in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _ftp_set_TYPE in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _ftp_get_PWD in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _ftp_proxyerror in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_ftp_handler in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_ftp_handler in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_ftp_handler in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_ftp_handler in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _proxy_ftp_handler in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _rewrite_url in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _pass_brigade in libmod_proxy_http.a(mod_proxy_http.o)
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_strncpy", referenced from:
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
  "_ap_proxy_backend_broke", referenced from:
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
  "_proxy_run_fixups", referenced from:
      _ap_proxy_http_request in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_sync_balancer", referenced from:
      _proxy_balancer_pre_request in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
  "_proxy_hook_canon_handler", referenced from:
      _ap_proxy_ftp_register_hook in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _ap_proxy_balancer_register_hook in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _ap_proxy_http_register_hook in libmod_proxy_http.a(mod_proxy_http.o)
  "_proxy_hook_scheme_handler", referenced from:
      _ap_proxy_ftp_register_hook in libmod_proxy_ftp.a(mod_proxy_ftp.o)
      _ap_proxy_http_register_hook in libmod_proxy_http.a(mod_proxy_http.o)
  "_proxy_module", referenced from:
      _xlate_name in libmod_proxy_express.a(mod_proxy_express.o)
      _lock_remove in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_post_config in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_post_config in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_handler in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _balancer_child_init in libmod_proxy_balancer.a(mod_proxy_balancer.o)
      _ap_proxy_http_request in libmod_proxy_http.a(mod_proxy_http.o)
      _ap_proxy_read_headers in libmod_proxy_http.a(mod_proxy_http.o)
      _ap_proxy_read_headers in libmod_proxy_http.a(mod_proxy_http.o)
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_buckets_lifetime_transform", referenced from:
      _ap_proxy_http_process_response in libmod_proxy_http.a(mod_proxy_http.o)
  "_ap_proxy_checkproxyblock", referenced from:
      _proxy_ftp_handler in libmod_proxy_ftp.a(mod_proxy_ftp.o)
  "_proxy_hook_pre_request", referenced from:
      _ap_proxy_balancer_register_hook in libmod_proxy_balancer.a(mod_proxy_balancer.o)

Regards,
Graham
--