关注SCGI,一种更佳的高性能CGI方案

作者: nick 分类: php 发布时间: 2010-10-13 01:52 ė 61条评论

目前,rubyonrails可以采用服务器方案有:
1。 Webrick
2。 Apache(lighttpd) + CGI
3。 Apache+FastCGI
4。 Lighttpd + FastCGI
5。 Apache(lighttpd)+SCGI

其 中,Webrick是一个玩具,不支持并发请求,只能作为开发工具进行调试。而CGI方式就直接踢出,在性能上是难以忍受的。 FastCGI虽然性能卓越(据称是传统CGI程序的5倍),但是在Apache中非常不稳定,经常会出现500错误。相对来说 Lighttpd+FastCGI的方案比较稳定,性能也不错,但lighttpd毕竟不是一个十分流行的http服务器,大部分人都不熟悉此服务,扩展 模块也相对较少,另外似乎还有些bug,没有apache那么健壮。
在这几个方案中能够兼具高性能和高稳定性的莫过于Apache+SCGI方 案。SCGI是用来替换传统CGI的新的CGI协议,以Client/Server的方式实现,具有和FastCGI一样优秀的性能,同时又在稳定性方面 远远超过FastCGI, 该方案在Python Web领域应用较多。
一般搭建一个SCGI环境需要准备,Apache,mod_scgi, scgi runner等软件,其中apache做为前端http服务器处理用户请求并且负责静态文件,而mod_scgi是apache的一个扩展模块,该模块实 现了SCGI协议的client部分,负责将http请求中的动态部分发给SCGI服务器,即SCGI Runner,在rubyonrails社区,已经有人开发了SCGI Rails Runner–SRR,只需要将一个脚本放你的rails程序的script目录中,运行该脚本就会建立一个SCGI Server,等待并且处理SCGI Client(mod_scgi)转发的请求。
对SCGI有兴趣的朋友,可以查看这些内容:
http://www.mems-exchange.org/software/scgi/
http://www.zedshaw.com/projects/scgi_rails/

另 外,由于RubyOnRails特殊的url rewrite机制,官方目前提供的apache配置模板可能会使一些看起来是静态文件的url无法被rubyonrails处理,如typo里的 rss: /xml/rss.xml,不过,rails社区的Kyle等人已经搞出了两个方案,而SRR的作者也打算采用他们的方案。当然,一般情况下,使用官方的 配置模板就已经能够处理大部分url。对这个问题有兴趣的朋友可以在rails的邮件列表中搜索:scgi apache, 最近的几篇邮件应该有提到。

什么是SCGI

SCGI(Simple Common Gateway Interface),简单通用网关接口。是CGI的替代协议,与FastCGI相似,但更简单。据测试SCGI实现的效率比CGI和FastCGI更高,也更稳定。
SCGI和CGI一样,分为客户端和服务器端。客户端放在http服务器侧。如apache有mod_scgi,lighthttpd有内置的SCGI支持。目前(2008.12.29)最新版本 scgi 1.13, 服务器实现是python,但放在http服务器侧的客户端实现是C语言。

标准原版:http://python.ca/scgi/protocol.txt
协议中,ASCII字符可以用< >括起来的16进制数字表示,也可以引号””括起来的ASCII表示。
报文由报头和报体组成。报头格式:

headers ::= header*
header ::= name NUL value NUL
name ::= notnull+
value ::= notnull*
notnull ::= <01> | <02> | <03> | … | <ff>
NUL = <00>

报头中不允许重复命名。首个报头必须名为”CONTENT_LENGTH”,
且其值为非空的ASCII数字序列,以十进制数形式给出了报文主体的长度。
“CONTENT_LENGTH”报头必须总是存在,即使其值为”0″。
同时必须始终有名为”SCGI”且值为”1″的报头。
为了便于从CGI的迁移,标准CGI环境变量应该作为SCGI报头提供。

报头采用Netstring编码。格式为“整个报文长度字符串:报头,报体”
如下的示例:

web服务器(一个SCGI客户端)打开一个连接,发送下面字符串的拼接:

“70:”
“CONTENT_LENGTH” <00> “27” <00>
“SCGI” <00> “1” <00>
“REQUEST_METHOD” <00> “POST” <00>
“REQUEST_URI” <00> “/deepthought” <00>
“,”
“What is the answer to life?”

这是一个Netstring编码的报头+报体。开头的70表示报文长度70个8位。<00>表示0结尾的字符串。用“,”隔开报头和报体。

SCGI服务器发送下面的响应:

“Status: 200 OK” <0d 0a>
“Content-Type: text/plain” <0d 0a>
“” <0d 0a>
“42”

<0d 0a>表示换行。
SCGI服务器关闭连接。

参考:

本文出自 传播、沟通、分享,转载时请注明出处及相应链接。

本文永久链接: https://www.nickdd.cn/?p=1111

发表评论

您的电子邮箱地址不会被公开。

Ɣ回顶部