<div dir="ltr">Yes, It works. Thank you for the patch.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 18, 2014 at 10:27 PM, Valentin V. Bartenev <span dir="ltr"><<a href="mailto:vbart@nginx.com" target="_blank">vbart@nginx.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Wednesday 18 June 2014 09:46:36 Jing Ye wrote:<br>
> vbart,<br>
><br>
> Thanks for the advice, but I’m afraid this is not the case. When i remove<br>
> the 9902 upstream and curl again, it works properly and print 90833 at the<br>
> end with only calling file_get_contents once.<br>
><br>
> In addition, in the error.log with debug mode, i found the following lines,<br>
><br>
> ………….<br>
><br>
> 2014/06/17 21:57:48 [debug] 61130#0: *9 http upstream request: "/index.php?"<br>
> 2014/06/17 21:57:48 [debug] 61130#0: *9 http upstream send request handler<br>
> 2014/06/17 21:57:48 [debug] 61130#0: *9 http upstream send request<br>
> 2014/06/17 21:57:48 [debug] 61130#0: *9 chain writer buf fl:0 s:584<br>
> 2014/06/17 21:57:48 [debug] 61130#0: *9 chain writer buf fl:0 s:32768<br>
> <— here<br>
> 2014/06/17 21:57:48 [debug] 61130#0: *9 chain writer buf fl:0 s:8<br>
> 2014/06/17 21:57:48 [debug] 61130#0: *9 chain writer buf fl:0 s:32768<br>
> <— here<br>
> 2014/06/17 21:57:48 [debug] 61130#0: *9 chain writer buf fl:0 s:8<br>
> 2014/06/17 21:57:48 [debug] 61130#0: *9 chain writer buf fl:0 s:25297<br>
> <— here<br>
> 2014/06/17 21:57:48 [debug] 61130#0: *9 chain writer buf fl:0 s:15<br>
><br>
> ………….<br>
><br>
> 2014/06/17 21:57:49 [error] 61130#0: *9 upstream prematurely closed<br>
> connection while reading response header from upstream, client: 127.0.0.1,<br>
> server: localhost, request: "PUT /index.php HTTP/1.1", upstream: "fastcgi://<br>
> <a href="http://127.0.0.1:9902" target="_blank">127.0.0.1:9902</a>", host: "127.0.0.1:8080”<br>
> …………..<br>
><br>
> 2014/06/17 21:57:49 [debug] 61130#0: *9 http next upstream, 2<br>
> 2014/06/17 21:57:49 [debug] 61130#0: *9 http upstream request: "/index.php?"<br>
> 2014/06/17 21:57:49 [debug] 61130#0: *9 http upstream send request handler<br>
> 2014/06/17 21:57:49 [debug] 61130#0: *9 http upstream send request<br>
> 2014/06/17 21:57:49 [debug] 61130#0: *9 chain writer buf fl:0 s:584<br>
> 2014/06/17 21:57:49 [debug] 61130#0: *9 chain writer buf fl:0 s:32768<br>
> <— here<br>
> 2014/06/17 21:57:49 [debug] 61130#0: *9 chain writer buf fl:0 s:8<br>
> 2014/06/17 21:57:49 [debug] 61130#0: *9 chain writer buf fl:0 s:65536<br>
> <— here<br>
> 2014/06/17 21:57:49 [debug] 61130#0: *9 chain writer buf fl:0 s:8<br>
> 2014/06/17 21:57:49 [debug] 61130#0: *9 chain writer buf fl:0 s:90833<br>
> <— here<br>
> 2014/06/17 21:57:49 [debug] 61130#0: *9 chain writer buf fl:0 s:15<br>
> …………..<br>
><br>
> Before 9902 failed, the request body was sent correctly in bufs sized<br>
> 32768, 32768 and 25297(totally 90833), but after 9902 failed, the upstream<br>
> module retried sending body with size 32768, 65536 and 90833. Maybe<br>
> something was wrong here.<br>
><br>
> I guess after receiving the former 32768 bytes of the second buf(65536),<br>
> php-fpm tries to locate a new fastcgi header but failed, for the data right<br>
> behind is the body data of the image but a pre-constructed fastcgi header.<br>
> So, it mislead php-fpm to think of receiving the data end.<br>
><br>
> Refer to the source code, i also found why this happen.<br>
><br>
</div></div>> *<a href="https://github.com/nginx/nginx/blob/v1.5.12/src/http/ngx_http_upstream.c#L1441" target="_blank">https://github.com/nginx/nginx/blob/v1.5.12/src/http/ngx_http_upstream.c#L1441</a><br>
> <<a href="https://github.com/nginx/nginx/blob/v1.5.12/src/http/ngx_http_upstream.c#L1441" target="_blank">https://github.com/nginx/nginx/blob/v1.5.12/src/http/ngx_http_upstream.c#L1441</a>>*<br>
<div class="">><br>
> In the ngx_http_upstream_reinit function, cl->buf->file_pos are all reset<br>
> to 0 for every buf in the output chain. But i think file_post should be<br>
> reset to 0, 32768, 65536 instead.<br>
><br>
> PS: the output chain is initiated here with buf->file_pos = 0, 32768,<br>
> 65536...<br>
</div>> *<a href="https://github.com/nginx/nginx/blob/v1.5.12/src/http/modules/ngx_http_fastcgi_module.c#L1085" target="_blank">https://github.com/nginx/nginx/blob/v1.5.12/src/http/modules/ngx_http_fastcgi_module.c#L1085</a><br>

> <<a href="https://github.com/nginx/nginx/blob/v1.5.12/src/http/modules/ngx_http_fastcgi_module.c#L1085" target="_blank">https://github.com/nginx/nginx/blob/v1.5.12/src/http/modules/ngx_http_fastcgi_module.c#L1085</a>>*<br>

<div class="">><br>
> Is this the reason that cause the problem?<br>
</div>[..]<br>
<br>
Yes, you're right.  Thank you for the report.<br>
<br>
Please, try this patch:<br>
<br>
diff -r 25ade23cf281 src/http/modules/ngx_http_fastcgi_module.c<br>
--- a/src/http/modules/ngx_http_fastcgi_module.c        Wed Jun 04 15:09:19 2014 +0400<br>
+++ b/src/http/modules/ngx_http_fastcgi_module.c        Wed Jun 18 18:25:20 2014 +0400<br>
@@ -1126,6 +1126,13 @@ ngx_http_fastcgi_create_request(ngx_http<br>
                     len = (ngx_uint_t) (pos - b->pos);<br>
                 }<br>
<br>
+                b->shadow = ngx_alloc_buf(r->pool);<br>
+                if (b->shadow == NULL) {<br>
+                    return NGX_ERROR;<br>
+                }<br>
+<br>
+                ngx_memcpy(b->shadow, b, sizeof(ngx_buf_t));<br>
+<br>
                 padding = 8 - len % 8;<br>
                 padding = (padding == 8) ? 0 : padding;<br>
<br>
diff -r 25ade23cf281 src/http/ngx_http_upstream.c<br>
--- a/src/http/ngx_http_upstream.c      Wed Jun 04 15:09:19 2014 +0400<br>
+++ b/src/http/ngx_http_upstream.c      Wed Jun 18 18:25:20 2014 +0400<br>
@@ -1568,8 +1568,14 @@ ngx_http_upstream_reinit(ngx_http_reques<br>
     /* reinit the request chain */<br>
<br>
     for (cl = u->request_bufs; cl; cl = cl->next) {<br>
-        cl->buf->pos = cl->buf->start;<br>
-        cl->buf->file_pos = 0;<br>
+<br>
+        if (cl->buf->shadow) {<br>
+            ngx_memcpy(cl->buf, cl->buf->shadow, sizeof(ngx_buf_t));<br>
+<br>
+        } else {<br>
+            cl->buf->pos = cl->buf->start;<br>
+            cl->buf->file_pos = 0;<br>
+        }<br>
     }<br>
<br>
     /* reinit the subrequest's ngx_output_chain() context */<br>
<br>
</blockquote></div><br></div>