如何为新创建的应用服务器配置 Web 管理控制台
WebSphere?Application Server V6.1 的 web 管理控制台提供许多功能指导您执行部署和系统管理任务,默认情况下,web 控制台只能通过概要文件 (profile) 中默认创建的应用服务器(如 server1)端口来访问,其它新创建的应用服务器(如 server2)无法使用 web 管理控制台,本文介绍了一个解决方案利用 wsadmin 命令将 Web 管理控制台映射到其他的应用服务器上,方便了用户管理部署在此服务器上面的应用程序,从而提高了生产效率。
1. 基本概念
本节简单介绍一下在本文中提到的几个关键概念:概要文件、应用服务器和管理控制台,本文将以 WebSphere Application Server V6.1 为基础来阐述。
概要文件
WebSphere Application Server 从 6.0 版本引进了概要文件(profile)概念,目的是将产品的二进制文件(binaries)与用户数据物理分离,并使用户能定义多组用户数据,从而使管理变得更加简单。在 WebSphere Application Server V6.1 中概要文件主要分三类:应用程序服务器概要、部署管理器概要和单元概要。安装 WebSphere Application Server V6.1 时会默认创建一个概要文件(如 AppSrv01),用来存贮用户数据包括配置文件、部署的应用程序等。您还可以使用 Profile Management 工具创建或删除概要文件。更多概要文件知识可参考 IBM 红皮书《WebSphere Application Server V6.1:系统管理与配置》。
应用服务器
应用程序服务器扩展了 Web 服务器的功能,以便处理 Web 应用程序请求(通常使用 Java 技术)。应用程序服务器使得服务器可能生成一个对客户机请求的动态、定制的响应。在安装过程中,WebSphere Application Server 将创建缺省应用程序服务器 server1,可以使用管理控制台或命令行工具来管理此应用程序服务器。可以通过 wsadmin 命令来创建应用程序服务器或一般服务器,如 AdminTask 对象中的 createApplicationServer 或 createGenericServer 命令。
管理控制台
管理控制台(admin console)是一个图形界面,提供了指导操作以记录常规任务,如配置数据库连接、部署应用程序,配置 WAS 的安全等,它指导您执行部署和系统管理任务。管理控制台是由某个应用程序服务器承载的,它只能连接到该应用程序服务器。默认安装的 WebSphere Application Server V6.1 会在应用服务器 server1 上部署了 web 管理控制台。本文第三节将详细介绍管理控制台的知识。
2. 问题的提出
为了提高运行时性能,许多部署在 WebSphere Application Server V6.1 上的应用程序要求拥有自己的应用服务器,如 Lotus?Connections 1.0.2 产品推荐为每个特性(activities、blogs、communities、dogear、profiles)建立独享的应用服务器,所以必须在安装之前创建这些服务器。使用独立的 WebSphere Application Server V6.1 时,最简单的方法是将默认 server1 应用服务器保留在适当位置上,用于托管 WEB 管理控制台,并在同一个应用服务器配置文件下创建新的应用服务器实例,用于托管要安装的特定 Lotus Connection 特性。例如,若要设置三个服务器来托管 Linux 服务器上的 Activities、Profiles 和 Dogear,则可以使用清单 1 中所示的命令。
清单 1. 创建应用服务器
/opt/WebSphere/AppServer/profiles/AppSrv01/wsadmin.sh $AdminTaskcreatApplicationServer Node01 {-name ActivitiesServer} $AdminTaskcreatApplicationServer Node01 {-name ProfilesServer} $AdminTaskcreatApplicationServer Node01 {-name DogearServer} $AdminConfig save
这些命令将创建三个服务器,每个服务器具有不同的服务端口集,并将服务器设置保存到 WebSphere Application Server V6.1 配置文件的配置中。但目前 WEB 管理控制台还不能被其它新创建的三个应用服务器所使用,只有缺省应用服务器(server1)才能使用管理控制台,对创建其他应用程序服务器,必须使用命令行工具来管理,这使得管理部署在新创建服务器上的应用程序(如 activities、dogear、profiles)变得非常麻烦。
本文下面将深入介绍管理控制台,并提出一种解决方案利用 wsadmin 命令将 Web 管理控制台托管到其他的应用服务器上,方便用户管理部署在此应用服务器上面的应用程序。
3. 剖析管理控制台
管理控制台是一个图形界面,它允许您为 WebSphere Application Server V6.1 环境管理应用程序和执行系统管理任务。管理控制台在 Web 浏览器中运行,在控制台中的操作会修改一组 XML 配置文件。
控制台的功能
可使用管理控制台以执行如下任务:
- 添加、删除、启动和停止应用程序服务器
- 将新应用程序部署到服务器
- 启动和停止现有应用程序,并修改某些配置
- 添加和删除应用程序的 Java 2 Platform, Enterprise Edition(J2EE)资源提供程序,这些应用程序需要数据访问、邮件、URL 等等
- 配置产品安全性,包括对管理控制台进行的访问
- 为供性能和故障诊断使用而收集数据
- 查找产品版本信息。它位于控制台的首页。
图 1 显示了 WebSphere Administrative Console 主页,Application Server V6.1 信息中心有管理控制台程序的说明。
图 1. WEB 管理控制台

控制台的本质
WebSphere Application Server V6.1 中的一个概念是系统应用程序(system application),该应用程序是作为标准的 J2EE 应用程序来开发,但是倾向于作为 WebSphere Application Server V6.1 产品的一部分,不被终端用户所操纵。系统应用程序并没有显示在控制台中,并且也不包含在通过下面的 wsadmin 命令显示出来:
$AdminApp list
本命令返回 WebShpere Application Server 中所有的应用程序。 在 WebSphere Application Server V6.1 中并不是所有随 WebSphere Application Server 提供的应用程序都是系统应用程序,例如,J2EE Samples 就不是系统应用程序,系统应用程序的例子包含 isclite .ear 和 filetransfer.ear,管理控制台就是系统应用程序 isclite .ear,默认被映射到应用服务器上 (server1)。
4. 解决方案及实现
WebSphere Application Server V6.1 的管理性脚本编制程序 wsadmin 是一个强大的、非图形化的命令解释器环境,该环境允许您交互地执行管理操作或在脚本文件中执行管理操作。wsadmin 脚本工具旨在用于生产环境和无人(unattended)操作。wsadmin 脚本工具引入于 WebSphere Application Server V5。wsadmin 目前只支持 Jython 和 Jacl 两种脚本语言,并推荐使用 Jython 来编写 wsadmin 脚本。
三种 WebSphere Application Server 管理脚本编制对象反映了底层产品体系结构:
- AdminControl: 公开系统的操作方面,这样您就可以通过 MBean 接口在活动的运行时组件上调用 JMX 操作。
- AdminConfig: 公开系统的配置,这样您就可以更新 XML 配置文件。
- AdminApp: 公开系统的应用程序部署选项;本质上来说,这是一个用于安装和部署应用程序的专门的配置对象。
通过使用 wsadmin 工具,管理员能够替代正在运行的管理控制台来配置、部署和管理 WebSphere Application Server 的多种元素。而且,用户能够使用脚本语言的固有功能(开发脚本)将 wsadmin 命令组合使用,从而自动化用户自定义的管理过程。
本文将灵活运用这三个对象的功能来实现 :
- 创建新的应用服务器
- 配置虚拟主机
- 映射 WEB 控制台
将控制台应用程序(isclite.ear)部署到新创建的应用服务器上。本文以 Jython 语言来讲解,因为 Jython 是 Application Server V6.1 推荐使用的语言,Jacl 语言已不再推荐使用,并且将来 Application Server 的版本中不再支持 Jacl。
创建应用服务器代码
首先我们通过 wsadmin 脚本在指定的 Node 上来创建一个新的应用服务器,过程中主要利用到 AdminConfig 对象的 create 方法,代码片断和注释如清单 2 所示。
清单 2. 创建新的服务器
#-------------------------------------------------------------------------------------- # 创建新的服务器 , 传入两个参数 :node 名字和要创建的 server 名字 #-------------------------------------------------------------------------------------- def createServer(nodeName, serverName): """Create a server to the node. Return None.""" #-------------------------------------------------------------- # 设定全局变量 #-------------------------------------------------------------- global AdminConfig global AdminApp #-------------------------------------------------------------- # 检查参数是否传入正确 #-------------------------------------------------------------- if (serverName is None): print "createServer: Error -- servername is null" return if (nodeName is None): print "createServer: Info -- nodename is null, please use -currentNode paremeter as a default node" elif(nodeName == '-currentNode'): # 如果传入为 -currentNode,获取默认的 cell 和 node values = getDefaultNode() if(len(values) != 2): print "createServer: Error -- please use another profile to do the opertion" return cellName = values[0] nodeName = values[1] print "createServer: Info -- default cell is " + cellName print "createServer: Info -- default node is " + nodeName # 找到对应的 node node = AdminConfig.getid("/Node:" + nodeName + "/") else: node = AdminConfig.getid("/Node:" + nodeName + "/") # 通过 node id 来找到对应的 node if(len(node) == 0): print "createServer: Error -- can not find the node with name " + nodeName return nodeStringList = node.split("(") if(len(nodeStringList) > 1): cellString = nodeStringList[1] cellPart= cellString.split("/") if(len(cellPart) > 1): cellName = cellPart[1] # 从 id 中得到 cell 的名字 print "createServer: Info -- the cell to which the node belong is " + cellName else: print "createServer: Error -- can not find the cell to which the node " + nodeName + " belong" return else: print "createServer: Error -- can not find the cell of the node with name " + nodeName return print "createServer: Checking for existence of node " + nodeName #--------------------------------------------------------- # 检查当前 node 是否已经存在了改名字的应用服务器 #--------------------------------------------------------- print "createServer: Checking to see if server " + serverName + " is already on the node " + nodeName # 尝试得到应用服务器的 id server = AdminConfig.getid("/Node:" + nodeName + "/Server:" + serverName + "/") if len(server) != 0: print "createServer: Error -- Server " + serverName + " is already existing on node " + nodeName return #-------------------------------------------------------------- # 创建应用服务器 #-------------------------------------------------------------- print "createServer: Creating a server " + serverName attributes = [["name", serverName]] try: # 创建应用服务器 server = AdminConfig.create("Server", node, attributes) except: print "createServer: Error -- Fail to create server" + serverName return print "createServer: Saving the configuration" # 保存设置 AdminConfig.save()
添加虚拟主机代码
利用 AdminConfig 对象的 create 方法,把创建好应用服务器的 http 服务的端口添加到虚拟主机中,这样在服务器上部署应用才可以对外提供服务,代码片断和注释如清单 3 所示。
清单 3. 添加虚拟主机代码
#------------------------------------------------------------------------------------- # 将指定的端口添加到虚拟主机中 #------------------------------------------------------------------------------------- def addVirtualHost(httpPort, httpsPort, httpAdminPort, httpsAdminPort): """ 把指定的端口添加到虚拟主机中 返回值为空 .""" #-------------------------------------------------------------- # 设置全局变量 #-------------------------------------------------------------- global AdminConfig global AdminControl global AdminApp updateHttpPort='true' updateHttpsPort='true' updateHttpAdminPort='true' updateHttpsAdminPort='true' vhs = AdminConfig.list('VirtualHost') vhlist = vhs.split(lineSeparator) for vh in vhlist: vhname = AdminConfig.showAttribute(vh, 'name') if(vhname == 'default_host'): has = AdminConfig.list('HostAlias', vh) haslist = has.split(lineSeparator) for ha in haslist: portnum = AdminConfig.showAttribute(ha, 'port') # 如果 http 端口已经存在 if(portnum == httpPort): print "The port " + portnum + " exists in Host Alias" updateHttpPort="false" # 如果 https 端口已经存在 elif(portnum == httpsPort): print "The port " + portnum + " exists in Host Alias" updateHttpsPort="false" if(updateHttpPort == "true"): hostAliasValue = [['hostname', '*'], ['port', httpPort]] # 创建 HostAlias (http) AdminConfig.create('HostAlias', vh, hostAliasValue) if(updateHttpsPort == 'true'): hostAliasValue = [['hostname', '*'], ['port', httpsPort]] # 创建 HostAlias (https) AdminConfig.create('HostAlias', vh, hostAliasValue) elif(vhname == 'admin_host'): has = AdminConfig.list('HostAlias', vh) haslist = has.split(lineSeparator) for ha in haslist: portnum = AdminConfig.showAttribute(ha, 'port') # 如果 http 端口已经存在于 HostAlias if(portnum == httpPort): print "The port " + portnum + " exists in Host Alias of admin_host" updateHttpAdminPort='false' # 如果 https 端口已经存在于 HostAlias elif(portnum == httpsPort): print "The port " + portnum + " exists in Host Alias of admin_host" updateHttpsAdminPort='false' if(updateHttpAdminPort == "true"): # 创建系统管理的 HostAlias (http) hostAliasValue = [['hostname', '*'], ['port', httpAdminPort]] AdminConfig.create('HostAlias', vh, hostAliasValue) if(updateHttpsAdminPort == 'true'): # 创建系统管理的 HostAlias (https) hostAliasValue = [['hostname', '*'], ['port', httpsAdminPort]] AdminConfig.create('HostAlias', vh, hostAliasValue)
添加管理控制台代码
这是本文最关键的一步,通过 AdminApp 对象将 ilclite 应用程序(即控制管理台),映射到指定的应用服务器上,代码片断和注释如清单 4 所示。
清单 4. 添加管理控制台代码
#---------------------------------------------------------------------------------- # 将系统应用程序映射到指定的应用服务器上 #----------------------------------------------------------------------------------- def AddAdminMap(cellName, nodeName, serverName): """ 把系统管理模块映射到应用服务器 返回值为空 """ #-------------------------------------------------------------- # 设置全局变量 #-------------------------------------------------------------- global AdminConfig global AdminControl global AdminApp appName = 'isclite' serverToAdd = '+WebSphere:cell=' + cellName+',node='+nodeName+',server='+serverName mappingOption = [['.*', '.*', serverToAdd]] moduleToServerTaskOption = ['-MapModulesToServers', mappingOption] # 把系统管理应用程序模块映射到应用服务器 AdminApp.edit(appName, moduleToServerTaskOption)
5. 优点及好处
运行本文提供的脚本来创建应用服务器,结果如图 2 所示。
图 2. 命令行运行

目前 WebSphere Application Server V6.1 支持 Jython 和 Jacl 语言的,对比来说 Jython 语言简单,易读有面向对象的特性,因为 Jython 是 Python 脚本的 Java 实现,也是 WebSphere Application Server V6.1 推荐的脚本语言,所以 Jython 在技术上得到的支持也会更大,有兴趣的读者,可以根据本文提供的 Jython 脚本,自己来编写 Jacl 脚本。本文通过利用解释控制器上的管理命令,介绍了 Jython 语言来创建应用服务器,添加虚拟主机,映射管理控制台,而且利用脚本批处理模式,可以很容易的创建新的应用服务器,部署 WEB 管理控制台(即 isclite 应用程序)到指定的应用服务器上,方便了客户管理部署在新创建服务器上的应用程序,从而提高生产开发效率。
6. 结束语
本文灵活运用 wsadmin 脚本,将系统应用程序映射到新建的应用服务器上,wsadmin 脚本功能非常强大,使用它能够更加轻松的配置及高效的管理 WebSphere Application Server 环境。
下载资源
- 本文用到的 Jython 脚本示例 (src-code.zip | 3KB)
相关主题
- WebSphere Application Server V6.1:系统管理与配置 :IBM 红皮书
- WebSphere Application Server V6.1 信息中心
- 部署 IBM Lotus Connections: 规划和架构考虑
- WebSphere Application Server V6 系统管理第四部分 :最新的 AdminTask 命令使 wsadmin 脚本更加简单实用
- IBM developerWorks WebSphere Application Server 专区
- 管理脚本介绍 :介绍 wsadmin 脚本
- 概要 (profile) 理解入门,第 2 部分 :如何创建和管理概要
- 概要 (profile) 理解入门,第 1 部分 :基本概念