是否有Perl PSGI / Plack服务器只能说PSGI而不是HTTP?

时间:2018-02-08 12:29:25

标签: perl nginx psgi

通常的部署过去和现在都像我一样:

+------------------+     +---------+ tcp +-------+ tcp
| PSGI Application |----o| Starman |---->| nginx |<----(internet)
+------------------+     +---------+     +-------+

事实上,我确实在互联网和实际的Web应用程序之间有两个完全成熟的Web服务器。

由于nginx直接内置uWSGI而且uWSGI支持PSGI协议,这是WSGI的一个分支,我很乐意使用PSGI代理(只有PSGI没有HTTP)而不是完整的Web服务器(Starman)。

是否有PSGI-only-broker解决方案?

1 个答案:

答案 0 :(得分:3)

PSGI 'protocol'(如WSGI)本质上是子例程的调用约定。请求作为子例程调用进入应用程序,并将哈希作为参数。应用程序通过子例程的返回值进行响应:包含HTTP状态代码,HTTP标头和正文的arrayref。除此之外还有更多,但这些都是必需品。

这意味着如果进程包含Perl解释器,进程只能实现PSGI。为了实现这一点,该过程可以在Perl中实现,也可以用C语言实现,可以加载libperl.so共享库。类似地,如果进程包含Python解释器,则进程只能实现WSGI。

您的程序框图包含三个部分,但实际上PSGI应用程序位于Starman流程中。所以实际上只有两个部分(尽管两个部分都是多处理容器)。

你说“nginx将uWSGI直接构建在”中。这并不意味着WGSI应用程序在Nginx进程内运行。这意味着WSGI应用程序在单独的uwsgi进程中运行,Nginx使用uWSGI协议通过TCP套接字与该进程通信。这基本上与Nginx和Starman背后的模型相同,但区别在于与Starman的套接字连接将使用HTTP协议:

.----------------------.          .-----------.
|       Starman        |          |   Nginx   |
|                      |   HTTP   |           |   HTTP
| .------------------. |<---------|           |<-------(internet)
| | PSGI Application | |          |           |
| '------------------' |          |           |
'----------------------'          '-----------'

HTTP协议确实比uWSGI协议具有更高的开销,因此您可以通过运行说出uWSGI套接字协议的应用程序服务器来获得更好的性能,并且可以加载libperl.so来实现PSGI接口。 uWSGI can do that

.----------------------.           .----------.
|        uWSGI         |           |  Nginx   |
|                      |   uWSGI   |          |   HTTP
| .------------------. |<----------|          |<-------(internet)
| | PSGI Application | |           |          |
| '------------------' |           |          |
'----------------------'           '----------'