本文主要是介绍IBM HTTP Server集成Liberty,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前2篇分别写了建立Liberty server和安装IBM HTTP Server,下面谈谈如何把IHS和Liberty集成起来。
我们希望搭建一个如下的系统架构
客户发起的请求首先会到达web server即IHS(或apache http server), IHS用来负责处理静态资源的请求,比如html,js,css,jpg等,对于动态请求比如jsp,action,do等需要转发至application server进行处理。现在流行的application server有IBM Websphere, Oracle Weblogic, JBOSS, Tomcat, Jetty等。我们这里使用的是IBM轻量级的application server ——Liberty.
1. 针对每台liberty application server生成plugin文件。
可以使用jconsole或者eclipse的方法,这里使用的是eclipse方法
i. 确保 Liberty 服务器已启动。
ii. 在 Eclipse 的“服务器”面板中,右键单击 Liberty 服务器,然后单击实用程序 > 生成插件配置
那么plugin-cfg.xml就生成在该usr\servers\ [SERVER NAME]\目录下
这是文件的一部分,检查一下端口是否为80,443,如果生成不是的话,后面有会有问题
<VirtualHostGroup Name="default_host"><VirtualHost Name="*:80"/><VirtualHost Name="*:443"/></VirtualHostGroup>
如果只有1台liberty app server,我们就可以修改D:\IBM\HTTPServer\conf\httpd.conf
在conf文件的最后加入以下2行代码
LoadModule was_ap22_module "path\to\mod_was_ap22_http.dll"
WebSpherePluginConfig "path\to\plugin-cfg.xml"
第一行是IHS连接Webshpere/liberty的驱动程序(websphere和liberty的驱动相同),类似于apache的mod_jk.so。这个驱动在安装plug in时生成在
D:\IBM\WebSphere\Plugins_1\bin\32bits 目录中
第二行就是刚才在liberty Utility生成的plugin文件。
把驱动和文件都copy到了HTTPServer的path\to目录里
重启IHS和liberty server,输入应用的URL,通过80端口访问成功!
2. 我们这里有2台app server的实例为testserver1和2,那么分别针对这2台生成了plugin-cfg.xml。
将plugin文件合并,可以手工把2个文件合并,也可以用liberty自带的工具merge。
在liberty的bin目录输入命令
pluginUtility merge --sourcePath=..\usr\servers\testserver1\plugincfg.xml,..\usr\servers\testserver2\plugin-cfg.xml
2个plugin文件合并完毕,手工把CloseID修改一下为testserver1和2,在默认情况下,IHS的负载均衡的算法是LoadBalance=”Round Robin”在没有其他限定的情况下,为了实现会话保持,IHS会根据用户cookie中传来的CloseID值来判断将用户的请求转发给已经建立了联系的application server。
3.修改httpd.conf使其指向合并后的plugin文件
LoadModule was_ap22_module "D:\IBM\WebSphere\Plugins_1\bin\32bits\mod_was_ap22_http.dll"
WebSpherePluginConfig "path/to/merged-plugin-cfg.xml"
重启IHS后,在浏览器输入应用的URL,可以看到
在一个jsp页面打印出来了处理请求应用服务器的端口号request.getLocalPort(),可以从testserver1的http.xml文件里看到这个app server的端口是10080,所以知道这个请求被testserver1处理。
<server><featureManager><feature>servlet-3.1</feature></featureManager><!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" --><httpEndpoint host="*" httpPort="10080" httpsPort="10443" id="defaultHttpEndpoint"/><!-- Define the host name for use by the collective.If the host name needs to be changed, the server should beremoved from the collective and re-joined. --><variable name="defaultHostName" value="localhost"/><!-- Used for plugin generation --><pluginConfiguration webserverPort="80" webserverSecurePort="443" /></server>
不停的刷新页面,可以看到端口在不停的切换
IHS把请求轮流转给不同的application server。 但是我们不希望请求是每次轮询转发的,通常我们的开发的web应用都是有状态的,需要实现会话保持,上面提到用CloneID通过cookie来实现,再去看一下app server里的server.xml的配置,这里有
<!-- <httpSession cloneId="${hostname}_${wlp.server.name}"/> -->
<httpSession cloneId="${wlp.server.name}"/>
我们把它改为和plugin-cfg.xml里CloneID保持一致(这里我们改为app server的名字,通常是一个9位数以内的字符串)。修改后liberty server会自动加载重启。
我们再看看访问一个jsp页面,即使你不停的刷新,总是11080端口的app server在处理你的请求了,进入Chrome的开发者模式,可以看到Cookie后面有一个:冒号后面的值就是处理你这个请求app server的CloneID。 在首次建立会话时,app server会生成一个带CloneID的cookie传回客户端,再次请求时,客户端会带着此Cookie给IHS,IHS根据此Cookie里CloneID来判断把这个请求转给之前你们已经建立过联系的app server,这样就实现了会话保持。
这篇关于IBM HTTP Server集成Liberty的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!