|
|
|
@ -57,8 +57,10 @@
|
|
|
|
|
|
|
|
|
|
typedef struct fcgi_proc {
|
|
|
|
|
size_t id; /* id will be between 1 and max_procs */
|
|
|
|
|
buffer *socket; /* config.socket + "-" + id */
|
|
|
|
|
buffer *unixsocket; /* config.socket + "-" + id */
|
|
|
|
|
unsigned port; /* config.port + pno */
|
|
|
|
|
|
|
|
|
|
buffer *connection_name; /* either tcp:<host>:<port> or unix:<socket> for debuggin purposes */
|
|
|
|
|
|
|
|
|
|
pid_t pid; /* PID of the spawned process (0 if not spawned locally) */
|
|
|
|
|
|
|
|
|
@ -74,12 +76,13 @@ typedef struct fcgi_proc {
|
|
|
|
|
int is_local;
|
|
|
|
|
|
|
|
|
|
enum {
|
|
|
|
|
PROC_STATE_UNSET, /* init-phase */
|
|
|
|
|
PROC_STATE_RUNNING, /* alive */
|
|
|
|
|
PROC_STATE_DIED_WAIT_FOR_PID,
|
|
|
|
|
PROC_STATE_KILLED, /* was killed as we don't have the load anymore */
|
|
|
|
|
PROC_STATE_DIED, /* marked as dead, should be restarted */
|
|
|
|
|
PROC_STATE_DISABLED /* proc disabled as it resulted in an error */
|
|
|
|
|
PROC_STATE_UNSET, /* init-phase */
|
|
|
|
|
PROC_STATE_RUNNING, /* alive */
|
|
|
|
|
PROC_STATE_OVERLOADED, /* listen-queue is full,
|
|
|
|
|
don't send something to this proc for the next 2 seconds */
|
|
|
|
|
PROC_STATE_DIED_WAIT_FOR_PID, /* */
|
|
|
|
|
PROC_STATE_DIED, /* marked as dead, should be restarted */
|
|
|
|
|
PROC_STATE_KILLED /* was killed as we don't have the load anymore */
|
|
|
|
|
} state;
|
|
|
|
|
} fcgi_proc;
|
|
|
|
|
|
|
|
|
@ -262,6 +265,8 @@ typedef struct {
|
|
|
|
|
typedef struct {
|
|
|
|
|
buffer *key; /* like .php */
|
|
|
|
|
|
|
|
|
|
int note_is_sent;
|
|
|
|
|
|
|
|
|
|
fcgi_extension_host **hosts;
|
|
|
|
|
|
|
|
|
|
size_t used;
|
|
|
|
@ -483,7 +488,8 @@ fcgi_proc *fastcgi_process_init() {
|
|
|
|
|
fcgi_proc *f;
|
|
|
|
|
|
|
|
|
|
f = calloc(1, sizeof(*f));
|
|
|
|
|
f->socket = buffer_init();
|
|
|
|
|
f->unixsocket = buffer_init();
|
|
|
|
|
f->connection_name = buffer_init();
|
|
|
|
|
|
|
|
|
|
f->prev = NULL;
|
|
|
|
|
f->next = NULL;
|
|
|
|
@ -496,7 +502,8 @@ void fastcgi_process_free(fcgi_proc *f) {
|
|
|
|
|
|
|
|
|
|
fastcgi_process_free(f->next);
|
|
|
|
|
|
|
|
|
|
buffer_free(f->socket);
|
|
|
|
|
buffer_free(f->unixsocket);
|
|
|
|
|
buffer_free(f->connection_name);
|
|
|
|
|
|
|
|
|
|
free(f);
|
|
|
|
|
}
|
|
|
|
@ -680,8 +687,8 @@ FREE_FUNC(mod_fastcgi_free) {
|
|
|
|
|
if (proc->pid != 0) kill(proc->pid, SIGTERM);
|
|
|
|
|
|
|
|
|
|
if (proc->is_local &&
|
|
|
|
|
!buffer_is_empty(proc->socket)) {
|
|
|
|
|
unlink(proc->socket->ptr);
|
|
|
|
|
!buffer_is_empty(proc->unixsocket)) {
|
|
|
|
|
unlink(proc->unixsocket->ptr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -689,8 +696,8 @@ FREE_FUNC(mod_fastcgi_free) {
|
|
|
|
|
if (proc->pid != 0) kill(proc->pid, SIGTERM);
|
|
|
|
|
|
|
|
|
|
if (proc->is_local &&
|
|
|
|
|
!buffer_is_empty(proc->socket)) {
|
|
|
|
|
unlink(proc->socket->ptr);
|
|
|
|
|
!buffer_is_empty(proc->unixsocket)) {
|
|
|
|
|
unlink(proc->unixsocket->ptr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -810,24 +817,28 @@ static int fcgi_spawn_connection(server *srv,
|
|
|
|
|
|
|
|
|
|
if (p->conf.debug) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sdb",
|
|
|
|
|
"new proc, socket:", proc->port, proc->socket);
|
|
|
|
|
"new proc, socket:", proc->port, proc->unixsocket);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!buffer_is_empty(proc->socket)) {
|
|
|
|
|
if (!buffer_is_empty(proc->unixsocket)) {
|
|
|
|
|
memset(&fcgi_addr, 0, sizeof(fcgi_addr));
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_SYS_UN_H
|
|
|
|
|
fcgi_addr_un.sun_family = AF_UNIX;
|
|
|
|
|
strcpy(fcgi_addr_un.sun_path, proc->socket->ptr);
|
|
|
|
|
strcpy(fcgi_addr_un.sun_path, proc->unixsocket->ptr);
|
|
|
|
|
|
|
|
|
|
#ifdef SUN_LEN
|
|
|
|
|
servlen = SUN_LEN(&fcgi_addr_un);
|
|
|
|
|
#else
|
|
|
|
|
/* stevens says: */
|
|
|
|
|
servlen = proc->socket->used + sizeof(fcgi_addr_un.sun_family);
|
|
|
|
|
servlen = proc->unixsocket->used + sizeof(fcgi_addr_un.sun_family);
|
|
|
|
|
#endif
|
|
|
|
|
socket_type = AF_UNIX;
|
|
|
|
|
fcgi_addr = (struct sockaddr *) &fcgi_addr_un;
|
|
|
|
|
|
|
|
|
|
buffer_copy_string(proc->connection_name, "unix:");
|
|
|
|
|
buffer_append_string_buffer(proc->connection_name, proc->unixsocket);
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s",
|
|
|
|
|
"ERROR: Unix Domain sockets are not supported.");
|
|
|
|
@ -870,6 +881,11 @@ static int fcgi_spawn_connection(server *srv,
|
|
|
|
|
|
|
|
|
|
socket_type = AF_INET;
|
|
|
|
|
fcgi_addr = (struct sockaddr *) &fcgi_addr_in;
|
|
|
|
|
|
|
|
|
|
buffer_copy_string(proc->connection_name, "tcp:");
|
|
|
|
|
buffer_append_string_buffer(proc->connection_name, host->host);
|
|
|
|
|
buffer_append_string(proc->connection_name, ":");
|
|
|
|
|
buffer_append_long(proc->connection_name, proc->port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (-1 == (fcgi_fd = socket(socket_type, SOCK_STREAM, 0))) {
|
|
|
|
@ -884,8 +900,8 @@ static int fcgi_spawn_connection(server *srv,
|
|
|
|
|
int val;
|
|
|
|
|
|
|
|
|
|
if (errno != ENOENT &&
|
|
|
|
|
!buffer_is_empty(proc->socket)) {
|
|
|
|
|
unlink(proc->socket->ptr);
|
|
|
|
|
!buffer_is_empty(proc->unixsocket)) {
|
|
|
|
|
unlink(proc->unixsocket->ptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
close(fcgi_fd);
|
|
|
|
@ -906,10 +922,9 @@ static int fcgi_spawn_connection(server *srv,
|
|
|
|
|
|
|
|
|
|
/* create socket */
|
|
|
|
|
if (-1 == bind(fcgi_fd, fcgi_addr, servlen)) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbds",
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbs",
|
|
|
|
|
"bind failed for:",
|
|
|
|
|
proc->socket,
|
|
|
|
|
proc->port,
|
|
|
|
|
proc->connection_name,
|
|
|
|
|
strerror(errno));
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
@ -1052,7 +1067,7 @@ static int fcgi_spawn_connection(server *srv,
|
|
|
|
|
WTERMSIG(status));
|
|
|
|
|
|
|
|
|
|
if (WTERMSIG(status) == 11) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ss",
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s",
|
|
|
|
|
"to be exact: it seg-fault, crashed, died, ... you get the idea." );
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s",
|
|
|
|
|
"If this is PHP try to remove the byte-code caches for now and try again.");
|
|
|
|
@ -1080,7 +1095,7 @@ static int fcgi_spawn_connection(server *srv,
|
|
|
|
|
if (p->conf.debug) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sb",
|
|
|
|
|
"(debug) socket is already used, won't spawn:",
|
|
|
|
|
proc->socket);
|
|
|
|
|
proc->connection_name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1252,9 +1267,12 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
|
|
|
|
|
|
|
|
|
|
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");
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbsbsbs",
|
|
|
|
|
"either host/port or socket have to be set in:",
|
|
|
|
|
da->key, "= (",
|
|
|
|
|
da_ext->key, " => (",
|
|
|
|
|
da_host->key, " ( ...");
|
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1262,8 +1280,12 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
|
|
|
|
|
/* unix domain socket */
|
|
|
|
|
|
|
|
|
|
if (host->unixsocket->used > UNIX_PATH_MAX - 2) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s",
|
|
|
|
|
"path of the unixdomain socket is too large");
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbsbsbs",
|
|
|
|
|
"unixsocket is too long in:",
|
|
|
|
|
da->key, "= (",
|
|
|
|
|
da_ext->key, " => (",
|
|
|
|
|
da_host->key, " ( ...");
|
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
@ -1271,21 +1293,20 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
|
|
|
|
|
|
|
|
|
|
if (buffer_is_empty(host->host) &&
|
|
|
|
|
buffer_is_empty(host->bin_path)) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbbbs",
|
|
|
|
|
"missing key (string):",
|
|
|
|
|
da->key,
|
|
|
|
|
da_ext->key,
|
|
|
|
|
da_host->key,
|
|
|
|
|
"host");
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbsbsbs",
|
|
|
|
|
"host or binpath have to be set in:",
|
|
|
|
|
da->key, "= (",
|
|
|
|
|
da_ext->key, " => (",
|
|
|
|
|
da_host->key, " ( ...");
|
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR;
|
|
|
|
|
} else if (host->port == 0) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbbbs",
|
|
|
|
|
"missing key (short):",
|
|
|
|
|
da->key,
|
|
|
|
|
da_ext->key,
|
|
|
|
|
da_host->key,
|
|
|
|
|
"port");
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbsbsbs",
|
|
|
|
|
"port has to be set in:",
|
|
|
|
|
da->key, "= (",
|
|
|
|
|
da_ext->key, " => (",
|
|
|
|
|
da_host->key, " ( ...");
|
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1320,9 +1341,9 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
|
|
|
|
|
if (buffer_is_empty(host->unixsocket)) {
|
|
|
|
|
proc->port = host->port + pno;
|
|
|
|
|
} else {
|
|
|
|
|
buffer_copy_string_buffer(proc->socket, host->unixsocket);
|
|
|
|
|
buffer_append_string(proc->socket, "-");
|
|
|
|
|
buffer_append_long(proc->socket, pno);
|
|
|
|
|
buffer_copy_string_buffer(proc->unixsocket, host->unixsocket);
|
|
|
|
|
buffer_append_string(proc->unixsocket, "-");
|
|
|
|
|
buffer_append_long(proc->unixsocket, pno);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (s->debug) {
|
|
|
|
@ -1358,7 +1379,7 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
|
|
|
|
|
if (buffer_is_empty(host->unixsocket)) {
|
|
|
|
|
proc->port = host->port;
|
|
|
|
|
} else {
|
|
|
|
|
buffer_copy_string_buffer(proc->socket, host->unixsocket);
|
|
|
|
|
buffer_copy_string_buffer(proc->unixsocket, host->unixsocket);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fastcgi_status_init(srv, p->statuskey, host, proc);
|
|
|
|
@ -1489,10 +1510,11 @@ void fcgi_connection_close(server *srv, handler_ctx *hctx) {
|
|
|
|
|
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:",
|
|
|
|
|
hctx->fd,
|
|
|
|
|
hctx->proc->pid, hctx->proc->socket);
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssdsbsd",
|
|
|
|
|
"released proc:",
|
|
|
|
|
"pid:", hctx->proc->pid,
|
|
|
|
|
"socket:", hctx->proc->connection_name,
|
|
|
|
|
"load:", hctx->proc->load);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1531,6 +1553,7 @@ static int fcgi_reconnect(server *srv, handler_ctx *hctx) {
|
|
|
|
|
fdevent_unregister(srv->ev, hctx->fd);
|
|
|
|
|
close(hctx->fd);
|
|
|
|
|
srv->cur_fds--;
|
|
|
|
|
hctx->fd = -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fcgi_requestid_del(srv, p, hctx->request_id);
|
|
|
|
@ -1540,11 +1563,16 @@ static int fcgi_reconnect(server *srv, handler_ctx *hctx) {
|
|
|
|
|
hctx->request_id = 0;
|
|
|
|
|
hctx->reconnects++;
|
|
|
|
|
|
|
|
|
|
if (p->conf.debug) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sddb",
|
|
|
|
|
"release proc:",
|
|
|
|
|
hctx->fd,
|
|
|
|
|
hctx->proc->pid, hctx->proc->socket);
|
|
|
|
|
if (p->conf.debug > 2) {
|
|
|
|
|
if (hctx->proc) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sdb",
|
|
|
|
|
"release proc for reconnect:",
|
|
|
|
|
hctx->proc->pid, hctx->proc->connection_name);
|
|
|
|
|
} else {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sb",
|
|
|
|
|
"release proc for reconnect:",
|
|
|
|
|
hctx->host->unixsocket);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hctx->proc && hctx->got_proc) {
|
|
|
|
@ -1649,18 +1677,24 @@ static connection_result_t fcgi_establish_connection(server *srv, handler_ctx *h
|
|
|
|
|
|
|
|
|
|
memset(&fcgi_addr, 0, sizeof(fcgi_addr));
|
|
|
|
|
|
|
|
|
|
if (!buffer_is_empty(proc->socket)) {
|
|
|
|
|
if (!buffer_is_empty(proc->unixsocket)) {
|
|
|
|
|
#ifdef HAVE_SYS_UN_H
|
|
|
|
|
/* use the unix domain socket */
|
|
|
|
|
fcgi_addr_un.sun_family = AF_UNIX;
|
|
|
|
|
strcpy(fcgi_addr_un.sun_path, proc->socket->ptr);
|
|
|
|
|
strcpy(fcgi_addr_un.sun_path, proc->unixsocket->ptr);
|
|
|
|
|
#ifdef SUN_LEN
|
|
|
|
|
servlen = SUN_LEN(&fcgi_addr_un);
|
|
|
|
|
#else
|
|
|
|
|
/* stevens says: */
|
|
|
|
|
servlen = proc->socket->used + sizeof(fcgi_addr_un.sun_family);
|
|
|
|
|
servlen = proc->unixsocket->used + sizeof(fcgi_addr_un.sun_family);
|
|
|
|
|
#endif
|
|
|
|
|
fcgi_addr = (struct sockaddr *) &fcgi_addr_un;
|
|
|
|
|
|
|
|
|
|
if (buffer_is_empty(proc->connection_name)) {
|
|
|
|
|
/* on remote spawing we have to set the connection-name now */
|
|
|
|
|
buffer_copy_string(proc->connection_name, "unix:");
|
|
|
|
|
buffer_append_string_buffer(proc->connection_name, proc->unixsocket);
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
return -1;
|
|
|
|
|
#endif
|
|
|
|
@ -1677,32 +1711,40 @@ static connection_result_t fcgi_establish_connection(server *srv, handler_ctx *h
|
|
|
|
|
servlen = sizeof(fcgi_addr_in);
|
|
|
|
|
|
|
|
|
|
fcgi_addr = (struct sockaddr *) &fcgi_addr_in;
|
|
|
|
|
|
|
|
|
|
if (buffer_is_empty(proc->connection_name)) {
|
|
|
|
|
/* on remote spawing we have to set the connection-name now */
|
|
|
|
|
buffer_copy_string(proc->connection_name, "tcp:");
|
|
|
|
|
buffer_append_string_buffer(proc->connection_name, host->host);
|
|
|
|
|
buffer_append_string(proc->connection_name, ":");
|
|
|
|
|
buffer_append_long(proc->connection_name, proc->port);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (-1 == connect(fcgi_fd, fcgi_addr, servlen)) {
|
|
|
|
|
if (errno == EINPROGRESS ||
|
|
|
|
|
errno == EALREADY ||
|
|
|
|
|
errno == EINTR) {
|
|
|
|
|
if (hctx->conf.debug) {
|
|
|
|
|
if (hctx->conf.debug > 2) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sb",
|
|
|
|
|
"connect delayed, will continue later:", host->host);
|
|
|
|
|
"connect delayed, will continue later:", proc->connection_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return CONNECTION_DELAYED;
|
|
|
|
|
} else if (errno == EAGAIN) {
|
|
|
|
|
if (hctx->conf.debug) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sd",
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbsd",
|
|
|
|
|
"This means that the you have more incoming requests than your fastcgi-backend can handle in parallel. "
|
|
|
|
|
"Perhaps it helps to spawn more fastcgi backend or php-children, if not decrease server.max-connections."
|
|
|
|
|
"The load for this fastcgi backend is:", proc->load);
|
|
|
|
|
"The load for this fastcgi backend", proc->connection_name, "is", proc->load);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return CONNECTION_OVERLOADED;
|
|
|
|
|
} else {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssdb",
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sssb",
|
|
|
|
|
"connect failed:",
|
|
|
|
|
strerror(errno),
|
|
|
|
|
proc->port, proc->socket);
|
|
|
|
|
strerror(errno), "on",
|
|
|
|
|
proc->connection_name);
|
|
|
|
|
|
|
|
|
|
return CONNECTION_DEAD;
|
|
|
|
|
}
|
|
|
|
@ -2390,12 +2432,10 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) {
|
|
|
|
|
b->used = r + 1; /* one extra for the fake \0 */
|
|
|
|
|
b->ptr[b->used - 1] = '\0';
|
|
|
|
|
} else {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssdsbsbsd",
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssdsb",
|
|
|
|
|
"unexpected end-of-file (perhaps the fastcgi process died):",
|
|
|
|
|
"pid:", proc->pid,
|
|
|
|
|
"socket:", proc->socket,
|
|
|
|
|
"host:", host->host,
|
|
|
|
|
"port:", proc->port);
|
|
|
|
|
"socket:", proc->connection_name);
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
@ -2663,85 +2703,93 @@ static int fcgi_restart_dead_procs(server *srv, plugin_data *p, fcgi_extension_h
|
|
|
|
|
fcgi_proc *proc;
|
|
|
|
|
|
|
|
|
|
for (proc = host->first; proc; proc = proc->next) {
|
|
|
|
|
if (p->conf.debug) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbdbdddd",
|
|
|
|
|
int status;
|
|
|
|
|
|
|
|
|
|
if (p->conf.debug > 2) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbdddd",
|
|
|
|
|
"proc:",
|
|
|
|
|
host->host, proc->port,
|
|
|
|
|
proc->socket,
|
|
|
|
|
proc->connection_name,
|
|
|
|
|
proc->state,
|
|
|
|
|
proc->is_local,
|
|
|
|
|
proc->load,
|
|
|
|
|
proc->pid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!proc->is_local) {
|
|
|
|
|
/*
|
|
|
|
|
* external servers might get disabled
|
|
|
|
|
*
|
|
|
|
|
* enable the server again, perhaps it is back again
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
if ((proc->state == PROC_STATE_DISABLED) &&
|
|
|
|
|
(srv->cur_ts > proc->disabled_until)) {
|
|
|
|
|
proc->state = PROC_STATE_RUNNING;
|
|
|
|
|
host->active_procs++;
|
|
|
|
|
|
|
|
|
|
fastcgi_status_copy_procname(p->statuskey, host, proc);
|
|
|
|
|
buffer_append_string(p->statuskey, ".disabled");
|
|
|
|
|
/*
|
|
|
|
|
* if the remote side is overloaded, we check back after <n> seconds
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
switch (proc->state) {
|
|
|
|
|
case PROC_STATE_KILLED:
|
|
|
|
|
case PROC_STATE_UNSET:
|
|
|
|
|
/* this should never happen as long as adaptive spawing is disabled */
|
|
|
|
|
assert(0);
|
|
|
|
|
|
|
|
|
|
status_counter_set(srv, CONST_BUF_LEN(p->statuskey), 0);
|
|
|
|
|
break;
|
|
|
|
|
case PROC_STATE_RUNNING:
|
|
|
|
|
break;
|
|
|
|
|
case PROC_STATE_OVERLOADED:
|
|
|
|
|
if (srv->cur_ts <= proc->disabled_until) break;
|
|
|
|
|
|
|
|
|
|
proc->state = PROC_STATE_RUNNING;
|
|
|
|
|
host->active_procs++;
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbdb",
|
|
|
|
|
"fcgi-server re-enabled:",
|
|
|
|
|
host->host, host->port,
|
|
|
|
|
host->unixsocket);
|
|
|
|
|
break;
|
|
|
|
|
case PROC_STATE_DIED_WAIT_FOR_PID:
|
|
|
|
|
/* non-local procs don't have PIDs to wait for */
|
|
|
|
|
if (!proc->is_local) break;
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbdb",
|
|
|
|
|
"fcgi-server re-enabled:",
|
|
|
|
|
host->host, host->port,
|
|
|
|
|
host->unixsocket);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
/* the child should not terminate at all */
|
|
|
|
|
int status;
|
|
|
|
|
|
|
|
|
|
if (proc->state == PROC_STATE_DIED_WAIT_FOR_PID) {
|
|
|
|
|
switch(waitpid(proc->pid, &status, WNOHANG)) {
|
|
|
|
|
case 0:
|
|
|
|
|
/* child is still alive */
|
|
|
|
|
break;
|
|
|
|
|
case -1:
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
if (WIFEXITED(status)) {
|
|
|
|
|
switch(waitpid(proc->pid, &status, WNOHANG)) {
|
|
|
|
|
case 0:
|
|
|
|
|
/* child is still alive */
|
|
|
|
|
break;
|
|
|
|
|
case -1:
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
if (WIFEXITED(status)) {
|
|
|
|
|
#if 0
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sdsd",
|
|
|
|
|
"child exited, pid:", proc->pid,
|
|
|
|
|
"status:", WEXITSTATUS(status));
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sdsd",
|
|
|
|
|
"child exited, pid:", proc->pid,
|
|
|
|
|
"status:", WEXITSTATUS(status));
|
|
|
|
|
#endif
|
|
|
|
|
} else if (WIFSIGNALED(status)) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sd",
|
|
|
|
|
"child signaled:",
|
|
|
|
|
WTERMSIG(status));
|
|
|
|
|
} else {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sd",
|
|
|
|
|
"child died somehow:",
|
|
|
|
|
status);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc->state = PROC_STATE_DIED;
|
|
|
|
|
break;
|
|
|
|
|
} else if (WIFSIGNALED(status)) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sd",
|
|
|
|
|
"child signaled:",
|
|
|
|
|
WTERMSIG(status));
|
|
|
|
|
} else {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sd",
|
|
|
|
|
"child died somehow:",
|
|
|
|
|
status);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc->state = PROC_STATE_DIED;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* fall through if we have a dead proc now */
|
|
|
|
|
if (proc->state != PROC_STATE_DIED) break;
|
|
|
|
|
|
|
|
|
|
case PROC_STATE_DIED:
|
|
|
|
|
/* local proc get restarted by us,
|
|
|
|
|
* remote ones hopefully by the admin */
|
|
|
|
|
|
|
|
|
|
if (proc->is_local) {
|
|
|
|
|
/* we still have connections bound to this proc,
|
|
|
|
|
* let them terminate first */
|
|
|
|
|
if (proc->load != 0) break;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* local servers might died, but we restart them
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
if (proc->state == PROC_STATE_DIED &&
|
|
|
|
|
proc->load == 0) {
|
|
|
|
|
/* restart the child */
|
|
|
|
|
|
|
|
|
|
if (p->conf.debug) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssdsbsdsd",
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssbsdsd",
|
|
|
|
|
"--- fastcgi spawning",
|
|
|
|
|
"\n\tport:", host->port,
|
|
|
|
|
"\n\tsocket", host->unixsocket,
|
|
|
|
|
"\n\tsocket", proc->connection_name,
|
|
|
|
|
"\n\tcurrent:", 1, "/", host->min_procs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2752,7 +2800,17 @@ static int fcgi_restart_dead_procs(server *srv, plugin_data *p, fcgi_extension_h
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fcgi_proclist_sort_down(srv, host, proc);
|
|
|
|
|
} else {
|
|
|
|
|
if (srv->cur_ts <= proc->disabled_until) break;
|
|
|
|
|
|
|
|
|
|
proc->state = PROC_STATE_RUNNING;
|
|
|
|
|
host->active_procs++;
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sb",
|
|
|
|
|
"fcgi-server re-enabled:",
|
|
|
|
|
proc->connection_name);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2775,6 +2833,10 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) {
|
|
|
|
|
host->host->used,
|
|
|
|
|
host->port,
|
|
|
|
|
host->unixsocket->used);
|
|
|
|
|
|
|
|
|
|
hctx->proc->disabled_until = srv->cur_ts + 10;
|
|
|
|
|
hctx->proc->state = PROC_STATE_DIED;
|
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2788,18 +2850,22 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ss",
|
|
|
|
|
"getsockopt failed:", strerror(errno));
|
|
|
|
|
|
|
|
|
|
hctx->proc->disabled_until = srv->cur_ts + 10;
|
|
|
|
|
hctx->proc->state = PROC_STATE_DIED;
|
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR;
|
|
|
|
|
}
|
|
|
|
|
if (socket_error != 0) {
|
|
|
|
|
if (!hctx->proc->is_local || p->conf.debug) {
|
|
|
|
|
/* local procs get restarted */
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sssd",
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sssb",
|
|
|
|
|
"establishing connection failed:", strerror(socket_error),
|
|
|
|
|
"port:", hctx->proc->port);
|
|
|
|
|
"socket:", hctx->proc->connection_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hctx->proc->disabled_until = srv->cur_ts + 10;
|
|
|
|
|
hctx->proc->state = PROC_STATE_DIED;
|
|
|
|
|
|
|
|
|
|
fastcgi_status_copy_procname(p->statuskey, hctx->host, hctx->proc);
|
|
|
|
|
buffer_append_string(p->statuskey, ".died");
|
|
|
|
@ -2875,14 +2941,14 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) {
|
|
|
|
|
/* cool down the backend, it is overloaded
|
|
|
|
|
* -> EAGAIN */
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssdsdb",
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssdsd",
|
|
|
|
|
"backend is overloaded, we disable it for a 2 seconds and send the request to another backend instead:",
|
|
|
|
|
"reconnects:", hctx->reconnects,
|
|
|
|
|
"load:", host->load,
|
|
|
|
|
host->unixsocket);
|
|
|
|
|
"load:", host->load);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hctx->proc->disabled_until = srv->cur_ts + 2;
|
|
|
|
|
hctx->proc->state = PROC_STATE_OVERLOADED;
|
|
|
|
|
|
|
|
|
|
fastcgi_status_copy_procname(p->statuskey, hctx->host, hctx->proc);
|
|
|
|
|
buffer_append_string(p->statuskey, ".overloaded");
|
|
|
|
@ -2899,6 +2965,7 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) {
|
|
|
|
|
* */
|
|
|
|
|
|
|
|
|
|
hctx->proc->disabled_until = srv->cur_ts + 10;
|
|
|
|
|
hctx->proc->state = PROC_STATE_DIED;
|
|
|
|
|
|
|
|
|
|
fastcgi_status_copy_procname(p->statuskey, hctx->host, hctx->proc);
|
|
|
|
|
buffer_append_string(p->statuskey, ".died");
|
|
|
|
@ -2944,13 +3011,11 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) {
|
|
|
|
|
status_counter_set(srv, CONST_BUF_LEN(p->statuskey), hctx->host->load);
|
|
|
|
|
|
|
|
|
|
if (p->conf.debug) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sddbdd",
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssdsbsd",
|
|
|
|
|
"got proc:",
|
|
|
|
|
hctx->fd,
|
|
|
|
|
hctx->proc->pid,
|
|
|
|
|
hctx->proc->socket,
|
|
|
|
|
hctx->proc->port,
|
|
|
|
|
hctx->proc->load);
|
|
|
|
|
"pid:", hctx->proc->pid,
|
|
|
|
|
"socket:", hctx->proc->connection_name,
|
|
|
|
|
"load:", hctx->proc->load);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* move the proc-list entry down the list */
|
|
|
|
@ -3117,43 +3182,7 @@ SUBREQUEST_FUNC(mod_fastcgi_handle_subrequest) {
|
|
|
|
|
|
|
|
|
|
if (hctx->state == FCGI_STATE_INIT ||
|
|
|
|
|
hctx->state == FCGI_STATE_CONNECT_DELAYED) {
|
|
|
|
|
/* connect() or getsockopt() failed,
|
|
|
|
|
* restart the request-handling
|
|
|
|
|
*/
|
|
|
|
|
if (proc) {
|
|
|
|
|
if (proc->is_local) {
|
|
|
|
|
|
|
|
|
|
if (p->conf.debug) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbdb",
|
|
|
|
|
"connect() to fastcgi failed, restarting the request-handling:",
|
|
|
|
|
host->host,
|
|
|
|
|
proc->port,
|
|
|
|
|
proc->socket);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* several hctx might reference the same proc
|
|
|
|
|
*
|
|
|
|
|
* Only one of them should mark the proc as dead all the other
|
|
|
|
|
* ones should just take a new one.
|
|
|
|
|
*
|
|
|
|
|
* If a new proc was started with the old struct this might lead
|
|
|
|
|
* the mark a perfect proc as dead otherwise
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
if (proc->state == PROC_STATE_RUNNING &&
|
|
|
|
|
hctx->pid == proc->pid) {
|
|
|
|
|
proc->state = PROC_STATE_DIED_WAIT_FOR_PID;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
proc->state = PROC_STATE_DISABLED;
|
|
|
|
|
}
|
|
|
|
|
host->active_procs--;
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
if (proc) host->active_procs--;
|
|
|
|
|
|
|
|
|
|
fcgi_restart_dead_procs(srv, p, host);
|
|
|
|
|
|
|
|
|
@ -3266,16 +3295,19 @@ static handler_t fcgi_handle_fdevent(void *s, void *ctx, int revents) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (p->conf.debug) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssdsbsdsd",
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssbsdsd",
|
|
|
|
|
"--- fastcgi spawning",
|
|
|
|
|
"\n\tport:", host->port,
|
|
|
|
|
"\n\tsocket", host->unixsocket,
|
|
|
|
|
"\n\tsocket", proc->connection_name,
|
|
|
|
|
"\n\tcurrent:", 1, "/", host->min_procs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (fcgi_spawn_connection(srv, p, host, proc)) {
|
|
|
|
|
/* child died */
|
|
|
|
|
/* respawning failed, retry later */
|
|
|
|
|
proc->state = PROC_STATE_DIED;
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s",
|
|
|
|
|
"respawning failed, will retry later");
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
fcgi_proclist_sort_down(srv, host, proc);
|
|
|
|
|
}
|
|
|
|
@ -3291,18 +3323,18 @@ static handler_t fcgi_handle_fdevent(void *s, void *ctx, int revents) {
|
|
|
|
|
hctx->reconnects < 5) {
|
|
|
|
|
fcgi_reconnect(srv, hctx);
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssdsd",
|
|
|
|
|
"response not received, request not sent, reconnecting.",
|
|
|
|
|
"connection-fd:", con->fd,
|
|
|
|
|
"fcgi-fd:", hctx->fd);
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssbsbs",
|
|
|
|
|
"response not received, request not sent",
|
|
|
|
|
"on socket:", proc->connection_name,
|
|
|
|
|
"for", con->uri.path, ", reconnecting");
|
|
|
|
|
|
|
|
|
|
return HANDLER_WAIT_FOR_FD;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sosdsd",
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sosbsbs",
|
|
|
|
|
"response not received, request sent:", hctx->wb->bytes_out,
|
|
|
|
|
"connection-fd:", con->fd,
|
|
|
|
|
"fcgi-fd:", hctx->fd);
|
|
|
|
|
"on socket:", proc->connection_name,
|
|
|
|
|
"for", con->uri.path, ", closing connection");
|
|
|
|
|
|
|
|
|
|
fcgi_connection_close(srv, hctx);
|
|
|
|
|
|
|
|
|
@ -3314,10 +3346,10 @@ static handler_t fcgi_handle_fdevent(void *s, void *ctx, int revents) {
|
|
|
|
|
/* response might have been already started, kill the connection */
|
|
|
|
|
fcgi_connection_close(srv, hctx);
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssdsd",
|
|
|
|
|
"response already sent out, termination connection",
|
|
|
|
|
"connection-fd:", con->fd,
|
|
|
|
|
"fcgi-fd:", hctx->fd);
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssbsbs",
|
|
|
|
|
"response already sent out, but backend returned error",
|
|
|
|
|
"on socket:", proc->connection_name,
|
|
|
|
|
"for", con->uri.path, ", terminating connection");
|
|
|
|
|
|
|
|
|
|
connection_set_state(srv, con, CON_STATE_ERROR);
|
|
|
|
|
}
|
|
|
|
@ -3370,7 +3402,7 @@ static handler_t fcgi_handle_fdevent(void *s, void *ctx, int revents) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbSBSDSd",
|
|
|
|
|
"error: unexpected close of fastcgi connection for",
|
|
|
|
|
con->uri.path,
|
|
|
|
|
"(no fastcgi process on host: ",
|
|
|
|
|
"(no fastcgi process on host:",
|
|
|
|
|
host->host,
|
|
|
|
|
", port: ",
|
|
|
|
|
host->port,
|
|
|
|
@ -3536,14 +3568,23 @@ static handler_t fcgi_check_extension(server *srv, connection *con, void *p_d, i
|
|
|
|
|
/* sorry, we don't have a server alive for this ext */
|
|
|
|
|
buffer_reset(con->physical.path);
|
|
|
|
|
con->http_status = 500;
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sb",
|
|
|
|
|
"no fcgi-handler found for:",
|
|
|
|
|
fn);
|
|
|
|
|
|
|
|
|
|
/* only send the 'no handler' once */
|
|
|
|
|
if (!extension->note_is_sent) {
|
|
|
|
|
extension->note_is_sent = 1;
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sbsbs",
|
|
|
|
|
"all handlers for ", con->uri.path,
|
|
|
|
|
"on", extension->key,
|
|
|
|
|
"are down.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return HANDLER_FINISHED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* a note about no handler is not sent yey */
|
|
|
|
|
extension->note_is_sent = 0;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* if check-local is disabled, use the uri.path handler
|
|
|
|
|
*
|
|
|
|
@ -3725,48 +3766,46 @@ TRIGGER_FUNC(mod_fastcgi_handle_trigger) {
|
|
|
|
|
host->num_procs < host->max_procs &&
|
|
|
|
|
(sum_load / host->num_procs) > host->max_load_per_proc) {
|
|
|
|
|
/* overload, spawn new child */
|
|
|
|
|
fcgi_proc *fp = NULL;
|
|
|
|
|
|
|
|
|
|
if (p->conf.debug) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s",
|
|
|
|
|
"overload detected, spawning a new child");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (fp = host->unused_procs; fp && fp->pid != 0; fp = fp->next);
|
|
|
|
|
for (proc = host->unused_procs; proc && proc->pid != 0; proc = proc->next);
|
|
|
|
|
|
|
|
|
|
if (fp) {
|
|
|
|
|
if (fp == host->unused_procs) host->unused_procs = fp->next;
|
|
|
|
|
if (proc) {
|
|
|
|
|
if (proc == host->unused_procs) host->unused_procs = proc->next;
|
|
|
|
|
|
|
|
|
|
if (fp->next) fp->next->prev = NULL;
|
|
|
|
|
if (proc->next) proc->next->prev = NULL;
|
|
|
|
|
|
|
|
|
|
host->max_id++;
|
|
|
|
|
} else {
|
|
|
|
|
fp = fastcgi_process_init();
|
|
|
|
|
fp->id = host->max_id++;
|
|
|
|
|
proc = fastcgi_process_init();
|
|
|
|
|
proc->id = host->max_id++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
host->num_procs++;
|
|
|
|
|
|
|
|
|
|
if (buffer_is_empty(host->unixsocket)) {
|
|
|
|
|
fp->port = host->port + fp->id;
|
|
|
|
|
proc->port = host->port + proc->id;
|
|
|
|
|
} else {
|
|
|
|
|
buffer_copy_string_buffer(fp->socket, host->unixsocket);
|
|
|
|
|
buffer_append_string(fp->socket, "-");
|
|
|
|
|
buffer_append_long(fp->socket, fp->id);
|
|
|
|
|
buffer_copy_string_buffer(proc->unixsocket, host->unixsocket);
|
|
|
|
|
buffer_append_string(proc->unixsocket, "-");
|
|
|
|
|
buffer_append_long(proc->unixsocket, proc->id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (fcgi_spawn_connection(srv, p, host, fp)) {
|
|
|
|
|
if (fcgi_spawn_connection(srv, p, host, proc)) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s",
|
|
|
|
|
"ERROR: spawning fcgi failed.");
|
|
|
|
|
return HANDLER_ERROR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fp->prev = NULL;
|
|
|
|
|
fp->next = host->first;
|
|
|
|
|
proc->prev = NULL;
|
|
|
|
|
proc->next = host->first;
|
|
|
|
|
if (host->first) {
|
|
|
|
|
host->first->prev = fp;
|
|
|
|
|
host->first->prev = proc;
|
|
|
|
|
}
|
|
|
|
|
host->first = fp;
|
|
|
|
|
host->first = proc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (proc = host->first; proc; proc = proc->next) {
|
|
|
|
@ -3781,7 +3820,7 @@ TRIGGER_FUNC(mod_fastcgi_handle_trigger) {
|
|
|
|
|
if (p->conf.debug) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssbsd",
|
|
|
|
|
"idle-timeout reached, terminating child:",
|
|
|
|
|
"socket:", proc->socket,
|
|
|
|
|
"socket:", proc->connection_name,
|
|
|
|
|
"pid", proc->pid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -3803,7 +3842,7 @@ TRIGGER_FUNC(mod_fastcgi_handle_trigger) {
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "ssbsd",
|
|
|
|
|
"killed:",
|
|
|
|
|
"socket:", proc->socket,
|
|
|
|
|
"socket:", proc->connection_name,
|
|
|
|
|
"pid", proc->pid);
|
|
|
|
|
|
|
|
|
|
host->num_procs--;
|
|
|
|
@ -3844,7 +3883,7 @@ TRIGGER_FUNC(mod_fastcgi_handle_trigger) {
|
|
|
|
|
if (proc->state != PROC_STATE_KILLED) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "sdb",
|
|
|
|
|
"child exited:",
|
|
|
|
|
WEXITSTATUS(status), proc->socket);
|
|
|
|
|
WEXITSTATUS(status), proc->connection_name);
|
|
|
|
|
}
|
|
|
|
|
} else if (WIFSIGNALED(status)) {
|
|
|
|
|
if (WTERMSIG(status) != SIGTERM) {
|
|
|
|
|