September 10, 2009 08:16AM
On Thu, Sep 10, 2009 at 03:10:05PM +0400, Maxim Dounin wrote:

> Hello!
>
> On Thu, Sep 10, 2009 at 06:29:18AM -0400, gloomen wrote:
>
> > Friends, help deal with nginx. I can not go to the site.
> >
> > 502 Bad Gateway
> > nginx/0.7.61
> >
> > ee /var/log/nginx-error.log
> >
> > 2009/09/10 14:58:19 734#0: *3 upstream prematurely closed connection while reading response header from upstream, client: 10.10.10.10, server: xxx.net, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "xxx.net"
>
> So upstream probably just died. Likely to be php-related issue,
> try looking there.
>
> Anyway it isn't "bugs in nginx".

There is one nginx fastcgi bug when fastcgi sends very large headers.
The attached patch fixes this. In other cases it's more like backend error.


--
Igor Sysoev
http://sysoev.ru/en/
Index: src/http/modules/ngx_http_fastcgi_module.c
===================================================================
--- src/http/modules/ngx_http_fastcgi_module.c (revision 2379)
+++ src/http/modules/ngx_http_fastcgi_module.c (working copy)
@@ -1072,9 +1072,10 @@
static ngx_int_t
ngx_http_fastcgi_process_header(ngx_http_request_t *r)
{
- u_char *p, *start, *last, *part_start;
+ u_char *p, *msg, *start, *last,
+ *part_start, *part_end;
size_t size;
- ngx_str_t *status_line, line, *pattern;
+ ngx_str_t *status_line, *pattern;
ngx_int_t rc, status;
ngx_buf_t buf;
ngx_uint_t i;
@@ -1158,40 +1159,39 @@
if (f->type == NGX_HTTP_FASTCGI_STDERR) {

if (f->length) {
- line.data = u->buffer.pos;
+ msg = u->buffer.pos;

if (u->buffer.pos + f->length <= u->buffer.last) {
- line.len = f->length;
u->buffer.pos += f->length;
f->length = 0;
f->state = ngx_http_fastcgi_st_padding;

} else {
- line.len = u->buffer.last - u->buffer.pos;
f->length -= u->buffer.last - u->buffer.pos;
u->buffer.pos = u->buffer.last;
}

- while (line.data[line.len - 1] == LF
- || line.data[line.len - 1] == CR
- || line.data[line.len - 1] == '.'
- || line.data[line.len - 1] == ' ')
- {
- line.len--;
+ for (p = u->buffer.pos - 1; msg < p; p--) {
+ if (*p != LF && *p != CR && *p != '.' && *p != ' ') {
+ break;
+ }
}

+ p++;
+
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
- "FastCGI sent in stderr: \"%V\"", &line);
+ "FastCGI sent in stderr: \"%*s\"", p - msg, msg);

flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);

if (flcf->catch_stderr) {
pattern = flcf->catch_stderr->elts;

- line.data[line.len - 1] = '\0';
-
for (i = 0; i < flcf->catch_stderr->nelts; i++) {
- if (ngx_strstr(line.data, pattern[i].data)) {
+ if (ngx_strnstr(msg, (char *) pattern[i].data,
+ p - msg)
+ != NULL)
+ {
return NGX_HTTP_UPSTREAM_INVALID_HEADER;
}
}
@@ -1244,6 +1244,7 @@
for ( ;; ) {

part_start = u->buffer.pos;
+ part_end = u->buffer.last;

rc = ngx_http_parse_header_line(r, &u->buffer, 1);

@@ -1444,8 +1445,12 @@
part = ngx_array_push(f->split_parts);

part->start = part_start;
- part->end = u->buffer.last;
+ part->end = part_end;

+ if (u->buffer.pos < u->buffer.last) {
+ continue;
+ }
+
return NGX_AGAIN;
}
}
@@ -1454,9 +1459,9 @@
static ngx_int_t
ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
{
+ u_char *m, *msg;
ngx_int_t rc;
ngx_buf_t *b, **prev;
- ngx_str_t line;
ngx_chain_t *cl;
ngx_http_request_t *r;
ngx_http_fastcgi_ctx_t *f;
@@ -1540,30 +1545,27 @@
break;
}

- line.data = f->pos;
+ msg = f->pos;

if (f->pos + f->length <= f->last) {
- line.len = f->length;
f->pos += f->length;
f->length = 0;
f->state = ngx_http_fastcgi_st_padding;

} else {
- line.len = f->last - f->pos;
f->length -= f->last - f->pos;
f->pos = f->last;
}

- while (line.data[line.len - 1] == LF
- || line.data[line.len - 1] == CR
- || line.data[line.len - 1] == '.'
- || line.data[line.len - 1] == ' ')
- {
- line.len--;
+ for (m = f->pos - 1; msg < m; m--) {
+ if (*m != LF && *m != CR && *m != '.' && *m != ' ') {
+ break;
+ }
}

ngx_log_error(NGX_LOG_ERR, p->log, 0,
- "FastCGI sent in stderr: \"%V\"", &line);
+ "FastCGI sent in stderr: \"%*s\"",
+ m + 1 - msg, msg);

if (f->pos == f->last) {
break;
Subject Author Posted

Bugs in nginx

gloomen September 10, 2009 06:29AM

Re: Bugs in nginx

Maxim Dounin September 10, 2009 07:14AM

Re: Bugs in nginx

Igor Sysoev September 10, 2009 08:16AM

Re: Bugs in nginx

Jeffrey 'jf' Lim September 10, 2009 09:04PM

Re: Bugs in nginx

Igor Sysoev September 11, 2009 12:38AM

Re: Bugs in nginx

gloomen September 10, 2009 02:11PM

Re: Bugs in nginx

gloomen September 10, 2009 02:34PM

Re: Bugs in nginx

Igor Sysoev September 11, 2009 12:40AM

Re: Bugs in nginx

gloomen September 11, 2009 04:01AM

Re: Bugs in nginx

Igor Sysoev September 11, 2009 04:58AM

Re: Bugs in nginx

gloomen September 14, 2009 04:37AM

Re: Bugs in nginx

Igor Sysoev September 14, 2009 10:30AM

Re: Bugs in nginx

gloomen September 15, 2009 02:55AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 283
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready