# HG changeset patch # User Igor Sysoev # Date 1140454097 0 # Node ID 5ef026a2ac7481f04154f29ab49377bf99aaf96f # Parent 790c134e002dca82d75de09437b35c5898ac9b2a nginx-0.3.29-RELEASE import *) Feature: now nginx uses less memory, if PHP in FastCGI mode sends many warnings before the response. *) Bugfix: the "Transfer-Encoding: chunked" header line was issued in the 204 responses for the HTTP/1.1 requests. *) Bugfix: nginx returned the 502 response, if the complete response header lines were transferred in a separate FastCGI records. *) Bugfix: if the proxied URI was specified in the "post_action" directive, then it ran only after a successful completion of a request. diff --git a/docs/xml/nginx/changes.xml b/docs/xml/nginx/changes.xml --- a/docs/xml/nginx/changes.xml +++ b/docs/xml/nginx/changes.xml @@ -9,6 +9,55 @@ nginx changelog + + + + +теперь nginx использует меньше памяти, если PHP в режиме FastCGI передаёт +большое количество предупреждений перед ответом. + + +now nginx uses less memory, if PHP in FastCGI mode sends many warnings +before the response. + + + + + +в ответах 204 для запросов версии HTTP/1.1 выдавалась строка заголовка +"Transfer-Encoding: chunked". + + +the "Transfer-Encoding: chunked" header line was issued in the 204 responses +for the HTTP/1.1 requests. + + + + + +nginx возвращал 502 код ответа, если FastCGI сервер передавал полные строки +заголовка ответа в отдельных FastCGI записях. + + +nginx returned the 502 response, if the complete response header lines +were transferred in a separate FastCGI records. + + + + + +если в директиве post_action был указан проксируемый URI, то он выполнялся +только после успешного завершения запроса. + + +if the proxied URI was specified in the "post_action" directive, then it ran +only after a successful completion of a request. + + + + + + diff --git a/src/core/nginx.h b/src/core/nginx.h --- a/src/core/nginx.h +++ b/src/core/nginx.h @@ -8,7 +8,7 @@ #define _NGINX_H_INCLUDED_ -#define NGINX_VER "nginx/0.3.28" +#define NGINX_VER "nginx/0.3.29" #define NGINX_VAR "NGINX" #define NGX_OLDPID_EXT ".oldbin" diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c --- a/src/event/ngx_event_accept.c +++ b/src/event/ngx_event_accept.c @@ -264,8 +264,7 @@ ngx_trylock_accept_mutex(ngx_cycle_t *cy ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "accept mutex locked"); - if (ngx_accept_mutex_held && !(ngx_event_flags & NGX_USE_RTSIG_EVENT)) - { + if (ngx_accept_mutex_held && !(ngx_event_flags & NGX_USE_RTSIG_EVENT)) { return NGX_OK; } diff --git a/src/http/modules/ngx_http_chunked_filter_module.c b/src/http/modules/ngx_http_chunked_filter_module.c --- a/src/http/modules/ngx_http_chunked_filter_module.c +++ b/src/http/modules/ngx_http_chunked_filter_module.c @@ -50,7 +50,10 @@ static ngx_http_output_body_filter_pt static ngx_int_t ngx_http_chunked_header_filter(ngx_http_request_t *r) { - if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED || r != r->main) { + if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED + || r->headers_out.status == NGX_HTTP_NO_CONTENT + || r != r->main) + { return ngx_http_next_header_filter(r); } diff --git a/src/http/modules/ngx_http_fastcgi_module.c b/src/http/modules/ngx_http_fastcgi_module.c --- a/src/http/modules/ngx_http_fastcgi_module.c +++ b/src/http/modules/ngx_http_fastcgi_module.c @@ -46,7 +46,7 @@ typedef struct { size_t length; size_t padding; - ngx_uint_t header; + ngx_uint_t fastcgi_stdout; } ngx_http_fastcgi_ctx_t; @@ -776,7 +776,7 @@ ngx_http_fastcgi_reinit_request(ngx_http } f->state = ngx_http_fastcgi_st_version; - f->header = 0; + f->fastcgi_stdout = 0; return NGX_OK; } @@ -876,13 +876,6 @@ ngx_http_fastcgi_process_header(ngx_http if (f->type == NGX_HTTP_FASTCGI_STDERR) { - if (f->header) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "upstream split a header in FastCGI records"); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - if (f->length) { line.data = u->buffer.pos; @@ -910,6 +903,18 @@ ngx_http_fastcgi_process_header(ngx_http "FastCGI sent in stderr: \"%V\"", &line); if (u->buffer.pos == u->buffer.last) { + + if (!f->fastcgi_stdout) { + + /* + * the special handling the large number + * of the PHP warnings to not allocate memory + */ + + u->buffer.pos = u->buffer.start; + u->buffer.last = u->buffer.start; + } + return NGX_AGAIN; } @@ -923,6 +928,8 @@ ngx_http_fastcgi_process_header(ngx_http /* f->type == NGX_HTTP_FASTCGI_STDOUT */ + f->fastcgi_stdout = 1; + start = u->buffer.pos; if (u->buffer.pos + f->length < u->buffer.last) { @@ -939,8 +946,6 @@ ngx_http_fastcgi_process_header(ngx_http last = NULL; } - f->header = 1; - for ( ;; ) { rc = ngx_http_parse_header_line(r, &u->buffer); @@ -991,7 +996,13 @@ ngx_http_fastcgi_process_header(ngx_http "http fastcgi header: \"%V: %V\"", &h->key, &h->value); - continue; + if (u->buffer.pos < u->buffer.last) { + continue; + } + + /* the end of the FastCGI record */ + + break; } if (rc == NGX_HTTP_PARSE_HEADER_DONE) { @@ -1045,17 +1056,6 @@ ngx_http_fastcgi_process_header(ngx_http f->length -= u->buffer.pos - start; - if (rc == NGX_AGAIN) { - if (u->buffer.pos == u->buffer.last) { - return NGX_AGAIN; - } - - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "upstream split a header in FastCGI records"); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - if (f->length == 0) { if (f->padding) { f->state = ngx_http_fastcgi_st_padding; @@ -1064,7 +1064,20 @@ ngx_http_fastcgi_process_header(ngx_http } } - return NGX_OK; + if (rc == NGX_HTTP_PARSE_HEADER_DONE) { + return NGX_OK; + } + + if (u->buffer.pos == u->buffer.last) { + return NGX_AGAIN; + } + + if (rc == NGX_AGAIN) { + ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, + "upstream split a header line in FastCGI records"); + + return NGX_HTTP_UPSTREAM_INVALID_HEADER; + } } } diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c --- a/src/http/ngx_http_request.c +++ b/src/http/ngx_http_request.c @@ -1396,7 +1396,6 @@ ngx_http_finalize_request(ngx_http_reque || rc == NGX_HTTP_REQUEST_TIME_OUT || r->connection->error) { - if (ngx_http_post_action(r) == NGX_OK) { return; } diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c --- a/src/http/ngx_http_upstream.c +++ b/src/http/ngx_http_upstream.c @@ -283,8 +283,12 @@ ngx_http_upstream_init(ngx_http_request_ ngx_del_timer(c->read); } - r->read_event_handler = ngx_http_upstream_rd_check_broken_connection; - r->write_event_handler = ngx_http_upstream_wr_check_broken_connection; + if (!(r->http_version == NGX_HTTP_VERSION_9 && r->header_only)) { + /* not a post_action */ + + r->read_event_handler = ngx_http_upstream_rd_check_broken_connection; + r->write_event_handler = ngx_http_upstream_wr_check_broken_connection; + } if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {