problems when use fastcgi_pass to deliver request to backend

Alexey Ivanov savetherbtz at gmail.com
Mon Jun 1 00:45:46 UTC 2015


If your backend can’t handle 10k connections then you should limit them there. Forwarding requests to the backend that can not handle the request is generally a bad idea[1] an it is usually better to fail the request or make them wait for a available backend on proxy itself.

Nginx can retry requests if it gets timeout or RST (connection refused) from a backend[2]. That combined with tcp_abort_on_overflow[3], listen(2) backlog argument and maybe some application limits should be enough to fix your problem.

[1] http://genius.com/James-somers-herokus-ugly-secret-annotated
[2] http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream
[3] https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

> On May 29, 2015, at 3:48 AM, 林谡 <linsu at feinno.com> wrote:
> 
> Thanks for reply,
> I had read all the Discussions you suggested.
> The main reason is  that  multiplexing seems useless when using “keep alive” feature and backend is fast enough.
> It’s true!  But real world is more sophisticated.
> 
> Our system is very big, and over 5k machines are providing services. In Our system, nginx proxy_pass  http request to http applications by using “keep alive”, it works well,  over 10 k requests were processed  per second and  tcp connections between nginx and backend were blow 100. But, sometimes, response time become 1-10s or more for a while, because maybe a db server fail over or network shrink.  Over 10k tcp connection need to be setup as we see.
> our backend is written by java, connections cannot be setup all a sudden, and memory needed is big , GC collections became bottleneck, GC keep on working even if db server or network resumed to normal, and backend server did not work orderly any more, I observed these things several times.
> 
>       If multiplexing, no more connections are needed and memory needed is far small under such a circumstance. We use multiplexing everywhere in our java applications, It can prove my idea.
> 
>       Nginx is needed for sure for client http access, so I study fastcgi to solve above problem, but nginx does support fastcgi multiplexing, which can trigger the same problem.
> 
>       As a conclusion, a big production system really need that nginx pass request to backend by multiplexing. Can you make nginx developing team work on it?
> 
> 
> 
> 发件人: Sergey Brester [mailto:serg.brester at sebres.de]
> 发送时间: 2015年5月29日 16:40
> 收件人: nginx-devel at nginx.org
> 抄送: 林谡
> 主题: Re: 答复: problems when use fastcgi_pass to deliver request to backend
> 
> Hi,
> 
> It's called fastcgi multiplexing and nginx currently does not implement that (and I don't know .
> 
> There were already several discussions about that, so read here, please.
> 
> Short, very fast fastcgi processing may be implemented without multiplexing (should be event-driven also).
> 
> Regards,
> sebres.
> 
> 
> 
> Am 29.05.2015 09:58, schrieb 林谡:
> 
> 
>         /* we support the single request per connection */
> 2573
> 
> 2574
>         case ngx_http_fastcgi_st_request_id_hi:
> 2575
>             if (ch != 0) {
> 2576
>                 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
> 2577
>                               "upstream sent unexpected FastCGI "
> 2578
>                               "request id high byte: %d", ch);
> 2579
>                 return NGX_ERROR;
> 2580
>             }
> 2581
>             state = ngx_http_fastcgi_st_request_id_lo;
> 2582
>             break;
> 2583
> 
> 2584
>         case ngx_http_fastcgi_st_request_id_lo:
> 2585
>             if (ch != 1) {
> 2586
>                 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
> 2587
>                               "upstream sent unexpected FastCGI "
> 2588
>                               "request id low byte: %d", ch);
> 2589
>                 return NGX_ERROR;
> 2590
>             }
> 2591
>             state = ngx_http_fastcgi_st_content_length_hi;
> 2592
>             break;
> By reading source code, I saw the reason , so can nginx support multi request per connection in future?
> 
> 发件人: 林谡
> 发送时间: 2015年5月29日 11:37
> 收件人: 'nginx-devel at nginx.org'
> 主题: problems when use fastcgi_pass to deliver request to backend
> 
> Hi,
>          I write a fastcgi server and use nginx to pass request to my server. It works till now.
>          But I find a problem. Nginx always set requestId = 1 when sending fastcgi record.
>          I was a little upset for this, cause according to fastcgi protocol, web server can send fastcgi records belonging to different request simultaneously, and  requestIds are different and keep unique. I really need this feature, because  requests can be handled simultaneously just over one connetion.
>          Can I find a way out?
> 
> 
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 842 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20150531/d41276b4/attachment.bin>


More information about the nginx-devel mailing list