fixed reconnect after dead php-backend
added strip-request-uri git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-merge-1.4.x@831 152afb58-edef-0310-8abb-c4023f1b3aa9svn/tags/lighttpd-1.4.8
parent
b0c433da41
commit
57b7676542
|
@ -232,6 +232,8 @@ typedef struct {
|
|||
|
||||
only if a process is killed max_id waits for the process itself
|
||||
to die and decrements its afterwards */
|
||||
|
||||
buffer *strip_request_uri;
|
||||
} fcgi_extension_host;
|
||||
|
||||
/*
|
||||
|
@ -364,6 +366,8 @@ static handler_ctx * handler_ctx_init() {
|
|||
|
||||
hctx->fd = -1;
|
||||
|
||||
hctx->delayed = 0;
|
||||
|
||||
hctx->reconnects = 0;
|
||||
hctx->send_content_body = 1;
|
||||
|
||||
|
@ -415,6 +419,7 @@ fcgi_extension_host *fastcgi_host_init() {
|
|||
f->bin_path = buffer_init();
|
||||
f->bin_env = array_init();
|
||||
f->bin_env_copy = array_init();
|
||||
f->strip_request_uri = buffer_init();
|
||||
|
||||
return f;
|
||||
}
|
||||
|
@ -426,6 +431,7 @@ void fastcgi_host_free(fcgi_extension_host *h) {
|
|||
buffer_free(h->unixsocket);
|
||||
buffer_free(h->docroot);
|
||||
buffer_free(h->bin_path);
|
||||
buffer_free(h->strip_request_uri);
|
||||
array_free(h->bin_env);
|
||||
array_free(h->bin_env_copy);
|
||||
|
||||
|
@ -1073,7 +1079,8 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
|
|||
{ "bin-copy-environment", NULL, T_CONFIG_ARRAY, T_CONFIG_SCOPE_CONNECTION }, /* 13 */
|
||||
|
||||
{ "broken-scriptfilename", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 14 */
|
||||
{ "allow-x-send-file", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 15 */
|
||||
{ "allow-x-send-file", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 15 */
|
||||
{ "strip-request-uri", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 16 */
|
||||
|
||||
{ NULL, NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET }
|
||||
};
|
||||
|
@ -1117,7 +1124,7 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
|
|||
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;
|
||||
|
||||
if (0 != config_insert_values_internal(srv, da_host->value, fcv)) {
|
||||
return HANDLER_ERROR;
|
||||
|
@ -1538,29 +1545,51 @@ static int fcgi_establish_connection(server *srv, handler_ctx *hctx) {
|
|||
}
|
||||
|
||||
return 1;
|
||||
} else if (errno == EAGAIN) {
|
||||
#if 0
|
||||
if(hctx->delayed == 0) {
|
||||
log_error_write(srv, __FILE__, __LINE__, "sdsdsdb",
|
||||
"need reconnect, will continue later:", fcgi_fd,
|
||||
"reconnects:", hctx->reconnects,
|
||||
"load:", host->load,
|
||||
host->unixsocket);
|
||||
}
|
||||
#endif
|
||||
hctx->reconnects++;
|
||||
return -1;
|
||||
} else {
|
||||
log_error_write(srv, __FILE__, __LINE__, "sdsddb",
|
||||
"connect failed:", fcgi_fd,
|
||||
strerror(errno), errno,
|
||||
proc->port, proc->socket);
|
||||
|
||||
#if 0
|
||||
if (errno == EAGAIN) {
|
||||
log_error_write(srv, __FILE__, __LINE__, "sd",
|
||||
"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);
|
||||
}
|
||||
#endif
|
||||
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
if(hctx->delayed == 1) {
|
||||
log_error_write(srv, __FILE__, __LINE__, "sdsdsdb",
|
||||
"reconnected:", fcgi_fd,
|
||||
"reconnects:", hctx->reconnects,
|
||||
"load:", host->load,
|
||||
host->unixsocket);
|
||||
}
|
||||
#endif
|
||||
hctx->reconnects = 0;
|
||||
if (hctx->conf.debug > 1) {
|
||||
log_error_write(srv, __FILE__, __LINE__, "sd",
|
||||
"connect succeeded: ", fcgi_fd);
|
||||
}
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1785,7 +1814,35 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
|
|||
fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(p->path));
|
||||
fcgi_env_add(p->fcgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(con->physical.doc_root));
|
||||
}
|
||||
fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri));
|
||||
|
||||
if (host->strip_request_uri->used > 1) {
|
||||
/* we need at least one char to strip off */
|
||||
/**
|
||||
* /app1/index/list
|
||||
*
|
||||
* stripping /app1 or /app1/ should lead to
|
||||
*
|
||||
* /index/list
|
||||
*
|
||||
*/
|
||||
if ('/' != host->strip_request_uri->ptr[host->strip_request_uri->used - 2]) {
|
||||
/* fix the user-input to have / as last char */
|
||||
buffer_append_string(host->strip_request_uri, "/");
|
||||
}
|
||||
|
||||
if (con->request.orig_uri->used > host->strip_request_uri->used &&
|
||||
0 == strncmp(con->request.orig_uri->ptr, host->strip_request_uri->ptr, host->strip_request_uri->used - 1)) {
|
||||
/* the left is the same */
|
||||
|
||||
fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"),
|
||||
con->request.orig_uri->ptr + (host->strip_request_uri->used - 2),
|
||||
con->request.orig_uri->used - (host->strip_request_uri->used - 2));
|
||||
} else {
|
||||
fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri));
|
||||
}
|
||||
} else {
|
||||
fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri));
|
||||
}
|
||||
if (!buffer_is_equal(con->request.uri, con->request.orig_uri)) {
|
||||
fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REDIRECT_URI"), CONST_BUF_LEN(con->request.uri));
|
||||
}
|
||||
|
@ -2622,7 +2679,7 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) {
|
|||
|
||||
/* fall through */
|
||||
case FCGI_STATE_CONNECT:
|
||||
if (hctx->state == FCGI_STATE_INIT) {
|
||||
if (hctx->state == FCGI_STATE_INIT || hctx->delayed == 1) {
|
||||
for (hctx->proc = hctx->host->first;
|
||||
hctx->proc && hctx->proc->state != PROC_STATE_RUNNING;
|
||||
hctx->proc = hctx->proc->next);
|
||||
|
@ -2646,18 +2703,19 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) {
|
|||
|
||||
fdevent_event_add(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_OUT);
|
||||
|
||||
hctx->delayed = 0;
|
||||
return HANDLER_WAIT_FOR_EVENT;
|
||||
case -1:
|
||||
/* if ECONNREFUSED choose another connection -> FIXME */
|
||||
hctx->fde_ndx = -1;
|
||||
/* if ECONNREFUSED/EAGAIN re-try connect() */
|
||||
|
||||
return HANDLER_ERROR;
|
||||
fcgi_set_state(srv, hctx, FCGI_STATE_CONNECT);
|
||||
hctx->delayed = 1;
|
||||
return HANDLER_WAIT_FOR_EVENT;
|
||||
default:
|
||||
/* everything is ok, go on */
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
int socket_error;
|
||||
socklen_t socket_error_len = sizeof(socket_error);
|
||||
|
@ -2807,6 +2865,7 @@ SUBREQUEST_FUNC(mod_fastcgi_handle_subrequest) {
|
|||
proc = hctx->proc;
|
||||
host = hctx->host;
|
||||
|
||||
#if 0
|
||||
if (proc &&
|
||||
0 == proc->is_local &&
|
||||
proc->state != PROC_STATE_DISABLED) {
|
||||
|
@ -2822,6 +2881,7 @@ SUBREQUEST_FUNC(mod_fastcgi_handle_subrequest) {
|
|||
proc->state = PROC_STATE_DISABLED;
|
||||
host->active_procs--;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (hctx->state == FCGI_STATE_INIT ||
|
||||
hctx->state == FCGI_STATE_CONNECT) {
|
||||
|
|
Loading…
Reference in New Issue