本文介绍如何利用Node.js FastCGI插件将IBM HTTP Server for i与Node.js关联。 本文介绍了本地和远程关联。 此外,本文中的一个简单Node.js示例说明了如何使用HTTP Server身份验证机制来保护和保护应用程序。 本文提供了设置环境的分步指南。
Node.js是基于Google Chrome V8引擎的开源项目。 它为无需浏览器即可运行的服务器端JavaScript应用程序提供了一个平台。 现在在IBM i平台上支持Node.js。 要开始在IBM i上使用Node.js,建议阅读这篇文章, 在IBM i上使用Node.js的本机JavaScript应用程序 。
注意:Node.js是Joyent的正式商标。
FastCGI是一种开放标准的,独立于语言且与通用网关接口(CGI)类似的协议,用于将交互程序与Web服务器接口。 开源Node.js FastCGI附加组件已在IBM i上启用。 这使IBM i上的Node.js能够通过FastCGI协议与其他服务器进行通信。 多年来,我们已经为超文本预处理器(PHP)生态系统提供了支持。 有关IBM i上FastCGI的更多详细信息,请参阅FastCGI 。
适用于i的IBM HTTP Server(由Apache支持)是一个完整的Web服务器产品,它提供了多个组件和功能来协助您进行网站配置和开发。 借助用于i的IBM HTTP Server(由Apache提供支持),您拥有快速轻松地建立Web展示所需要的一切,从而可以开始在企业网络上工作。
图1. Node.js FastCGI应用程序流程
软件先决条件
用于IBM i的Node.js打包为5733OPS的一部分,在IBM i 7.1和更高版本中受支持。 Node.js在此新的许可程序产品(LPO)的选项1中提供。 除了安装新的LPO之外,还需要一些其他软件程序才能在IBM i上使用Node.js和FastCGI附加组件。 FastCGI附加程序node-fastcgi包含在以下程序临时修订(PTF)组中。
- 所需的许可程序:
- 5733OPS,选项1-IBM i开源解决方案
- 5770SS1,选件33-便携式应用解决方案环境
- 5733SC1,选项1-OpenSSH,OpenSSL,zlib
- 5770DG1,* BASE –适用于i的IBM HTTP Server
- 必填组PTF
- IBM i 7.1 PTF组SF99368-级别34(或更高)
- IBM i 7.2 PTF组SF99713-级别8(或更高)
成功安装的先决条件之后,您需要安装的FastCGI附加, 节点的FastCGI,在/ QOpenSys / QIBM / ProdData /节点/ OS400 /节点FastCGI的目录。
在以下各节中,我们将创建一个HTTP Server实例,并使用FastCGI协议将其与Node.js应用程序关联。 最后,使用IBM i概要文件验证保护FastCGI应用程序。
HTTP Server实例的创建和配置
本节介绍HTTP服务器的配置。 首先,我们需要一个HTTP实例并对其进行配置,以加载IBM i FastCGI插件,以便它可以与后端FastCGI应用程序进行通信。
步骤1.创建一个HTTP Server实例。
可以轻松地使用i Web站点(http:// <your.server.name> :2001 / HTTPAdmin)创建IBM HTTP Server i实例。 请参阅IBM i知识中心,以获取有关如何为i创建HTTP Server实例的详细信息。
本文以一个名为HTTPSERV的HTTP实例为例。 它监听端口10036 ,根目录是/ www / httpserv 。
步骤2.使用FastCGI设置更新HTTP Server实例配置文件。
通过IBM Web Administration for i创建实例时,单击IBM Web Administration for i左面板中的“ 编辑配置文件” 。
在右侧的文本框中,将以下指令添加到配置文件的顶部,以加载HTTP Server FastCGI插件。
LoadModule zend_enabler_module /QSYS.LIB/QHTTPSVR.LIB/QZFAST.SRVPGM
添加以下两个指令以添加新处理程序“ FastCGI-script ”,以处理对扩展名为.jsx的文件的请求。
AddType application/x-httpd-javascript .jsx
AddHandler fastcgi-script .jsx
完整的配置文件httpd.conf如下所示。
LoadModule zend_enabler_module /QSYS.LIB/QHTTPSVR.LIB/QZFAST.SRVPGM
Listen *:10036
DocumentRoot /www/httpserv/htdocs
HotBackup Off
AddType application/x-httpd-javascript .jsx
AddHandler fastcgi-script .jsx
图2. FastCGI设置的HTTP配置文件
步骤3.更新实例的主页。
如下所示编辑/ www / httpserv / htdocs中的index.html文件。 这个简单的页面显示了一个接受IBM i系统值名称输入的文本框,以及一个运行查询的按钮。
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>FastCGI Example</title>
</head>
<style>
input {
height:30px;
width:200px;
text-align:center;
border:#ccc solid 1px
}
</style>
<body>
<form name="input" action="dspsysval.jsx" method="get">
<input type="text" name="key" placeholder="QCCSID"/>
<input type="submit" value="Display System Value"/>
</form>
</body>
</html>
步骤4.验证HTTP Server实例是否可行。
通过单击启动实例
图3.默认HTTP Server网页
Node.js FastCGI应用程序创建
最新的node.js PTF中已启用开源FastCGI附加程序node-FastCGI。 如果成功安装了该附加组件,则/ QOpenSys / QIBM / ProdData / Node / os400 / node-fastcgi目录应该存在并且包含两个模板文件。
根据FastCGI协议,Web服务器和FastCGI应用程序可以位于同一系统上,也可以位于不同系统上。 关联有两种模式,(本地或远程),如图4所示。对于简单配置,本地模式启用在前端HTTP Server的同一服务器上运行的FastCGI应用程序。 但是在某些复杂的网络环境中(例如,前端HTTP Server仅充当代理或平衡器,并且有多个后端应用程序服务器),远程模式是最佳选择。 在其余部分中,介绍了两种模式。
图4. FastCGI服务器的两种工作模式
配置关联需要两个关键组件。 一个是HTTP Server用于与后端FastCGI应用程序通信的FastCGI插件的配置文件。 另一个是Node.js FastCGI应用程序本身。 当前,Node.js for i提供了fastcgi.conf和fcgi.js的模板,它们位于/ QOpenSys / QIBM / ProdData / Node / os400 / node-fastcgi中。 用户需要根据实际需要更新这些模板的内容。 以下步骤演示了如何从这些模板构建示例FastCGI应用程序。
第1步。 将模板文件复制到HTTP Server配置目录。
将模板文件fastcgi.conf和fcgi.js复制到HTTPSERV HTTP实例的配置目录。
cp –p /QOpenSys/QIBM/ProdData/Node/os400/node-fastcgi/fastcgi.conf /www/httpserv/conf/
cp –p /QOpenSys/QIBM/ProdData/Node/os400/node-fastcgi/fcgi.js /www/httpserv/conf/
注 :建议不要修改原始模板文件■直接 。 您可以修改它们的副本,并确保HTTP Server运行时配置文件QTMHHTTP对它们具有* RX权限。 您可以将fcgi.js复制到任何其他目录。 但是,如果要在远程模式下进行配置,则应将fcgi.js复制到运行Node.js FastCGI应用程序的系统目录中。
默认情况下,fastcgi.conf文件的内容如下所示:
; Local Mode --the HTTP server should run at the same IP address with the FastCGI server.
Server type="application/x-httpd-javascript"
CommandLine="/QOpenSys/QIBM/ProdData/Node/os400/node-fastcgi/fcgi.js" StartProcesses="1"
; Remote Mode --the FastCGI server can run at different IP addresses. Set 'Binding=' to the IP/port
that the FastCGI server listens to.
; ExternalServer type="application/x-httpd-javascript" Binding="127.0.0.1:8080" ConnectionTimeout="300"
RequestTimeout="300"
; Where to place socket files
IpcDir /www/fastcgi/logs
注意 :在此配置文件中,分号“;”用于注释指令。 您可以参考详细的配置指南以获取更多信息。
本地
fastcgi.conf中有三个指令(默认情况下,其中一个已注释掉)。 Directive Server
允许FastCGI应用程序在本地模式下运行。 这意味着HTTP Server和FastCGI应用程序必须存在于同一系统上。 当启动关联的HTTP Server时,HTTP Server将自动启动CommandLine
属性定义的FastCGI应用程序。
远程
被注释掉的第二个指令是针对远程模式的。 在这种模式下,HTTP Server和FastCGI应用程序可以在不同的系统中运行。 属性, Binding
,定义了IP地址和端口,所述FastCGI应用程序监听。 如果要启用此模式,请注释掉第一个指令以先禁用本地模式,然后取消注释第二个指令。 它们不能共存。
最后一个指令IpcDir
定义了放置FastCGI应用程序的套接字文件的位置。 我们需要将其更改为现有目录。
步骤2,更新fastcgi.conf。
要配置本地模式,请使用以下内容更新fastcgi.conf。
Server type="application/x-httpd-javascript" CommandLine="/www/httpserv/conf/fcgi.js"
StartProcesses="1"
; ExternalServer type="application/x-httpd-javascript" Binding="127.0.0.1:8080 "
IpcDir /www/httpserv/logs
要配置远程模式,请使用以下内容更新fastcgi.conf。
; Server type="application/x-httpd-javascript" CommandLine="/www/httpserv/conf/fcgi.js"
StartProcesses="1"
ExternalServer type="application/x-httpd-javascript" Binding="127.0.0.1:8080"
IpcDir /www/httpserv/logs
现在,我们已经完成了针对i的IBM HTTP Server的FastCGI插件配置。
步骤3.更新fcgi.js以处理FastCGI请求。
/www/httpserv/conf/fcgi.js
的默认内容。 它仅响应来自HTTP Server端的FastCGI请求的URL。
#!/QOpenSys/QIBM/ProdData/Node/bin/node
var fcgi = require('/QOpenSys/QIBM/ProdData/Node/os400/node-fastcgi');
var fcgiServer = fcgi.createServer(function(req, res) {
if (req.method === 'GET') {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('GET: ' + req.url);
} else {
res.writeHead(501);
res.end();
}
});
fcgiServer.listen(); //Local mode
// fcgiServer.listen(8080); //Remote mode
记下最后两行。 如果FastCGI应用程序未侦听有效端口,则它将在本地模式下工作。 启动HTTP Server将自动运行此FastCGI应用程序。 如果FastCGI应用程序侦听有效端口,则它将在远程模式下工作。 根据您的实际需求更改线路。
为了处理不同类型的请求,我们可以更新此文件,以根据请求的.jsx文件名动态加载不同的node.js应用程序。
#!/QOpenSys/QIBM/ProdData/Node/bin/node
var fcgi = require('/QOpenSys/QIBM/ProdData/Node/os400/node-fastcgi');
var url = require('url');
var fs = require('fs');
var fcgiServer = fcgi.createServer(function(req, res) {
var app = __dirname + url.parse(req.url).pathname.slice(0,-1);
//Replace .jsx with .js to get the real path.
fs.exists(app, function(exists){
if(exists){
var handler = require(app); // Load the javascript module according the URL requested
handler.process(req, res);
} else {
res.writeHead(404);
res.end();
}
});
});
fcgiServer.listen(); //Local mode
// fcgiServer.listen(8080); //Remote mode
现在,我们有了FastCGI应用程序的简单框架,允许它作为FastCGI应用程序调用Node.js程序。
步骤4.添加系统值查询处理程序。
前面的步骤将HTTP Server配置为运行Node.js程序。 现在,我们创建一个用于显示系统值的Node.js程序。 在fcgi.js的同一目录中,创建一个具有以下内容的名为dspsysval.js的新JavaScript文件。 这是系统值查询的处理程序。
var url = require('url');
var db = require('/QOpenSys/QIBM/ProdData/Node/os400/db2i/lib/db2');
var xt = require('/QOpenSys/QIBM/ProdData/Node/os400/xstoolkit/lib/itoolkit');
var wk = require('/QOpenSys/QIBM/ProdData/Node/os400/xstoolkit/lib/iwork');
exports.process = function(req, res) { // Implement the interface ‘process()’
var key = url.parse(req.url, true).query.key.toUpperCase(); // Get the query key from the URL.
var conn = new xt.iConn('*LOCAL');
var work = new wk.iWork(conn);
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(key + ' = ' + work.getSysValue(key)); // Write the system value to the HTTP response.
};
该程序从URL读取密钥名称,并使用Node.js工具包应用程序编程接口(API) getSysValue()
查询本地IBM i系统的相应值。 然后,它将系统值写入HTTP响应。
步骤5.启动HTTP Server和Node.js FastCGI应用程序。
打开IBM Web Administration for i http:// your.server.name:2001 / HTTPAdmin),然后单击
STRTCPSVR SERVER(*HTTP) HTTPSVR(HTTPSERV)
STRTCPSVR SERVER(*HTTP) RESTART(*HTTP) HTTPSVR(HTTPSERV)
启动HTTP Server时,我们可以发出以下CL命令来检查其状态。
WRKACTJOB SBS(QHTTPSVR)
图5. FastCGI应用程序的运行状态
作业PGM-zfcgi和PGM-node仅在本地模式下存在。 在远程模式下,当启动HTTP Server时,您必须在PASE中手动启动fcgi.js程序。 请记住,在fcgi.js和FastCGI.conf中,端口号必须相同。
node /path/to/fcgi.js
步骤6.访问并验证HTTP Server与Node.js之间的关联。
我们可以浏览主页http:// your.server.name 10036,然后输入要查询以验证关联的任何系统值名称。 如果显示QCCSID系统值,如图6所示,则表明FastCGI应用程序正在运行。
图6. FastCGI响应
使用IBM i概要文件验证保护您的FastCGI应用程序
本部分描述如何使用IBM HTTP Server for i服务器认证功能来保护应用程序。 仅具有IBM i概要文件的访问者被允许访问该应用程序。
步骤1.使用身份验证设置更新HTTP Server配置。
单击IBM Web Administration for i中的“编辑配置文件”按钮以配置HTTPSERV实例。 在末尾添加以下指令(以粗体显示)。
LoadModule zend_enabler_module /QSYS.LIB/QHTTPSVR.LIB/QZFAST.SRVPGM
Listen *:10036
DocumentRoot /www/httpserv/htdocs
HotBackup Off
AddType application/x-httpd-javascript .jsx
AddHandler fastcgi-script .jsx
<Location />
AuthType Basic
AuthName "Login with your IBM i profile"
Require valid-user
PasswdFile %%SYSTEM%%
</Location>
这些指令为所有.jsx文件请求启用身份验证。 上面显示了完整的配置文件httpd.conf。
步骤2.重新启动HTTP Server,以使身份验证设置生效。
重新启动HTTPSERV实例并访问http:// your.server.name:10036以查询系统值。 对话框提示您使用IBM i概要文件登录。
图7.身份验证对话框
如果您通过了身份验证,则可以访问查询页面和后端FastCGI应用程序。 否则,HTTP Server将阻止访问并响应以下错误消息。
图8.阻止未经授权的访问
摘要
事件驱动的非阻塞I / O功能使Node.js主要用作轻量级Web服务器。 开源社区正在开发越来越多的第三方附件,这些附件可以大大扩展Node.js的功能和价值。 此外,用于i的IBM HTTP Server是高度可定制,强大且经过验证的Web服务器。 它使用IBM i特定的功能,例如高可用性(HA),快速响应高速缓存加速器(FRCA)和概要文件认证,以实现更高的安全性和更好的性能。
现在,我们可以将这些IBM i特定功能与FastCGI协议连接起来,并相互补充,并充分利用各自的优势。 甚至有可能在分布式系统中部署这些服务器。 模式的灵活组合适用于不同的场景。
翻译自: https://www.ibm.com/developerworks/ibmi/library/i-running-node-js-web-app-trs/index.html