node–fastcgi
该模块是节点标准HTTP模块(仅服务器)的替换。为HTTP服务器编写的代码应在不使用FastCGI更改的情况下使用。它可用于构建FASTCGI应用程序或将现有节点应用程序转换为FastCGI。
该实现完全符合FastCGI 1.0规范。
例子
var fcgi = require ( \'node-fastcgi\' ) ; fcgi . createServer ( function ( req , res ) { if ( req . method === \'GET\' ) { res . writeHead ( 200 , { \'Content-Type\' : \'text/plain\' } ) ; res . end ( \"It\'s working\" ) ; } else if ( req . method === \'POST\' ) { res . writeHead ( 200 , { \'Content-Type\' : \'text/plain\' } ) ; var body = \"\" ; req . on ( \'data\' , function ( data ) { body += data . toString ( ) ; } ) ; req . on ( \'end\' , function ( ) { res . end ( \"Received data:\\n\" + body ) ; } ) ; } else { res . writeHead ( 501 ) ; res . end ( ) ; } } ) . listen ( ) ;
服务器构造函数
createServer函数采用四个可选参数:
-
responder:FastCGI响应者请求的回调(正常的HTTP请求,\'request\'事件的侦听器)。 -
authorizer:FASTCGI授权者请求的回调(\'authorize\'事件的侦听器) -
filter:FastCGI过滤器请求的回调(\'filter\'事件的侦听器) -
config:服务器配置
config是一个具有以下默认值的对象:
{ maxConns : 2000 , maxReqs : 2000 , multiplex : true , valueMap : { } }
maxConns是服务器接受的最大连接数。该限制未执行,仅在通过FCGI_GET_VALUES记录查询时才用于提供FCGI_MAX_CONNS值。
maxReqs是服务器接受的总共请求的最大数量(在所有连接上)。限制并不是执行的,但是合规的客户应该尊重它,因此不要将其设置得太低。此设置用于提供FCGI_MAX_REQ值。
multiplex启用或禁用单个连接上的请求多路复用。此设置用于提供FCGI_MPXS_CONNS值。
valueMap映射fastcgi值名称为config对象中的键。有关更多信息,请阅读下一节
FastCGI值
FastCGI客户端可以使用FCGI_GET_VALUES记录从应用程序查询配置值。这些记录包含一系列具有空值的键值对;应用程序必须获取每个键的相应值,并将数据发送回客户端。
该模块从服务器配置中自动检索标准键( FCGI_MAX_CONNS , FCGI_MAX_REQS , FCGI_MPXS_CONNS )的值。
要提供其他值,请将它们添加到配置对象中,然后将条目添加到valueMap选项映射值名称中的配置对象中的键。例如:
fcgi . createServer ( function ( req , res ) { /* ... */ } , { additionalValue : 1350 , valueMap : { \'ADDITIONAL_VALUE\' : \'additionalValue\' } } ) ;
警告: valueMap API是一个糟糕的设计选择,将来将会改变。
聆听连接
启动FASTCGI服务时,STDIN描述符(FD 0)被绑定套接字替换。然后,服务应用程序可以开始在该插座上侦听并接受连接。
当您在没有参数的情况下或以回调为唯一的参数listen ,请自动完成此操作。
提供了isService函数以检查是否可以在没有参数的情况下调用侦听方法。警告:该功能始终在Windows上返回False。
if ( fcgi . isService ( ) ) { fcgi . createServer ( /* ... */ ) . listen ( ) ; } else { console . log ( \"This script must be run as a FastCGI service\" ) ; }
请求URL组件
请求对象的url属性取自非标准的REQUEST_URI CGI变量。如果REQUEST_URI丢失,则通过连接三个CGI变量来构建URL:
-
SCRIPT_NAME -
PATH_INFO -
QUERY_STRING
有关更多信息,请阅读CGI规格的第4.1节。
可以通过套接字对象的params属性访问RAW CGI变量。更多信息在这里。
授权和过滤器请求
授权者请求可能没有URL。授权者角色的响应对象随附已设置为text/plain Content-Type标头,并揭示了三种其他方法:
-
setVariable(name, value):设置要将CGI变量传递到后续请求处理程序。 -
allow():发送200(OK)状态代码并关闭响应 -
deny():发送403(禁止)状态代码并关闭响应
滤波器请求具有套接字对象的dataStream属性( req.socket.dataStream )的附加数据流。
插座对象
在请求和响应中暴露的套接字对象实现了stream.Duplex接口。它揭示了Fastcgi stdin流(请求主体),并将其转换为STDOUT FASTCGI记录。该对象还模拟了net.Socket的公共API。地址字段包含HTTP服务器和客户端地址和端口( localAddress , localPort , remoteAddress , remotePort属性和address方法)。
插座对象公开了三个其他属性:
-
params是RAW CGI参数的字典。 -
dataStream实施stream.Readable,揭示过滤器角色的FastCGI数据流。 -
errorStream实施stream.Writable可靠,将写入写入stderr fastcgi记录。
HTTP模块兼容性
API几乎与Node V0.12的HTTP模块兼容,一直到V6.X(当前系列)。仅实现服务器API。
差异:
- FastCGI服务器将永远不会发出
\'checkContinue\'和\'connect\'事件,因为CONNECT方法和Expect: 100-continue标题应由前端HTTP服务器处理 - 目前尚未实施
\'upgrade\'事件。通常,由于输入/输出缓冲,升级/Websocket请求无法与FastCGI应用程序一起使用。 - 可以在没有参数(或以回调为唯一的参数)的情况下调用
server.listen()以在默认的fastcgi套接字上侦听{ fd: 0 }。 -
server.maxHeadersCount是没有用的 -
req.socket不是真正的套接字。 -
req.trailers将始终为空:CGI脚本永远不会收到预告片 -
res.writeContinue()可以按预期工作,但不应使用。请参阅第一个项目
执照
麻省理工学院许可证(MIT)
版权(C)2016 Fabio Massaioli和其他贡献者
特此免费获得许可,免费授予任何获得此软件副本和相关文档文件(“软件”)的人,以无限制地处理软件,包括无限制的使用权,复制,复制,修改,合并,发布,分发,分发,分发,分配,sublicense和/或允许软件允许与以下条件相关的软件,以下是以下条件。
上述版权通知和此许可通知应包含在软件的所有副本或大量部分中。
该软件是“原样”提供的,没有任何形式的明示或暗示保证,包括但不限于适销性,特定目的的适用性和非侵权的保证。在任何情况下,作者或版权持有人都不应对任何索赔,损害赔偿或其他责任责任,无论是在合同,侵权的诉讼中还是其他责任,是由软件,使用或与软件中的使用或其他交易有关的。
