通常的部署过去和现在都像我一样:
+------------------+ +---------+ tcp +-------+ tcp
| PSGI Application |----o| Starman |---->| nginx |<----(internet)
+------------------+ +---------+ +-------+
事实上,我确实在互联网和实际的Web应用程序之间有两个完全成熟的Web服务器。
由于nginx直接内置uWSGI而且uWSGI支持PSGI协议,这是WSGI的一个分支,我很乐意使用PSGI代理(只有PSGI没有HTTP)而不是完整的Web服务器(Starman)。
是否有PSGI-only-broker解决方案?
答案 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 | | | |
| '------------------' | | |
'----------------------' '----------'