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

本文介绍如何在IBM i平台上使用Node.jsFastCGI插件将IBM HTTP Server与Node.js应用程序关联,包括本地和远程配置,以及如何使用HTTP Server身份验证保护应用程序。

本文介绍如何利用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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值