使用IBM HTTP Server for i运行Node.js

本文介绍如何利用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实例是否可行。

通过单击启动实例

面板顶部的图标。 访问http:// your.server.name:10036以检查实例是否正常运行。 如果一切正常,将显示以下网页。 但是,它还不能满足任何FastCGI请求,因为我们尚未配置相应的后端部分。 我们将在下一部分中设置并关联FastCGI应用程序,以处理FastCGI请求。
图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.conffcgi.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),然后单击

按钮启动HTTPSERV实例。 如果实例已经在运行,请单击
按钮以重新启动它。 我们还可以使用控制语言(CL)命令来启动或重新启动HTTP实例。
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值