sendfile() failed (9: Bad file descriptor) while sending request to upstream
Maxim Dounin
mdounin на mdounin.ru
Чт Авг 12 16:23:20 MSD 2010
Hello!
On Thu, Aug 12, 2010 at 07:00:39AM -0400, john2do wrote:
> nginx/0.7.65
> имеем в логах такого рода ошибки.
>
> sendfile() failed (9: Bad file descriptor) while sending request to
> upstream, client: x.x.x.x, server: foo.ru, request: "POST
> /edit/19067.php HTTP/1.1", subrequest: "/service/cache.php", upstream:
> "http://10.0.1.42:8200/service/cache.php?method=ssi&cacheid=4409", host:
> "foo.ru", referrer: "http://foo.ru/edit/19067.php"
Если тело запроса буферезировано в файл, то после первого
успешного proxy_pass оный файл удаляется, 0.3.3+:
*) Bugfix: a temporary file with client request body now is removed
just after the response header was transferred to a client.
Соответственно для подзапросов *необходимо* запрещать передачу
body через proxy_pass_request_body off; (и не забывать при этом
proxy_set_header Content-Length 0;).
Known issue. Если не удалять совсем (точнее, удалять только по
завершению запроса) - место в client temp расходуется без нужды, а
удалять с учётом возможных ssi и т.п. - получается дикий layering
violation. Хорошее решение - приветствуется.
Плохое решение - не удалять совсем, как-то так:
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -2030,11 +2030,6 @@ ngx_http_upstream_send_response(ngx_http
u->header_sent = 1;
- if (r->request_body && r->request_body->temp_file) {
- ngx_pool_run_cleanup_file(r->pool, r->request_body->temp_file->file.fd);
- r->request_body->temp_file->file.fd = NGX_INVALID_FILE;
- }
-
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
if (!u->buffering) {
Maxim Dounin
Подробная информация о списке рассылки nginx-ru