当前位置: 首页 > 图文教程 > 网络编程 > JSP > Apache plug-in配置代理请求实战

JSP
我认为JSP有问题(上)
我认为JSP有问题(下)
jsp“抓”网页代码的程序
关于在bean里面打印html的利弊看法
bean里面如何打印到html页面
jdbc3中的RowSet 接口规范
Apusic Application Server1.0中jsp源代码泄漏漏洞
Unify的eWave ServletExec拒绝服务漏洞
通过提交超长的GET请求导致IBM HTTP Server远程溢出
在HTTP请求中添加特殊字符导致暴露JSP源代码文件
Resin 1.2 重要源代码暴露漏洞
多中WEB服务器的通用JSp源代码暴露漏洞
Tomcat 暴露JSP文件内容
IBM WebSphere Application Server 暴露JSP文件内容
JRun 2.3.x 范例文件暴露站点安全信息
BEA WebLogic 暴露源代码漏洞
IBM WebSphere Application Server 3.0.2 存在暴露源代码漏洞
Tomcat 3.1 存在暴露网站路径问题
Sun Java Web Server 能让攻击者远程执行任意命令
Netscape 修复 JAVA 安全漏洞

JSP 中的 Apache plug-in配置代理请求实战


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-03   浏览: 102 ::
收藏到网摘: n/a


看了一些论坛的文章和WLS的帮助,写到Apache Plug-in的配置时大多介绍的是如何安装Modules,以及初步的httpd.conf设置等,对于复杂的后端应用服务器代理配置的问题,都没有涉及到,或者交代的不清楚,结合前几天为客户解决的plug-in配置问题,笔者在本文详细介绍一下。
客户面临的问题是Apache作为前端的web Server,后面有两个应用服务器,根据不同的url路径重定向到不同的应用服务器中。其中服务器甲非客户开发,主要是使用其中的Servlet,url路径为/servlets/…,服务器乙是客户开发,url路径为/servlet/…,以及其上的jsp文件。
笔者查阅了WLS联机帮助,对于httpd.conf中关于重定向的配置,可以通过Location和IfModule来设置,两者不同的是,location主要是针对路径,而IfModule主要是针对文件类型,同时也可以加入路径,Location的行为优先执行。两者支持的参数可以参照文后附表。
由此,可以如下配置httpd.conf文件
LoadModule weblogic_module modules/mod_wl_20.so
<Location /servlets>
SetHandler weblogic-handler
WebLogicHost 10.1.1.16
WebLogicPort 7001
</Location>

<IfModule mod_weblogic.c>
WebLogicHost 10.1.1.7
WebLogicPort 7001
MatchExpression *.jsp
MatchExpression /servlet/*.*
</IfModule>
根据配置可知,当访问的url中含有/servlets/….时,会将请求传递到10.1.1.16上,而当访问的url中含有/servlet/….或者访问的是jsp时,会将请求传递到10.1.1.7上。
值得注意的是,如果jsp中含有图片等,那么如上的配置,图片的请求不会传递到10.1.1.7上,由于Apache同时还担当静态页面服务器的功能,也含有图片信息,所以不能加入MatchExpression *.gif等图片代理的设置。
考虑这个问题的解决,当10.1.1.7上图片所在是一个单独的目录,例如/image/下,而Apache上图片的目录与其不同,那么可以加入MatchExpression /image/*.*来设置,但是如果Apache上图片的目录也是/image/,那么就不能这么设置,因为如果这么设置,所有Apache上的静态页面包含的图片请求也会被传递到10.1.1.7上。这时候解决的方法,只能是不加设置,将10.1.1.7上的图片拷贝到Apache的/image/目录下,而JSP中显示的图片实际上显示的是Apache上的图片。
其他的内嵌文件,例如.js,.swf也有同样的问题,其实最好的解决方法,就是将10.1.1.7上的应用放到一个相对路径下,例如10.1.1.7:7001/webapp1/下,那么,去掉ifModule,加入另外一个Location,指向/webapp1/就可以了,然后通过apacheserver/webapp1进行访问。
另外也可以考虑,如果10.1.1.7上的链接都是相对的,也可以考虑在apache这端加入一个路径,/webapp1/,然后通过location,将这类请求传递到10.1.1.7上,同时设置传递请求后去掉webapp1,即设置 PathTrim /webapp1,也可以满足要求。
以下我们针对一个例子,来详细说明:
修改httpd.conf,配置如下:
<Location /bbs>
SetHandler weblogic-handler
WebLogicHost dev2dev.bea.com.cn
WebLogicPort 80
</Location>


<Location /products/beawebserver81>
SetHandler weblogic-handler
WebLogicHost www.bea.com.cn
WebLogicPort 80
</Location>
启动Apache,通过http://localhost/bbs访问,你看到了什么?不错,是dev2dev.bea.com.cn的bbs。图片,样式都可以显示,论坛的连接也可以打开,这是因为dev2dev.bea.com.cn论坛本身的url都是放在/bbs下面。
我们再通过http://localhost/products/beawebserver81/index.jsp访问,发现页面打开的虽然是www.bea.com.cn的网页,但是图片和样式都失去了,js也发生了错误。
通过查看源文件,我们看到图片都是放到/images/下,样式通过/css.css控制,我们可以进行修改,在后面加入如下配置:
<IfModule mod_weblogic.c>
WebLogicHost www.bea.com.cn
WebLogicPort 80
MatchExpression /images/*.*
MatchExpression /css.css
</IfModule>
重新刷新一下,图片和样式都发生了变化,但是由于没有载入js,所以鼠标移到菜单上会有问题,读者可以试着自己加入js传递的配置。
当然,可以去掉后面的那个Location,然后修改IfModule为:
<IfModule mod_weblogic.c>
WebLogicHost www.bea.com.cn
WebLogicPort 80
MatchExpression /products/beawebserver81/*.*
MatchExpression /images/*.*
MatchExpression /css.css
</IfModule>
这样也可以同样工作。上面的将Location和Ifmodule分开,只是为了更好的说明如何进行不同的配置而已。
尝试设置时,建议在IfModule中加入如下代码:
WLLogFile C:\temp\wlproxy
Debug ALL
读者可以通过查看指定的LOG文件,看url处理的正确与否。

附表-插件的通用参数(大小写区分):

参数 默认值 描述
WebLogicHost
(如果代理到单个WebLogic服务器,那么应该设置该参数)
none HTTP请求被递交到该WebLogic Server主机(或者是定义在WebLogic Server中运行的类似于Web server的虚拟主机名)如果使用集群,那么应该使用WebLogicCluster参数而不是WebLogicHost参数。
WebLogicPort
(如果代理到单个WebLogic服务器,那么应该设置该参数)
none WebLogic服务器监听WebLogic连接请求的端口。(如果在插件与WebLogic服务器之间使用SSL,那么应该把该参数设置为SSL监听端口(见8-4页的"配置监听端口")并将SecureProxy参数设置为ON)。
如果使用WebLogic集群,那么应该设置WebLogicCluster参数而不是WebLogicPort参数。
WebLogicCluster
(如果代理到一个WebLogic服务器集群,那么必须设置该参数)
none 集群中的WebLogic服务器列表,用于负载平衡目的。该列表由逗号分隔开的host:port组成。例如:
WebLogicCluster myweblogic.com:7001,
yourweblogic.com:7001,theirweblogic.com:7001
如果插件与WebLogic服务器之间使用SSL协议,那么将端口号设置为SSL监听端口(见8-3页的"配置监听端口")并将SecureProxy参数设置为ON。
应该用该参数取代WebLogicHost与WebLogicPort参数,WebLogic Server首先查找WebLogicCluster参数,如果没有找到该参数,它将寻找并使用WebLogicHost与WebLogicPort参数。
插件对所有可用的集群成员进行轮询。该参数所指定的集群列表是服务器与插件共同维护的动态列表的初始值。WebLogic服务器与插件将根据新加入的、失败的以及恢复的集群成员的情况动态地更新集群列表。
如果将DynamicServerList参数设置为OFF(只适用于Microsoft Internet Information Server),那么集群列表的动态更新被禁用。插件将请求导向集群中最初创建cookie的那个服务器上(请求包含cookie、URL-encoded会话或存于POST数据中的会话信息)。
PathTrim none 在请求被转交到WebLogic服务器之前,被插件从原始URL中裁剪掉的字符串。例如:如果原始URL为
http://myWeb.server.com/weblogic/foo被传递到插件进行解析且PathTrim参数被设置为/weblogic,那么传递到WebLogic服务器的URL变为:http://myweblogic.server.com:7001/foo
PathPrepend null 加在原始URL前的前缀字符串,该动作发生在PathTrim被裁剪后,请求转向WebLogic服务器之前。
ConnectTimeoutSecs 10 插件进行WebLogic服务器主机连接尝试的时间上限。该值应该大于ConnectRetrySecs参数。如果超过ConnectTimeoutSecs还没能连接成功,即使进行了适当次数的连接重试(见ConnectRetrySecs参数),也将把HTTP 503/Service Unavailable响应返回给客户端。
可以使用ErrorPage参数定制错误响应。
ConnectRetrySecs 2 该参数以秒为单位,设置了两次WebLogic Server主机(或集群中的所有服务器)连接尝试之间,插件的休眠时间。该参数的值应该小于ConnectTimeoutSecs。插件在返回HTTP 503/Service Unavailable响应之前,它将进行的连接次数为ConnectTimeoutSecs除以ConnectRetrySecs所得的值。
如果不希望重试连接,那么应该将ConnectRetrySecs值应该与ConnectTimeoutSecs相等。不过,插件会至少进行两次连接尝试。
可以用ErrorPage参数定制错误响应。
Debug OFF 设置调试操作时的日志类型。在生产系统中不建议你开启这些调试选项。
在UNIX系统中,调试信息被写到/tmp/wlproxy.log文件中;在Windows NT系统,调试信息被写到c:\temp\wlproxy.log文件中,通过WLLogFile参数,你可以使用其他路径下的其他文件覆盖文件名、路径参数。你可以设置以下日志选项(其中HFC, HTW, HFW, HTC可以联合使用,它们之间用逗号隔开,如"HFC, HTW");
ON
  插件只记录报告性消息与错误消息
OFF
  不记录调试信息
HFC
  记录来自客户端消息、报告性消息以及错误消息的消息头。
HTW
  记录从weblogic发送来的消息头,报告性消息与错误消息
HFW
  记录来自weblogic服务器消息的消息头,报告性消息与错误消息
HTC
  记录发送到客户端消息的消息头,报告性消息与错误消息
ALL
  记录发送到客户端以及客户端发送的消息的头,发送到WebLogic服务器以及WebLogic服务器发送的消息头,报告性消息,错误消息
WLLogFile 参见Debug参数 指明当Debug参数为ON时,产生日志文件的路径和文件名,在设置该参数前,必须创建相应目录。
DebugConfigInfo OFF 启用特殊查询参数"_WebLogicBridgeConfig"。该参数可以被用来了解插件的配置参数的细节。
例如,如果把DebugConfigInfo设置为ON,那么"_WebLogicBridgeConfig"被启用。发送一个包含查询字符串?_WebLogicBridgeConfig的请求,插件将收集配置信息有运行时的统计信息并将这些信息返回给浏览器。在处理该请求时,插件没有连接到WebLogic服务器。
该参数只应严格用于调试目的。消息的输出格式随版本的变化而不同。为了安全起见,在生产环境中应该将该参数设置为OFF。
StatPath(Microsoft Internet Information Server 插件没有这个参数。) false 如果把该参数设置为真,插件在把请求传递到WebLogic服务器之前检查被转换的路径是否存在或及其访问权限("Proxy-Path-Translated")。如果文件不存在,将把HTTP 404 File Not Found响应返回给客户端。如果文件存在,但它的权限不是world-readable,那么将返回HTTP 403/Forbidden响应。这两种情况下Web服务器处理这些响应的缺省机制是执行响应的体内容。如果WebLogic服务器的Web应用与Web服务器具有相同的文档根,那么该选项非常有用。
可以使用ErrorPage参数定制错误响应。
ErrorPage none

可以制作自己的错误响应页面,在Web服务器不能将请求代理到WebLogic服务器时使用。
设置该参数的方式有两种:

  • 作为相对URI(文件名)。插件自动将返回错误的Web应用的上下文路径加到URI中。对错误页面的请求是否回代理到WebLogic服务器取决于你对代理的配置(是MIME类型式代理还是路径式代理)。
  • 作为绝对URI(建议)。使用错误页面的绝对路径能够使请求总是被代理到WebLogic服务器中的正确资源上。例如: http://host:port/myWebApp/ErrorPage.html
HungServerRecoverSecs 300 定义了插件等待WebLogic服务器响应请求的时间。在等待了HungServerRecoverSecs时间后,插件还没有得到服务器的响应,那么它将宣布该服务器已经死机并失败转移到下一个服务器。应该把该参数设置为一个较大的值。如果所设置的值小于servlets进行处理的时间,那么会得到意想不到的后果。
最小值为:10
最大值为:600
Idempotent ON 如果该参数设置为ON,那么当服务器在指定的HungServerRecoverSecs时间没有响应,那么插件将进行容错处理。如果设置为OFF,插件将不进行失败转移。如果所使用的是Netscape Enterprise Server插件或Apache HTTP Server插件,不同的URL与MIME类型可以有不同的Idempotent参数设置。
CookieName JSESSIO
NID
如果改变了WebLogic服务器Web应用中的WebLogic服务器会话cookie的名字,那么相应地应该将插件的CookieName参数设置为相同的值。WebLogic会话cookie的名字在特定于WebLogic的分发描述符的<session-descriptor>元素中定义
DefaultFileName none 如果URI为"/",插件将执行以下步骤:
1.裁剪掉PathTrim参数所指定的路径
2.在后面加上DefaultFileName所指定的文件名
3.在前面加上PathPrepend参数所指定的值这样处理可以防止WebLogic服务器的重定向。将DefaultFileName设置为代理WebLogic服务器的Web应用的缺省欢迎页面。例如,如果DefaultFileName被设置为welcome.html,那么下面这个HTTP请求:
http://somehost/weblogic
变为:http://somehost/weblogic/welcome.html。只有当所有被重定向的web应用指定相同的欢迎页面, 该参数才起作用。可以参见以下页面的"Configuring Welcome Pages"部分:
http://e-docs.bea.com/wls/docs61/webapp/components
对于Apache用户,所使用的是Stronghold或Raven的版本,在Location块中定义参数,而非IfModule块中
MaxPostSize -1 POST数据的允许的最大长度。如果内容的长度超过MaxPostSize,插件将返回一个错误消息。如果设置为-1,将不检查POST数据的长度。设置该参数可以防止通过发送大量数据使服务器过载的"拒绝服务攻击"。
MatchExpression
(该参数只适用于Apache HTTP服务器)
none 如果采用MIME类型方式代理,应该在一个IfModule块中使用MatchExpression参数设置文件名模式。
下面的一个例子说明了使用MIME类型方式的代理:
<IfModule mod_weblogic.c>
MatchExpression *.jsp
WebLogicHost=myHost|paramName=value
</IfModule>
下面的一个例子说明了使用路径方式的代理:
<IfModule mod_weblogic.c>
MatchExpression /weblogicWebLogicHost=myHost|paramName=value
</IfModule>
FileCaching ON 当该参数设置为ON,如果请求中的POST数据大于2084个字节,那么POST数据保存在硬盘的一个临时文件中,然后以8192字节为单位传给WebLogic服务器。但将FileCaching设置为ON,可能引起的问题是浏览器上将显示一个进展条表明正在进行下载。即使文件还在传输,浏览器也会显示下在已经完成。
如果该参数设置为OFF,那么当POST数据大于2084字节时,数据保存在内存中并以8192字节为单位发送到WebLogic服务器。将参数设置为OFF可能会引起问题。因为插件不能进行失败转移,因此如果请求被处理时WebLogic 服务器宕机了,那么数据将被丢失。
WlForwardPath
(只有Microsoft IIS才需要定义该单数)
null 如果WLForwardPath设置为"/",那么所有请求都被代理到WebLogic服务器。如果只想代理以特定字符串开头的请求,那么应该将WlForwardPath参数设置为这个字符串。例如,将WlForwardPath设置为/webogic,那么所有以/weblogic开始的请求都将被代理到WebLogic服务器。
如果采用路径方式的代理,那么必须设置该参数。可以为该参数设置多个字符串,字符串之间用逗号隔开,例如:WlForwardPath=/weblogic,/bea。
KeepAliveSecs
(不要为Apache HTTP服务器版本1.3.x定义该参数)
30 该参数定义了隔多长时间后,插件与WebLogic服务器之间的非活动连接将被关闭。要使该参数生效,KeepAliveEnabled参数应该设置为true。
该参数的值应该小于或等于在管理控制台的Server/HTTP标签页中Duration字段的值,或者是服务器Mbean中的keepAliveSecs属性的值。
KeepAliveEnabled True 启用插件与WebLogic服务器之间的连接池。
QueryFromRequest
(只适用于Apache HTTP服务器)
OFF 如果该参数设置为ON,那么Apache插件使用(request_rec *)r->the request将查询字符串传递到WebLogic服务器。(详细信息,请参见Apache文档。)这种行为在以下场合非常有用:
当Netscape 版本4.x浏览器发出的请求的查询字符串中包含空格。
如果你在HP上使用Raven Apache 1.5.2
如果该参数设置为OFF,那么Apache插件使用(request_rec *)r->args将查询字符串传递到WebLogic服务器。
MaxSkips
(在Apache 1.3 中不可用)
10 只有当DynamicServerList设置为OFF时,该参数的设置才生效。如果WebLogicCluster参数所设置的列表或由WebLogic服务器返回的动态集群列表中的WebLogic服务器失败了,那么该失败的服务器被标记为"坏的",同时插件将连接到列表中的下一个服务器中。
MaxSkip设置了插件重试"坏"服务器的次数。每当插件接收到一个唯一请求(即不包含cookie的请求)时,它会连接到列表中的一个新服务器上
DynamicServerList
(只能在Microsfot IIS中设置该参数)
ON

如果该参数设置为OFF,在对由插件所代理的请求进行负载平衡时,不使用动态集群列表,而是使用WebLogicCluster参数指定的静态列表。通常情况下,该参数应该设置为ON。将该参数设置为ON,可能会产生以下影响:

  • 如果静态列表中的一或多个服务器失败了,那么插件可能会因为重试连接到失效服务器而导致性能的降低。
  • 当你在集群中新增了一个服务器,如果不重新定义这个参数,插件就不能将请求代理到这个新服务器上。WebLogic服务器会自动地将新服务器加到动态服务器列表,从而使新服务器成为集群的一部分。