25module AP_MODULE_DECLARE_DATA proxy_hcheck_module;
27#define HCHECK_WATHCHDOG_NAME ("_proxy_hcheck_")
28#define HC_THREADPOOL_SIZE (16)
33#define HC_USE_THREADS 1
36#define HC_USE_THREADS 0
115 &proxy_hcheck_module);
117 return "Bad call to set_worker_hc_param()";
130 worker->
s->
method =
template->method;
131 worker->
s->
interval =
template->interval;
132 worker->
s->
passes =
template->passes;
133 worker->
s->
fails =
template->fails;
137 temp->method =
template->method;
138 temp->interval =
template->interval;
139 temp->passes =
template->passes;
140 temp->fails =
template->fails;
153 if (!
method->implemented) {
154 return apr_psprintf(
p,
"Health check method %s not (yet) implemented",
165 return "Unknown method";
172 return "Unparse-able hcinterval setting";
174 return apr_psprintf(
p,
"Interval must be a positive value greater than %"
185 return "Passes must be a positive value";
195 return "Fails must be a positive value";
203 if (strlen(
val) >=
sizeof(worker->
s->
hcuri))
204 return apr_psprintf(
p,
"Health check uri length must be < %d characters",
205 (
int)
sizeof(worker->
s->
hcuri));
220 return apr_psprintf(
p,
"Health check uri length must be < %d characters",
221 (
int)
sizeof(worker->
s->
hcexpr));
229 return "unknown Worker hcheck parameter";
245 &proxy_hcheck_module);
249 return apr_pstrcat(
cmd->temp_pool,
"Missing expression name for ",
253 return apr_psprintf(
cmd->temp_pool,
"Expression name limited to %d characters",
265 return apr_psprintf(
cmd->temp_pool,
"Could not parse expression \"%s\": %s",
272 return "error: extra parameter(s)";
288 &proxy_hcheck_module);
299 template->method =
template->passes =
template->fails = 1;
301 template->hurl =
NULL;
302 template->hcexpr =
NULL;
307 return "Invalid ProxyHCTemplate parameter. Parameter must be "
308 "in the form 'key=value'";
333 return "Invalid ProxyHCTPsize parameter. Parameter must be "
498 "Creating hc worker %pp for %s://%s:%d",
545 "Updating hc worker %pp for %s://%s:%d",
571 "DNS lookup failure for: %s:%hu",
586 "Health check %s Status (%d) for %s.",
610 "mod_ssl not configured?");
613 (*backend)->is_ssl = 1;
727 return (rv) ? !
OK :
OK;
746 int proxy_status =
OK;
750 if ((major != 1) || (
len >=
sizeof(
buffer)-1)) {
812 "Error reading response body");
899 "Condition %s for %s (%s): passed", worker->
s->
hcexpr,
901 }
else if (
ok < 0 ||
err) {
903 "Error on checking condition %s for %s (%s): %s", worker->
s->
hcexpr,
908 "Condition %s for %s (%s) : failed", worker->
s->
hcexpr,
914 "Response status %i for %s (%s): failed",
r->
status,
931 "%sHealth checking %s", (thread ?
"Threaded " :
""),
947 "Somehow tried to use unimplemented hcheck method: %d",
959 "%sHealth check ENABLING %s", (thread ?
"Threaded " :
""),
973 "%sHealth check DISABLING %s", (thread ?
"Threaded " :
""),
999 "%s watchdog started.",
1007 "apr_thread_pool_create() with %d threads failed",
1013 "apr_thread_pool_create() with %d threads succeeded",
1018 "Skipping apr_thread_pool_create()");
1050 "Checking %s worker: %s [%d] (%pp)", balancer->
s->
name,
1058 baton->balancer = balancer;
1059 baton->worker = worker;
1060 baton->ptemp = ptemp;
1088 "stopping %s watchdog.",
1095 "apr_thread_pool_destroy() failed");
1141 "mod_watchdog is required");
1149 "Failed to create watchdog instance (%s)",
1155 &proxy_hcheck_module);
1159 "Missing unique per-server context: %s (%pp:%pp) (no hchecks)",
1160 s->server_hostname,
s,
ctx->s);
1170 "Failed to register watchdog callback (%s)",
1188 &proxy_hcheck_module);
1195 "<tr><th colspan='2'>Health check cond. expressions:</th></tr>\n"
1196 "<tr><th>Expr name</th><th>Expression</th></tr>\n",
r);
1200 for (
i = 0;
i <
hdr->nelts; ++
i) {
1206 ap_rprintf(
r,
"<tr><td>%s</td><td>%s</td></tr>\n",
1219 &proxy_hcheck_module);
1227 for (
i = 0;
i <
hdr->nelts; ++
i) {
1231 ap_rprintf(
r,
"<option value='%s' %s >%s</option>\n",
1233 (!
strcmp(elts[
i].
key, expr)) ?
"selected" :
"",
1244 &proxy_hcheck_module);
1252 for (
i = 0;
i <
hdr->nelts; ++
i) {
1282 return (
const char*)
buf;
1308 switch (
parms->type) {
1333 "Health check template"),
1335 "Define a health check condition ruleset expression"),
1338 "Set size of health check thread pool"),
1345 static const char *
const aszPre[] = {
"mod_proxy_balancer.c",
"mod_proxy.c",
NULL};
1346 static const char *
const aszSucc[] = {
"mod_watchdog.c",
NULL};
#define AP_EXPR_FUNC_STRING
const char apr_size_t len
Memory Slot Extension Storage Module for Apache.
ap_conf_vector_t * ap_merge_per_dir_configs(apr_pool_t *p, ap_conf_vector_t *base, ap_conf_vector_t *new_conf)
static apr_pool_t * pconf
#define AP_INIT_TAKE1(directive, func, mconfig, where, help)
#define ap_get_module_config(v, m)
ap_conf_vector_t * ap_create_request_config(apr_pool_t *p)
void ap_hook_post_config(ap_HOOK_post_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define AP_DECLARE_MODULE(foo)
#define AP_INIT_RAW_ARGS(directive, func, mconfig, where, help)
#define ap_set_module_config(v, m, val)
void ap_hook_pre_config(ap_HOOK_pre_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define HTTP_VERSION(major, minor)
apr_status_t ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket)
apr_status_t ap_get_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes)
#define AP_SQ_MS_CREATE_PRE_CONFIG
int ap_state_query(int query_code)
const unsigned char * buf
int ap_method_number_of(const char *method)
ap_method_list_t * ap_make_method_list(apr_pool_t *p, int nelts)
int ap_rprintf(request_rec *r, const char *fmt,...) __attribute__((format(printf
static APR_INLINE int ap_rputs(const char *str, request_rec *r)
void ap_set_content_type(request_rec *r, const char *ct)
int ap_getline(char *s, int n, request_rec *r, int flags)
int ap_ssl_has_outgoing_handlers(void)
const char apr_port_t port
ap_vhost_iterate_conn_cb void * baton
#define APR_STATUS_IS_EOF(s)
#define APR_BUCKET_IS_FLUSH(e)
#define APR_BUCKET_REMOVE(e)
#define APR_BRIGADE_INSERT_TAIL(b, e)
#define APR_BRIGADE_EMPTY(b)
#define apr_bucket_delete(e)
#define APR_BUCKET_IS_EOS(e)
apr_brigade_flush void * ctx
#define APR_BRIGADE_FIRST(b)
const char *const const char *const * aszSucc
const char *const * aszPre
#define APR_RETRIEVE_OPTIONAL_FN(name)
#define APR_OPTIONAL_FN_TYPE(name)
#define APR_REGISTER_OPTIONAL_FN(name)
#define ap_expr_parse_cmd(cmd, expr, flags, err, lookup_fn)
int ap_expr_exec(request_rec *r, const ap_expr_info_t *expr, const char **err)
void ap_hook_expr_lookup(ap_HOOK_expr_lookup_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
int ap_proxy_connect_backend(const char *proxy_function, proxy_conn_rec *conn, proxy_worker *worker, server_rec *s)
#define PROXY_WORKER_IS_HCFAILED(f)
apr_status_t ap_proxy_set_wstatus(char c, int set, proxy_worker *w)
#define PROXY_WORKER_STOPPED
#define PROXY_STRNCPY(dst, src)
int ap_proxy_release_connection(const char *proxy_function, proxy_conn_rec *conn, server_rec *s)
int ap_proxy_acquire_connection(const char *proxy_function, proxy_conn_rec **conn, proxy_worker *worker, server_rec *s)
apr_status_t ap_proxy_determine_address(const char *proxy_function, proxy_conn_rec *conn, const char *hostname, apr_port_t hostport, unsigned int flags, request_rec *r, server_rec *s)
#define PROXY_WORKER_IGNORE_ERRORS
char * ap_proxy_define_worker(apr_pool_t *p, proxy_worker **worker, proxy_balancer *balancer, proxy_server_conf *conf, const char *url, int do_malloc)
#define PROXY_WORKER_MAX_SCHEME_SIZE
int ap_proxy_pre_http_request(conn_rec *c, request_rec *r)
#define PROXY_WORKER_GENERIC
#define PROXY_WORKER_IS(f, b)
#define PROXY_WORKER_IS_ERROR(f)
apr_status_t ap_proxy_sync_balancer(proxy_balancer *b, server_rec *s, proxy_server_conf *conf)
int ap_proxy_connection_create_ex(const char *proxy_function, proxy_conn_rec *conn, request_rec *r)
unsigned int ap_proxy_hashfunc(const char *str, proxy_hash_t method)
const char * ap_proxy_show_hcmethod(hcmethod_t method)
apr_status_t ap_proxy_initialize_worker(proxy_worker *worker, server_rec *s, apr_pool_t *p)
#define HCHECK_WATHCHDOG_DEFAULT_INTERVAL
apr_port_t ap_proxy_port_of_scheme(const char *scheme)
#define PROXY_WORKER_HC_FAIL_FLAG
#define PROXY_WORKER_IN_ERROR_FLAG
proxy_hcmethods_t proxy_hcmethods[]
#define AP_WATCHDOG_STATE_STARTING
#define AP_WATCHDOG_STATE_STOPPING
#define AP_WATCHDOG_STATE_RUNNING
#define STANDARD20_MODULE_STUFF
char * ap_getword_conf2(apr_pool_t *p, const char **line)
int ap_cstr_casecmp(const char *s1, const char *s2)
#define ap_escape_html(p, s)
#define PROXYREQ_RESPONSE
apr_status_t ap_timeout_parameter_parse(const char *timeout_parameter, apr_interval_time_t *timeout, const char *default_time_unit)
char * ap_getword_conf(apr_pool_t *p, const char **line)
const char * ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden)
const char int apr_pool_t * pool
int strcasecmp(const char *a, const char *b)
int strncasecmp(const char *a, const char *b, size_t n)
apr_vformatter_buff_t * c
apr_uint32_t apr_pool_t apr_uint32_t apr_pollset_method_e method
#define apr_pool_create(newpool, parent)
#define apr_pcalloc(p, size)
apr_int32_t apr_int32_t apr_int32_t err
#define apr_time_as_msec(time)
apr_int64_t apr_interval_time_t
#define apr_time_from_sec(sec)
#define AP_REQ_DEFAULT_PATH_INFO
static struct h2_workers * workers
Proxy Extension Module for Apache.
static const char * hc_expr_func_fn(ap_expr_eval_ctx_t *ctx, const void *data, const char *arg)
static apr_status_t hc_check_http(baton_t *baton, apr_thread_t *thread)
#define HC_THREADPOOL_SIZE
static void hc_show_exprs(request_rec *r)
static const command_rec command_table[]
static const char * set_hc_template(cmd_parms *cmd, void *dummy, const char *arg)
static int hc_valid_expr(request_rec *r, const char *expr)
static int hc_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *main_s)
static apr_status_t hc_watchdog_callback(int state, void *data, apr_pool_t *pool)
static const char * hc_get_body(request_rec *r)
static void create_hcheck_req(wctx_t *wctx, proxy_worker *hc, apr_pool_t *p)
static int hc_expr_lookup(ap_expr_lookup_parms *parms)
static ap_watchdog_t * watchdog
static void set_request_connection(request_rec *r, conn_rec *conn)
static int hc_read_headers(request_rec *r)
static int hc_send(request_rec *r, const char *out, apr_bucket_brigade *bb)
static apr_OFN_ajp_handle_cping_cpong_t * ajp_handle_cping_cpong
static const char * hc_expr_var_fn(ap_expr_eval_ctx_t *ctx, const void *data)
static apr_status_t hc_init_baton(baton_t *baton)
static const char * set_worker_hc_param(apr_pool_t *p, server_rec *s, proxy_worker *worker, const char *key, const char *val, void *v)
static void *APR_THREAD_FUNC hc_check(apr_thread_t *thread, void *b)
static void * hc_create_config(apr_pool_t *p, server_rec *s)
static proxy_worker * hc_get_hcworker(sctx_t *ctx, proxy_worker *worker, apr_pool_t *p)
static int hc_get_backend(const char *proxy_function, proxy_conn_rec **backend, proxy_worker *hc, sctx_t *ctx)
static void hc_register_hooks(apr_pool_t *p)
static apr_status_t hc_check_tcp(baton_t *baton)
static request_rec * create_request_rec(apr_pool_t *p, server_rec *s, proxy_balancer *balancer, const char *method, const char *protocol)
static int hc_determine_connection(const char *proxy_function, proxy_conn_rec *backend, server_rec *s)
static apr_status_t backend_cleanup(const char *proxy_function, proxy_conn_rec *backend, server_rec *s, int status)
static int hc_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
#define HCHECK_WATHCHDOG_NAME
static int hc_read_body(request_rec *r, apr_bucket_brigade *bb)
static void hc_select_exprs(request_rec *r, const char *expr)
static apr_status_t hc_check_cping(baton_t *baton, apr_thread_t *thread)
static const char * set_hc_condition(cmd_parms *cmd, void *dummy, const char *arg)
static apr_status_t ap_watchdog_register_callback(ap_watchdog_t *w, apr_interval_time_t interval, const void *data, ap_watchdog_callback_fn_t *callback)
static apr_status_t ap_watchdog_get_instance(ap_watchdog_t **watchdog, const char *name, int parent, int singleton, apr_pool_t *p)
Watchdog module for Apache.
proxy_balancer * balancer
Structure to store things which are per connection.
apr_sockaddr_t * client_addr
struct ap_filter_t * input_filters
struct ap_filter_t * output_filters
struct apr_bucket_alloc_t * bucket_alloc
apr_interval_time_t interval
ap_conf_vector_t * section_config
proxy_balancer_shared * s
apr_array_header_t * workers
apr_array_header_t * balancers
unsigned int conn_timeout_set
apr_interval_time_t timeout
unsigned int ping_timeout_set
apr_interval_time_t interval
apr_interval_time_t conn_timeout
apr_interval_time_t ping_timeout
unsigned int is_address_reusable
unsigned int disablereuse
A structure that represents the current request.
apr_table_t * trailers_in
struct ap_filter_t * output_filters
struct ap_filter_t * proto_input_filters
apr_sockaddr_t * useragent_addr
apr_bucket_brigade * kept_body
ap_method_list_t * allowed_methods
apr_table_t * err_headers_out
struct ap_filter_t * proto_output_filters
struct ap_filter_t * input_filters
struct ap_conf_vector_t * request_config
apr_table_t * subprocess_env
struct ap_conf_vector_t * per_dir_config
apr_table_t * trailers_out
apr_table_t * headers_out
apr_array_header_t * templates
A structure to store information for each virtual server.
struct ap_conf_vector_t * lookup_defaults
struct ap_conf_vector_t * module_config
apr_status_t apr_socket_timeout_get(apr_socket_t *sock, apr_interval_time_t *t)