为什么要在Catalyst/Plack/Starman中使用nginx?

24

我正在尝试使用Plack/Starman部署我的小型Catalyst Web应用程序。所有文档似乎都建议我与nginx一起使用。这样做的好处是什么?为什么不直接在80端口上使用Starman?

3个回答

39

这里不一定特指nginx,但你需要某种类型的前端服务器代理来连接你的应用服务器,原因如下:

  1. 这样你就可以将Catalyst服务器作为普通用户在高端口上运行,同时在80端口上运行前端服务器。

  2. 可以在不占用perl进程的情况下服务于静态文件(例如图片、JS、CSS等常规资源以及任何您可能想使用X-Sendfile或X-Accel-Redirect下载的文件)。

  3. 如果你想要进行更复杂的配置,比如使用Edge Side Includes功能,或者直接从memcached或mogilefs中提供web服务(这两个功能nginx都可以实现),或者进行负载平衡/高可用性配置等,使用前端服务器作为代理会更加容易。


1
我有一个后续问题,Hobbs:如果你正在使用像Dancer或Catalyst这样的框架,为什么还需要Starman呢?难道你不能只将请求发送到Plack / Dancer提供的默认服务器吗? - Vijay Boyapati
3
如果您在没有使用“-f”或“-k”选项的情况下运行服务器脚本,Dancer使用的默认服务器以及 Catalyst 使用的服务器只能一次处理一个请求,因此对于生产环境来说并不太适用。另一方面,如果您使用“-f”选项运行Catalyst服务器脚本,它将使用Starman :) - hobbs
1
啊,太好了!这终于澄清了我一直试图理解的最后一件事。我在这里写了关于nginx/starman/dancer堆栈的解释(如果您有任何我错过的额外评论/见解,我会非常感激):https://dev59.com/H2ct5IYBdhLWcg3wZMjn - Vijay Boyapati

9
我在 #plack 上询问了这个问题,并从 @nothingmuch 得到了以下回复(我添加了格式):

使用 nginx,您可以设置负载均衡/故障转移等。如果网站规模较小/简单,则可能过度设计。

我不知道 Starman 可能会有什么缺点。也许如果您有许多静态文件点击,nginx 将使用更少的 CPU/内存来处理它们,但在典型的 Web 应用程序中,这不太可能有显著影响。大型下载可能会占用 Starman 工作进程进行静态文件下载。(也许不需要,因为有 sendfile。)这就是我能想到的全部。

...如果您想进行无停机时间的升级,故障转移设置可能很好用。(“失败”旧版本。)


3
另一个原因是轻量级前端服务器(即使是Apache)每个连接消耗的内存比典型的Starman进程少得多(几MB而不是十几MB或100MB以上)。由于连接开放一段时间,特别是如果要使用keep-alive连接,则可以通过更少的RAM支持大量同时连接。只需确保代理前端服务器的缓冲区大小足够从后端立即加载典型的HTTP响应即可。然后,后端就可以自由地处理下一个请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接