【发布时间】:2012-01-19 05:19:56
【问题描述】:
主要的 Web 框架(如 Django、Pyramid、Rails 等)通常作为持久性服务器运行,并使用单独的 Web 服务器(如 nginx)作为前端。 Web 服务器通过 FastCGI 或 SCGI 等协议连接:
browser --[http]--> nginx --[fastcgi]--> flup -> django
这对我来说似乎很复杂;为什么请求转换为完全不同的协议,而后端可以运行自己的 HTTP 服务器?
browser --[http]--> nginx --[http]--> wsgiref -> django
这种方法似乎更简单也更灵活,因为只有一个传输协议,而且是 RFC。
但是,我认为我曾经见过一个 web 框架鼓励仅 http 的设计,所以我认为这一定是有原因的。
在这里使用像 FastCGI/SCGI 这样的协议有什么好处?
【问题讨论】:
-
C++/C 在任何一天都可能胜过那些调试服务器。大多数(全部?)这些网络框架都是用 Python 或 Ruby 编码的,它们是解释性语言。
-
@Blender:虽然是真的,但这可能不相关。我不希望通过 FastCGI 提供服务的 Django 比通过 HTTP 提供服务的 Django 更快或更慢。此外,Python 和 Ruby 都不会被解释。他们使用字节码虚拟机,方式类似于 Java。
-
好点。我正在努力让 Flask 与 Lighty 一起工作......另外,吹毛求疵,但在 Python 主页上它声明
... an interpreted, interactive, object-oriented... -
是的;该描述可能是从它被解释时开始的。我知道 2.x 编译为字节码,但也许 1.x 不同。
-
我似乎记得 Pylons/Pyramid “标准”推荐的设置至少是 HTTP-only,使用 Apache 或 nginx 作为反向代理,正如您在此处描述的那样。 Django 的文档似乎也将 *CGI 视为二等公民:“许多人使用共享主机,在共享主机上,FastCGI、SCGI 或 AJP 等协议是唯一可行的选择。”