|
|
|
@ -84,6 +84,9 @@ typedef struct fcgi_proc { |
|
|
|
|
} fcgi_proc; |
|
|
|
|
|
|
|
|
|
typedef struct { |
|
|
|
|
/* the key that is used to reference this value */ |
|
|
|
|
buffer *id; |
|
|
|
|
|
|
|
|
|
/* list of processes handling this extension
|
|
|
|
|
* sorted by lowest load |
|
|
|
|
* |
|
|
|
@ -301,6 +304,8 @@ typedef struct { |
|
|
|
|
|
|
|
|
|
buffer *path; |
|
|
|
|
buffer *parse_response; |
|
|
|
|
|
|
|
|
|
buffer *statuskey; |
|
|
|
|
|
|
|
|
|
plugin_config **config_storage; |
|
|
|
|
|
|
|
|
@ -353,22 +358,74 @@ static handler_t fcgi_handle_fdevent(void *s, void *ctx, int revents); |
|
|
|
|
|
|
|
|
|
int fcgi_proclist_sort_down(server *srv, fcgi_extension_host *host, fcgi_proc *proc); |
|
|
|
|
|
|
|
|
|
data_integer *status_counter_get_counter(server *srv, const char *s, size_t len) { |
|
|
|
|
data_integer *di; |
|
|
|
|
|
|
|
|
|
if (NULL == (di = (data_integer *)array_get_element(srv->status, s))) { |
|
|
|
|
/* not found, create it */ |
|
|
|
|
|
|
|
|
|
if (NULL == (di = (data_integer *)array_get_unused_element(srv->status, TYPE_INTEGER))) { |
|
|
|
|
di = data_integer_init(); |
|
|
|
|
} |
|
|
|
|
buffer_copy_string_len(di->key, s, len); |
|
|
|
|
di->value = 0; |
|
|
|
|
|
|
|
|
|
array_insert_unique(srv->status, (data_unset *)di); |
|
|
|
|
} |
|
|
|
|
return di; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* dummies of the statistic framework functions
|
|
|
|
|
* they will be moved to a statistics.c later */ |
|
|
|
|
int status_counter_inc(server *srv, const char *s, size_t len) { |
|
|
|
|
data_integer *di = status_counter_get_counter(srv, s, len); |
|
|
|
|
|
|
|
|
|
di->value++; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int status_counter_dec(server *srv, const char *s, size_t len) { |
|
|
|
|
data_integer *di = status_counter_get_counter(srv, s, len); |
|
|
|
|
|
|
|
|
|
if (di->value > 0) di->value--; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int status_counter_set(server *srv, const char *s, size_t len, int val) { |
|
|
|
|
data_integer *di = status_counter_get_counter(srv, s, len); |
|
|
|
|
|
|
|
|
|
di->value = val; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int fastcgi_status_copy_procname(buffer *b, fcgi_extension_host *host, fcgi_proc *proc) { |
|
|
|
|
buffer_copy_string(b, "fastcgi.backend."); |
|
|
|
|
buffer_append_string_buffer(b, host->id); |
|
|
|
|
buffer_append_string(b, "."); |
|
|
|
|
buffer_append_long(b, proc->id); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int fastcgi_status_init(server *srv, buffer *b, fcgi_extension_host *host, fcgi_proc *proc) { |
|
|
|
|
#define CLEAN(x) \ |
|
|
|
|
fastcgi_status_copy_procname(b, host, proc); \
|
|
|
|
|
buffer_append_string(b, x); \
|
|
|
|
|
status_counter_set(srv, CONST_BUF_LEN(b), 0); |
|
|
|
|
|
|
|
|
|
CLEAN(".disabled"); |
|
|
|
|
CLEAN(".died"); |
|
|
|
|
CLEAN(".overloaded"); |
|
|
|
|
CLEAN(".connected"); |
|
|
|
|
CLEAN(".load"); |
|
|
|
|
|
|
|
|
|
#undef CLEAN |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static handler_ctx * handler_ctx_init() { |
|
|
|
|
handler_ctx * hctx; |
|
|
|
@ -431,6 +488,7 @@ fcgi_extension_host *fastcgi_host_init() { |
|
|
|
|
|
|
|
|
|
f = calloc(1, sizeof(*f)); |
|
|
|
|
|
|
|
|
|
f->id = buffer_init(); |
|
|
|
|
f->host = buffer_init(); |
|
|
|
|
f->unixsocket = buffer_init(); |
|
|
|
|
f->docroot = buffer_init(); |
|
|
|
@ -445,6 +503,7 @@ fcgi_extension_host *fastcgi_host_init() { |
|
|
|
|
void fastcgi_host_free(fcgi_extension_host *h) { |
|
|
|
|
if (!h) return; |
|
|
|
|
|
|
|
|
|
buffer_free(h->id); |
|
|
|
|
buffer_free(h->host); |
|
|
|
|
buffer_free(h->unixsocket); |
|
|
|
|
buffer_free(h->docroot); |
|
|
|
@ -558,6 +617,8 @@ INIT_FUNC(mod_fastcgi_init) { |
|
|
|
|
|
|
|
|
|
p->path = buffer_init(); |
|
|
|
|
p->parse_response = buffer_init(); |
|
|
|
|
|
|
|
|
|
p->statuskey = buffer_init(); |
|
|
|
|
|
|
|
|
|
return p; |
|
|
|
|
} |
|
|
|
@ -574,6 +635,7 @@ FREE_FUNC(mod_fastcgi_free) { |
|
|
|
|
buffer_free(p->fcgi_env); |
|
|
|
|
buffer_free(p->path); |
|
|
|
|
buffer_free(p->parse_response); |
|
|
|
|
buffer_free(p->statuskey); |
|
|
|
|
|
|
|
|
|
if (p->config_storage) { |
|
|
|
|
size_t i, j, n; |
|
|
|
@ -1076,7 +1138,7 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) { |
|
|
|
|
for (n = 0; n < da_ext->value->used; n++) { |
|
|
|
|
data_array *da_host = (data_array *)da_ext->value->data[n]; |
|
|
|
|
|
|
|
|
|
fcgi_extension_host *df; |
|
|
|
|
fcgi_extension_host *host; |
|
|
|
|
|
|
|
|
|
config_values_t fcv[] = {
|
|
|
|
|
{ "host", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 0 */ |
|
|
|
@ -1112,54 +1174,56 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) { |
|
|
|
|
return HANDLER_ERROR; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
df = fastcgi_host_init(); |
|
|
|
|
host = fastcgi_host_init(); |
|
|
|
|
|
|
|
|
|
df->check_local = 1; |
|
|
|
|
df->min_procs = 4; |
|
|
|
|
df->max_procs = 4; |
|
|
|
|
df->max_load_per_proc = 1; |
|
|
|
|
df->idle_timeout = 60; |
|
|
|
|
df->mode = FCGI_RESPONDER; |
|
|
|
|
df->disable_time = 60; |
|
|
|
|
df->break_scriptfilename_for_php = 0; |
|
|
|
|
df->allow_xsendfile = 0; /* handle X-LIGHTTPD-send-file */ |
|
|
|
|
buffer_copy_string_buffer(host->id, da_host->key); |
|
|
|
|
|
|
|
|
|
host->check_local = 1; |
|
|
|
|
host->min_procs = 4; |
|
|
|
|
host->max_procs = 4; |
|
|
|
|
host->max_load_per_proc = 1; |
|
|
|
|
host->idle_timeout = 60; |
|
|
|
|
host->mode = FCGI_RESPONDER; |
|
|
|
|
host->disable_time = 60; |
|
|
|
|
host->break_scriptfilename_for_php = 0; |
|
|
|
|
host->allow_xsendfile = 0; /* handle X-LIGHTTPD-send-file */ |
|
|
|
|
|
|
|
|
|
fcv[0].destination = df->host; |
|
|
|
|
fcv[1].destination = df->docroot; |
|
|
|
|
fcv[0].destination = host->host; |
|
|
|
|
fcv[1].destination = host->docroot; |
|
|
|
|
fcv[2].destination = fcgi_mode; |
|
|
|
|
fcv[3].destination = df->unixsocket; |
|
|
|
|
fcv[4].destination = df->bin_path; |
|
|
|
|
fcv[3].destination = host->unixsocket; |
|
|
|
|
fcv[4].destination = host->bin_path; |
|
|
|
|
|
|
|
|
|
fcv[5].destination = &(df->check_local); |
|
|
|
|
fcv[6].destination = &(df->port); |
|
|
|
|
fcv[7].destination = &(df->min_procs); |
|
|
|
|
fcv[8].destination = &(df->max_procs); |
|
|
|
|
fcv[9].destination = &(df->max_load_per_proc); |
|
|
|
|
fcv[10].destination = &(df->idle_timeout); |
|
|
|
|
fcv[11].destination = &(df->disable_time); |
|
|
|
|
fcv[5].destination = &(host->check_local); |
|
|
|
|
fcv[6].destination = &(host->port); |
|
|
|
|
fcv[7].destination = &(host->min_procs); |
|
|
|
|
fcv[8].destination = &(host->max_procs); |
|
|
|
|
fcv[9].destination = &(host->max_load_per_proc); |
|
|
|
|
fcv[10].destination = &(host->idle_timeout); |
|
|
|
|
fcv[11].destination = &(host->disable_time); |
|
|
|
|
|
|
|
|
|
fcv[12].destination = df->bin_env; |
|
|
|
|
fcv[13].destination = df->bin_env_copy; |
|
|
|
|
fcv[14].destination = &(df->break_scriptfilename_for_php); |
|
|
|
|
fcv[15].destination = &(df->allow_xsendfile); |
|
|
|
|
fcv[16].destination = df->strip_request_uri; |
|
|
|
|
fcv[12].destination = host->bin_env; |
|
|
|
|
fcv[13].destination = host->bin_env_copy; |
|
|
|
|
fcv[14].destination = &(host->break_scriptfilename_for_php); |
|
|
|
|
fcv[15].destination = &(host->allow_xsendfile); |
|
|
|
|
fcv[16].destination = host->strip_request_uri; |
|
|
|
|
|
|
|
|
|
if (0 != config_insert_values_internal(srv, da_host->value, fcv)) { |
|
|
|
|
return HANDLER_ERROR; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((!buffer_is_empty(df->host) || df->port) &&
|
|
|
|
|
!buffer_is_empty(df->unixsocket)) { |
|
|
|
|
if ((!buffer_is_empty(host->host) || host->port) &&
|
|
|
|
|
!buffer_is_empty(host->unixsocket)) { |
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s",
|
|
|
|
|
"either host+port or socket"); |
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!buffer_is_empty(df->unixsocket)) { |
|
|
|
|
if (!buffer_is_empty(host->unixsocket)) { |
|
|
|
|
/* unix domain socket */ |
|
|
|
|
|
|
|
|
|
if (df->unixsocket->used > UNIX_PATH_MAX - 2) { |
|
|
|
|
if (host->unixsocket->used > UNIX_PATH_MAX - 2) { |
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s",
|
|
|
|
|
"path of the unixdomain socket is too large"); |
|
|
|
|
return HANDLER_ERROR; |
|
|
|
@ -1167,8 +1231,8 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) { |
|
|
|
|
} else { |
|
|
|
|
/* tcp/ip */ |
|
|
|
|
|
|
|
|
|
if (buffer_is_empty(df->host) &&
|
|
|
|
|
buffer_is_empty(df->bin_path)) { |
|
|
|
|
if (buffer_is_empty(host->host) &&
|
|
|
|
|
buffer_is_empty(host->bin_path)) { |
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbbbs",
|
|
|
|
|
"missing key (string):",
|
|
|
|
|
da->key, |
|
|
|
@ -1177,7 +1241,7 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) { |
|
|
|
|
"host"); |
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR; |
|
|
|
|
} else if (df->port == 0) { |
|
|
|
|
} else if (host->port == 0) { |
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbbbs",
|
|
|
|
|
"missing key (short):",
|
|
|
|
|
da->key, |
|
|
|
@ -1188,37 +1252,37 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!buffer_is_empty(df->bin_path)) {
|
|
|
|
|
if (!buffer_is_empty(host->bin_path)) {
|
|
|
|
|
/* a local socket + self spawning */ |
|
|
|
|
size_t pno; |
|
|
|
|
|
|
|
|
|
/* HACK: just to make sure the adaptive spawing is disabled */ |
|
|
|
|
df->min_procs = df->max_procs; |
|
|
|
|
host->min_procs = host->max_procs; |
|
|
|
|
|
|
|
|
|
if (df->min_procs > df->max_procs) df->max_procs = df->min_procs; |
|
|
|
|
if (df->max_load_per_proc < 1) df->max_load_per_proc = 0; |
|
|
|
|
if (host->min_procs > host->max_procs) host->max_procs = host->min_procs; |
|
|
|
|
if (host->max_load_per_proc < 1) host->max_load_per_proc = 0; |
|
|
|
|
|
|
|
|
|
if (s->debug) { |
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssbsdsbsdsd", |
|
|
|
|
"--- fastcgi spawning local", |
|
|
|
|
"\n\tproc:", df->bin_path, |
|
|
|
|
"\n\tport:", df->port, |
|
|
|
|
"\n\tsocket", df->unixsocket, |
|
|
|
|
"\n\tmin-procs:", df->min_procs, |
|
|
|
|
"\n\tmax-procs:", df->max_procs); |
|
|
|
|
"\n\tproc:", host->bin_path, |
|
|
|
|
"\n\tport:", host->port, |
|
|
|
|
"\n\tsocket", host->unixsocket, |
|
|
|
|
"\n\tmin-procs:", host->min_procs, |
|
|
|
|
"\n\tmax-procs:", host->max_procs); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (pno = 0; pno < df->min_procs; pno++) { |
|
|
|
|
for (pno = 0; pno < host->min_procs; pno++) { |
|
|
|
|
fcgi_proc *proc; |
|
|
|
|
|
|
|
|
|
proc = fastcgi_process_init(); |
|
|
|
|
proc->id = df->num_procs++; |
|
|
|
|
df->max_id++; |
|
|
|
|
proc->id = host->num_procs++; |
|
|
|
|
host->max_id++; |
|
|
|
|
|
|
|
|
|
if (buffer_is_empty(df->unixsocket)) { |
|
|
|
|
proc->port = df->port + pno; |
|
|
|
|
if (buffer_is_empty(host->unixsocket)) { |
|
|
|
|
proc->port = host->port + pno; |
|
|
|
|
} else { |
|
|
|
|
buffer_copy_string_buffer(proc->socket, df->unixsocket); |
|
|
|
|
buffer_copy_string_buffer(proc->socket, host->unixsocket); |
|
|
|
|
buffer_append_string(proc->socket, "-"); |
|
|
|
|
buffer_append_long(proc->socket, pno); |
|
|
|
|
} |
|
|
|
@ -1226,49 +1290,53 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) { |
|
|
|
|
if (s->debug) { |
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssdsbsdsd", |
|
|
|
|
"--- fastcgi spawning", |
|
|
|
|
"\n\tport:", df->port, |
|
|
|
|
"\n\tsocket", df->unixsocket, |
|
|
|
|
"\n\tcurrent:", pno, "/", df->min_procs); |
|
|
|
|
"\n\tport:", host->port, |
|
|
|
|
"\n\tsocket", host->unixsocket, |
|
|
|
|
"\n\tcurrent:", pno, "/", host->min_procs); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (fcgi_spawn_connection(srv, p, df, proc)) { |
|
|
|
|
if (fcgi_spawn_connection(srv, p, host, proc)) { |
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s", |
|
|
|
|
"[ERROR]: spawning fcgi failed."); |
|
|
|
|
return HANDLER_ERROR; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fastcgi_status_init(srv, p->statuskey, host, proc); |
|
|
|
|
|
|
|
|
|
proc->next = df->first; |
|
|
|
|
if (df->first) df->first->prev = proc; |
|
|
|
|
proc->next = host->first; |
|
|
|
|
if (host->first) host->first->prev = proc; |
|
|
|
|
|
|
|
|
|
df->first = proc; |
|
|
|
|
host->first = proc; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
fcgi_proc *fp; |
|
|
|
|
fcgi_proc *proc; |
|
|
|
|
|
|
|
|
|
fp = fastcgi_process_init(); |
|
|
|
|
fp->id = df->num_procs++; |
|
|
|
|
df->max_id++; |
|
|
|
|
df->active_procs++; |
|
|
|
|
fp->state = PROC_STATE_RUNNING; |
|
|
|
|
proc = fastcgi_process_init(); |
|
|
|
|
proc->id = host->num_procs++; |
|
|
|
|
host->max_id++; |
|
|
|
|
host->active_procs++; |
|
|
|
|
proc->state = PROC_STATE_RUNNING; |
|
|
|
|
|
|
|
|
|
if (buffer_is_empty(df->unixsocket)) { |
|
|
|
|
fp->port = df->port; |
|
|
|
|
if (buffer_is_empty(host->unixsocket)) { |
|
|
|
|
proc->port = host->port; |
|
|
|
|
} else { |
|
|
|
|
buffer_copy_string_buffer(fp->socket, df->unixsocket); |
|
|
|
|
buffer_copy_string_buffer(proc->socket, host->unixsocket); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
df->first = fp; |
|
|
|
|
fastcgi_status_init(srv, p->statuskey, host, proc); |
|
|
|
|
|
|
|
|
|
host->first = proc; |
|
|
|
|
|
|
|
|
|
df->min_procs = 1; |
|
|
|
|
df->max_procs = 1; |
|
|
|
|
host->min_procs = 1; |
|
|
|
|
host->max_procs = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!buffer_is_empty(fcgi_mode)) { |
|
|
|
|
if (strcmp(fcgi_mode->ptr, "responder") == 0) { |
|
|
|
|
df->mode = FCGI_RESPONDER; |
|
|
|
|
host->mode = FCGI_RESPONDER; |
|
|
|
|
} else if (strcmp(fcgi_mode->ptr, "authorizer") == 0) { |
|
|
|
|
df->mode = FCGI_AUTHORIZER; |
|
|
|
|
if (buffer_is_empty(df->docroot)) { |
|
|
|
|
host->mode = FCGI_AUTHORIZER; |
|
|
|
|
if (buffer_is_empty(host->docroot)) { |
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s", |
|
|
|
|
"ERROR: docroot is required for authorizer mode."); |
|
|
|
|
return HANDLER_ERROR; |
|
|
|
@ -1279,9 +1347,9 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) { |
|
|
|
|
fcgi_mode, "(ignored, mode set to responder)"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* if extension already exists, take it */ |
|
|
|
|
fastcgi_extension_insert(s->exts, da_ext->key, df); |
|
|
|
|
fastcgi_extension_insert(s->exts, da_ext->key, host); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1345,7 +1413,6 @@ static int fcgi_requestid_del(server *srv, plugin_data *p, size_t request_id) { |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void fcgi_connection_close(server *srv, handler_ctx *hctx) { |
|
|
|
|
plugin_data *p; |
|
|
|
|
connection *con; |
|
|
|
@ -1378,6 +1445,13 @@ void fcgi_connection_close(server *srv, handler_ctx *hctx) { |
|
|
|
|
/* after the connect the process gets a load */ |
|
|
|
|
hctx->proc->load--; |
|
|
|
|
|
|
|
|
|
status_counter_dec(srv, CONST_STR_LEN("fastcgi.active-requests")); |
|
|
|
|
|
|
|
|
|
fastcgi_status_copy_procname(p->statuskey, hctx->host, hctx->proc); |
|
|
|
|
buffer_append_string(p->statuskey, ".load"); |
|
|
|
|
|
|
|
|
|
status_counter_set(srv, CONST_BUF_LEN(p->statuskey), hctx->proc->load); |
|
|
|
|
|
|
|
|
|
if (p->conf.debug) { |
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sddb", |
|
|
|
|
"release proc:",
|
|
|
|
@ -2569,7 +2643,10 @@ static int fcgi_restart_dead_procs(server *srv, plugin_data *p, fcgi_extension_h |
|
|
|
|
proc->state = PROC_STATE_RUNNING; |
|
|
|
|
host->active_procs++; |
|
|
|
|
|
|
|
|
|
status_counter_set(srv, CONST_STR_LEN("fastcgi.backend.<hostid>.disable"), 0); |
|
|
|
|
fastcgi_status_copy_procname(p->statuskey, host, proc); |
|
|
|
|
buffer_append_string(p->statuskey, ".disabled"); |
|
|
|
|
|
|
|
|
|
status_counter_set(srv, CONST_BUF_LEN(p->statuskey), 0); |
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbdb",
|
|
|
|
|
"fcgi-server re-enabled:",
|
|
|
|
@ -2681,7 +2758,10 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) { |
|
|
|
|
|
|
|
|
|
hctx->proc->disabled_until = srv->cur_ts + 10; |
|
|
|
|
|
|
|
|
|
status_counter_inc(srv, CONST_STR_LEN("fastcgi.backend.<hostid>.died")); |
|
|
|
|
fastcgi_status_copy_procname(p->statuskey, hctx->host, hctx->proc); |
|
|
|
|
buffer_append_string(p->statuskey, ".died"); |
|
|
|
|
|
|
|
|
|
status_counter_inc(srv, CONST_BUF_LEN(p->statuskey)); |
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR; |
|
|
|
|
} |
|
|
|
@ -2761,7 +2841,10 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) { |
|
|
|
|
|
|
|
|
|
hctx->proc->disabled_until = srv->cur_ts + 2; |
|
|
|
|
|
|
|
|
|
status_counter_inc(srv, CONST_STR_LEN("fastcgi.backend.<hostid>.overloaded")); |
|
|
|
|
fastcgi_status_copy_procname(p->statuskey, hctx->host, hctx->proc); |
|
|
|
|
buffer_append_string(p->statuskey, ".overloaded"); |
|
|
|
|
|
|
|
|
|
status_counter_inc(srv, CONST_BUF_LEN(p->statuskey)); |
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR; |
|
|
|
|
case CONNECTION_DEAD: |
|
|
|
@ -2774,7 +2857,10 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) { |
|
|
|
|
|
|
|
|
|
hctx->proc->disabled_until = srv->cur_ts + 10; |
|
|
|
|
|
|
|
|
|
status_counter_inc(srv, CONST_STR_LEN("fastcgi.backend.<hostid>.died")); |
|
|
|
|
fastcgi_status_copy_procname(p->statuskey, hctx->host, hctx->proc); |
|
|
|
|
buffer_append_string(p->statuskey, ".died"); |
|
|
|
|
|
|
|
|
|
status_counter_inc(srv, CONST_BUF_LEN(p->statuskey)); |
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR; |
|
|
|
|
case CONNECTION_OK: |
|
|
|
@ -2796,8 +2882,16 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) { |
|
|
|
|
|
|
|
|
|
status_counter_inc(srv, CONST_STR_LEN("fastcgi.requests")); |
|
|
|
|
status_counter_inc(srv, CONST_STR_LEN("fastcgi.active-requests")); |
|
|
|
|
status_counter_inc(srv, CONST_STR_LEN("fastcgi.backend.<hostid>.connected")); |
|
|
|
|
status_counter_set(srv, CONST_STR_LEN("fastcgi.backend.<hostid>.load"), hctx->proc->load); |
|
|
|
|
|
|
|
|
|
fastcgi_status_copy_procname(p->statuskey, hctx->host, hctx->proc); |
|
|
|
|
buffer_append_string(p->statuskey, ".connected"); |
|
|
|
|
|
|
|
|
|
status_counter_inc(srv, CONST_BUF_LEN(p->statuskey)); |
|
|
|
|
|
|
|
|
|
fastcgi_status_copy_procname(p->statuskey, hctx->host, hctx->proc); |
|
|
|
|
buffer_append_string(p->statuskey, ".load"); |
|
|
|
|
|
|
|
|
|
status_counter_set(srv, CONST_BUF_LEN(p->statuskey), hctx->proc->load); |
|
|
|
|
|
|
|
|
|
if (p->conf.debug) { |
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sddbdd", |
|
|
|
@ -3000,7 +3094,10 @@ SUBREQUEST_FUNC(mod_fastcgi_handle_subrequest) { |
|
|
|
|
proc->state = PROC_STATE_DISABLED; |
|
|
|
|
} |
|
|
|
|
host->active_procs--; |
|
|
|
|
status_counter_set(srv, CONST_STR_LEN("fastcgi.backend.<hostid>.disable"), 1); |
|
|
|
|
fastcgi_status_copy_procname(p->statuskey, hctx->host, hctx->proc); |
|
|
|
|
buffer_append_string(p->statuskey, ".disabled"); |
|
|
|
|
|
|
|
|
|
status_counter_set(srv, CONST_BUF_LEN(p->statuskey), 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fcgi_restart_dead_procs(srv, p, host); |
|
|
|
@ -3326,7 +3423,7 @@ static handler_t fcgi_check_extension(server *srv, connection *con, void *p_d, i |
|
|
|
|
/* get best server */ |
|
|
|
|
for (k = 0; k < extension->used; k++) { |
|
|
|
|
host = extension->hosts[k]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* we should have at least one proc that can do somthing */ |
|
|
|
|
if (host->active_procs == 0) { |
|
|
|
|
host = NULL; |
|
|
|
|