|
|
|
@ -56,6 +56,7 @@
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static volatile sig_atomic_t srv_shutdown = 0;
|
|
|
|
|
static volatile sig_atomic_t gracefull_shutdown = 0;
|
|
|
|
|
static volatile sig_atomic_t handle_sig_alarm = 1;
|
|
|
|
|
static volatile sig_atomic_t handle_sig_hup = 0;
|
|
|
|
|
|
|
|
|
@ -65,8 +66,8 @@ static void sigaction_handler(int sig, siginfo_t *si, void *context) {
|
|
|
|
|
UNUSED(context);
|
|
|
|
|
|
|
|
|
|
switch (sig) {
|
|
|
|
|
case SIGINT: srv_shutdown = 1; break;
|
|
|
|
|
case SIGTERM: srv_shutdown = 1; break;
|
|
|
|
|
case SIGINT: gracefull_shutdown = 1; break;
|
|
|
|
|
case SIGALRM: handle_sig_alarm = 1; break;
|
|
|
|
|
case SIGHUP: handle_sig_hup = 1; break;
|
|
|
|
|
case SIGCHLD: break;
|
|
|
|
@ -75,8 +76,8 @@ static void sigaction_handler(int sig, siginfo_t *si, void *context) {
|
|
|
|
|
#elif defined(HAVE_SIGNAL) || defined(HAVE_SIGACTION)
|
|
|
|
|
static void signal_handler(int sig) {
|
|
|
|
|
switch (sig) {
|
|
|
|
|
case SIGINT: srv_shutdown = 1; break;
|
|
|
|
|
case SIGTERM: srv_shutdown = 1; break;
|
|
|
|
|
case SIGINT: gracefull_shutdown = 1; break;
|
|
|
|
|
case SIGALRM: handle_sig_alarm = 1; break;
|
|
|
|
|
case SIGHUP: handle_sig_hup = 1; break;
|
|
|
|
|
case SIGCHLD: break;
|
|
|
|
@ -631,6 +632,18 @@ int main (int argc, char **argv) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* set max-conns */
|
|
|
|
|
if (srv->srvconf.max_conns > srv->max_fds) {
|
|
|
|
|
/* we can't have more connections than max-fds */
|
|
|
|
|
srv->max_conns = srv->max_fds;
|
|
|
|
|
} else if (srv->srvconf.max_conns) {
|
|
|
|
|
/* otherwise respect thw wishes of the user */
|
|
|
|
|
srv->max_conns = srv->srvconf.max_conns;
|
|
|
|
|
} else {
|
|
|
|
|
/* or use the default */
|
|
|
|
|
srv->max_conns = srv->max_fds;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (HANDLER_GO_ON != plugins_call_init(srv)) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s", "Initialization of plugins failed. Going down.");
|
|
|
|
@ -960,31 +973,63 @@ int main (int argc, char **argv) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* handle out of fd condition */
|
|
|
|
|
if (!srv->sockets_disabled &&
|
|
|
|
|
srv->cur_fds + srv->want_fds > srv->max_fds * 0.9) {
|
|
|
|
|
if (srv->sockets_disabled) {
|
|
|
|
|
/* our server sockets are disabled, why ? */
|
|
|
|
|
|
|
|
|
|
if ((srv->cur_fds + srv->want_fds < srv->max_fds * 0.8) && /* we have enough unused fds */
|
|
|
|
|
(srv->conns->used < srv->max_conns * 0.9) &&
|
|
|
|
|
(0 == gracefull_shutdown)) {
|
|
|
|
|
for (i = 0; i < srv->srv_sockets.used; i++) {
|
|
|
|
|
server_socket *srv_socket = srv->srv_sockets.ptr[i];
|
|
|
|
|
fdevent_event_add(srv->ev, &(srv_socket->fde_ndx), srv_socket->fd, FDEVENT_IN);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* disable server-fds */
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s", "[note] sockets enabled again");
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < srv->srv_sockets.used; i++) {
|
|
|
|
|
server_socket *srv_socket = srv->srv_sockets.ptr[i];
|
|
|
|
|
fdevent_event_del(srv->ev, &(srv_socket->fde_ndx), srv_socket->fd);
|
|
|
|
|
srv->sockets_disabled = 0;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if ((srv->cur_fds + srv->want_fds > srv->max_fds * 0.9) || /* out of fds */
|
|
|
|
|
(srv->conns->used > srv->max_conns) || /* out of connections */
|
|
|
|
|
(gracefull_shutdown)) { /* gracefull_shutdown */
|
|
|
|
|
|
|
|
|
|
/* disable server-fds */
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s", "[note] sockets disabled, out-of-fds");
|
|
|
|
|
|
|
|
|
|
srv->sockets_disabled = 1;
|
|
|
|
|
} else if (srv->sockets_disabled &&
|
|
|
|
|
srv->cur_fds + srv->want_fds < srv->max_fds * 0.8) {
|
|
|
|
|
for (i = 0; i < srv->srv_sockets.used; i++) {
|
|
|
|
|
server_socket *srv_socket = srv->srv_sockets.ptr[i];
|
|
|
|
|
fdevent_event_del(srv->ev, &(srv_socket->fde_ndx), srv_socket->fd);
|
|
|
|
|
|
|
|
|
|
if (gracefull_shutdown) {
|
|
|
|
|
/* we don't want this socket anymore,
|
|
|
|
|
*
|
|
|
|
|
* closing it right away will make it possible for
|
|
|
|
|
* the next lighttpd to take over (gracefull restart)
|
|
|
|
|
* */
|
|
|
|
|
|
|
|
|
|
fdevent_unregister(srv->ev, srv_socket->fd);
|
|
|
|
|
close(srv_socket->fd);
|
|
|
|
|
srv_socket->fd = -1;
|
|
|
|
|
|
|
|
|
|
/* network_close() will cleanup after us */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gracefull_shutdown) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s", "[note] gracefull shutdown started");
|
|
|
|
|
} else if (srv->conns->used > srv->max_conns) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s", "[note] sockets disabled, connection limit reached");
|
|
|
|
|
} else {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s", "[note] sockets disabled, out-of-fds");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < srv->srv_sockets.used; i++) {
|
|
|
|
|
server_socket *srv_socket = srv->srv_sockets.ptr[i];
|
|
|
|
|
fdevent_event_add(srv->ev, &(srv_socket->fde_ndx), srv_socket->fd, FDEVENT_IN);
|
|
|
|
|
srv->sockets_disabled = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s", "[note] sockets enabled, out-of-fds");
|
|
|
|
|
|
|
|
|
|
srv->sockets_disabled = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gracefull_shutdown && srv->conns->used == 0) {
|
|
|
|
|
/* we are in gracefull shutdown phase and all connections are closed
|
|
|
|
|
* we are ready to terminate without harming anyone */
|
|
|
|
|
srv_shutdown = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* we still have some fds to share */
|
|
|
|
|