是否有可用的 Perl PSGI/Plack 服务器只支持 PSGI 而不能支持 HTTP?

Is there a Perl PSGI/Plack server available that only speaks PSGI and not also HTTP?

过去和现在的常规部署对我来说如下所示:

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

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

由于 nginx 直接内置了 uWSGI 并且 uWSGI 支持 PSGI 协议,它是 WSGI 的一个分支,我很想使用 PSGI-broker(只有 PSGI 没有 HTTP)而不是一个完整的网络服务器(Starman ).

是否有可用的 PSGI-only 代理解决方案?

PSGI 'protocol'(类似于 WSGI)本质上是子程序的调用约定。请求以散列作为参数作为子例程调用进入应用程序。应用程序通过子例程的 return 值进行响应:包含 HTTP 状态代码、HTTP headers 和 body 的数组引用。不仅如此,但这些都是必需品。

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

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

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

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

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

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