首页 > 解决方案 > FastCGI中的“多路复用”是什么意思?

问题描述

FastCGI 规范的附录 B给出了一个多路复用的例子,其中未缩进的行是由客户端(例如 Nginx)发送的,而缩进的行是由 FastCGI 服务器发送的:

{FCGI_BEGIN_REQUEST,   1, {FCGI_RESPONDER, FCGI_KEEP_CONN}}
{FCGI_PARAMS,          1, "\013\002SERVER_PORT80\013\016SERVER_ADDR199.170.183.42 ... "}
{FCGI_PARAMS,          1, ""}
{FCGI_BEGIN_REQUEST,   2, {FCGI_RESPONDER, FCGI_KEEP_CONN}}
{FCGI_PARAMS,          2, "\013\002SERVER_PORT80\013\016SERVER_ADDR199.170.183.42 ... "}
{FCGI_STDIN,           1, ""}
    {FCGI_STDOUT,      1, "Content-type: text/html\r\n\r\n"}
{FCGI_PARAMS,          2, ""}
{FCGI_STDIN,           2, ""}
    {FCGI_STDOUT,      2, "Content-type: text/html\r\n\r\n<html>\n<head> ... "}
    {FCGI_STDOUT,      2, ""}
    {FCGI_END_REQUEST, 2, {0, FCGI_REQUEST_COMPLETE}}
    {FCGI_STDOUT,      1, "<html>\n<head> ... "}
    {FCGI_STDOUT,      1, ""}
    {FCGI_END_REQUEST, 1, {0, FCGI_REQUEST_COMPLETE}}

据我了解,在上述的非多路复用版本中,FastCGI 客户端(例如 Nginx)将在发送与请求 2 相关的任何内容之前发送请求 1:

(图2):

{FCGI_BEGIN_REQUEST,   1, {FCGI_RESPONDER, FCGI_KEEP_CONN}}
{FCGI_PARAMS,          1, "\013\002SERVER_PORT80\013\016SERVER_ADDR199.170.183.42 ... "}
{FCGI_PARAMS,          1, ""}
{FCGI_STDIN,           1, ""}
    {FCGI_STDOUT,      1, "Content-type: text/html\r\n\r\n"}
    {FCGI_STDOUT,      1, "<html>\n<head> ... "}
    {FCGI_STDOUT,      1, ""}
    {FCGI_END_REQUEST, 1, {0, FCGI_REQUEST_COMPLETE}}
{FCGI_BEGIN_REQUEST,   2, {FCGI_RESPONDER, FCGI_KEEP_CONN}}
{FCGI_PARAMS,          2, "\013\002SERVER_PORT80\013\016SERVER_ADDR199.170.183.42 ... "}
{FCGI_PARAMS,          2, ""}
{FCGI_STDIN,           2, ""}
    {FCGI_STDOUT,      2, "Content-type: text/html\r\n\r\n<html>\n<head> ... "}
    {FCGI_STDOUT,      2, ""}
    {FCGI_END_REQUEST, 2, {0, FCGI_REQUEST_COMPLETE}}

我的理解正确吗?

我在几个地方读到 Nginx 不支持 FastCGI 的多路复用:

但是,这似乎与多线程 FastCGI App相矛盾,其中提到 Nginx 在发送第二个请求之前不会等待第一个请求的响应,如下所示:

(图 3):

{FCGI_BEGIN_REQUEST,   1, {FCGI_RESPONDER, FCGI_KEEP_CONN}}
{FCGI_PARAMS,          1, "\013\002SERVER_PORT80\013\016SERVER_ADDR199.170.183.42 ... "}
{FCGI_PARAMS,          1, ""}
{FCGI_STDIN,           1, ""}
{FCGI_BEGIN_REQUEST,   2, {FCGI_RESPONDER, FCGI_KEEP_CONN}}
{FCGI_PARAMS,          2, "\013\002SERVER_PORT80\013\016SERVER_ADDR199.170.183.42 ... "}
{FCGI_PARAMS,          2, ""}
{FCGI_STDIN,           2, ""}

在这一点上我很困惑,因为据我了解,非多路复用版本一次只能处理一个请求(即接收请求,并在处理下一个请求之前发送该请求的响应)。多路复用的具体含义是什么?尤其是:

请注意,我是网络和 FastCGI 的新手。

标签: nginxfastcgimultiplexing

解决方案


在没有多路复用的情况下,nginx在收到新请求时只是简单地与 fastcgi 侦听套接字建立新连接。多个请求以任何顺序并行处理,但每个连接一次只承载一个请求的数据。这与 HTTP/1 和许多其他协议的处理方式完全相同。


推荐阅读