nginx和Perl:FastCGI vs反向代理(PSGI / Starman)

24
现在运行Perl Web应用程序的一个非常流行的选择似乎是使用nginx web服务器代理请求到FastCGI守护进程或启用了PSGI的Web服务器(例如Starman)。一般来说,人们一直在问为什么要这样做(例如为什么要使用Catalyst/Plack/Starman与nginx?),答案似乎适用于两种情况(例如允许nginx提供静态内容,轻松重启应用程序服务器,负载平衡等)。
然而,我特别关注使用FastCGI与反向代理方法的优缺点。似乎广泛认为Starman是最快和最好的Perl PSGI应用程序/Web服务器,我很难看出使用FastCGI的任何优势。这两种方法都支持:
  • UNIX域套接字以及TCP套接字
  • fork/process manager风格的服务器以及非阻塞事件驱动(例如AnyEvent)服务器。
  • 信号处理/优雅重启
  • PSGI
同样,任何一种选项的nginx配置非常相似。
那么你为什么会选择其中一种呢?
2个回答

17
一种反向代理设置 (例如 nginx 将 HTTP 请求转发到 Starman) 具有以下优点:
  • 调试更加容易,因为可以直接访问后端服务器;

  • 如果需要扩展后端服务器,可以轻松使用像 pound/haproxy 这样的工具在前端 (静态服务的 HTTP) 和后端 (通常部署 Zope) 之间进行负载均衡;

  • 如果您还使用一些向外面开放的缓存逆向代理 (如 Varnish 或 Squid),它可以是一个很好的辅助工具,因为它允许非常容易地绕过它。

然而,它也有以下缺点:

  • 后端服务器必须确定真实的来源 IP,因为它看到的只是前端服务器地址(通常是本地); 在 HTTP 标头中几乎没有容易找到客户端 IP 地址的方法,但这是需要额外解决的问题;

  • 后端服务器通常不知道原始 "Host:" HTTP 标头,因此无法自动生成指向本地资源的绝对 URL; Zope 使用特殊的 URL 将原始协议、主机和端口嵌入到请求中来解决这个问题,但使用 FastCGI/Plack/... 则不需要这样做;

  • 前端无法像使用 FastCGI 时那样自动启动后端进程。

选择你最喜欢的优缺点并作出选择,我想;-)


13
原始客户端IP地址通过X-Forwarded-For头传递,原始主机头通过X-Forwarded-Host头传递,因此前两个缺点不重要。 - marpetr
+1 感谢比较。由于可以运行一个主进程来管理后端进程和线程,第三点不是问题。你提出了一个有趣的观点,关于Zope以及如何获取原始客户端IP和主机名以构建有效的URL。 - Viet

1

HTTP被大多数系统管理员所熟知,且易于调试。几乎总会有某种反向代理已经部署好了,因此只需在其配置中添加另一个配置段就能够在几秒钟内使您的应用程序运行起来。我从未测试过两个设置之间的速度差异,但另一方面,我从未在这个领域遇到任何问题,所以问题不会很严重。


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