Apache HTTP Server 插件允许将请求从 Apache HTTP Server 代理到 WebLogic Server。该插件允许 WebLogic Server 处理要求使用 WebLogic Server 动态功能的请求,从而增强了 Apache 安装。
该插件专用于某种环境,在这样的环境中,Apache Server 提供静态页,而文档树的另一个部分(最好是由 HTTP Servlet 或 Java Server Page 生成的动态页)会委托给可以在不同的进程中(可能在不同的主机上)进行操作的 WebLogic Server。对于最终用户(浏览器),委托给 WebLogic Server 的 HTTP 请求看似仍然来自同一个来源。
HTTP 隧道是一种技术,它允许 HTTP 请求和响应通过公司的防火墙进行访问。它也可以通过插件操作,提供对 WebLogic Server 服务的非浏览器客户端访问。
Apache HTTP Server 插件充当 Apache HTTP Server 中的 Apache 模块。Apache 模块由 Apache Server 在启动时加载,然后某些 HTTP 请求会委托给它。Apache 模块类似于 HTTP Servlet(除了 Apache 模块是用平台本地代码编写的之外)。
有关支持 Apache HTTP Server 插件的配置的信息,请参阅 http://edocs.bea.com/platform/suppconfigs/configs92/92_over/add-ons.html。
2.0 版的 Apache HTTP Server 插件通过使用从插件到 WebLogic Server 的可重用连接缓冲池提高了性能。该插件通过对来自同一客户端的后续请求重用缓冲池中的同一连接,在插件和 WebLogic Server 之间实现了 HTTP 1.1 保持活动连接。如果连接处于非活动状态的时间超过 30 秒(或用户定义的时间),则会关闭该连接并将其返回到缓冲池中。可以根据需要禁用此功能。有关详细信息,请参阅“KeepAliveEnabled”。
插件根据指定的配置将请求代理到 WebLogic Server。可以根据请求的 URL(或 URL 的一个部分)代理请求。这称为按路径进行代理。还可以根据请求文件的 MIME 类型代理请求。或者可以使用这两种方法的组合。如果请求同时符合这两个条件,则按路径代理请求。同时,可以为每种类型的请求指定其他参数,来定义插件的其他行为。有关详细信息,请参阅配置 Apache HTTP Server 插件。
尽管此文档讨论的是 Apache 2.0,您可应用同样的说明来使用具有表 3-2 中所示的库的 Apache 2.2。
Linux、Solaris、Windows 和 HPUX11 平台支持 Apache HTTP Server 插件。有关对特定 Apache 版本的支持信息,请参阅 http://edocs.bea.com/platform/suppconfigs/configs92/92_over/add-ons.html。
可将 Apache HTTP Server 插件作为 Apache HTTP Server 安装中的 Apache 模块进行安装,并将其作为动态共享对象(Dynamic Shared Object,简称 DSO)进行链接。
DSO 作为服务器在运行时动态加载的库进行编译,可以在不重新编译 Apache 的情况下安装。
Apache 插件作为 Solaris、Linux、Windows 和 HPUX11 平台的共享对象 (.so
) 分发。BEA WebLogic 提供因平台、是否要在客户端和 Apache 之间使用 SSL 以及 SSL 加密强度(常规或 128 位 - 只有在安装 128 位版本的 WebLogic Server 时才会安装 128 位版本)而异的共享对象文件版本。
表 3-1 显示包含各种平台的共享对象文件的 WebLogic Server 安装目录(其中 WL_HOME 是 WebLogic 平台的顶级安装目录)。
表 3-2 针对不同版本的 Apache HTTP Server 和不同加密强度来标识 WebLogic Server Apache 插件模块。
export EXTRA_LDFLAGS="-lstd -lstream -lCsup -lm -lcl -ldld -lpthread" |
要将 Apache HTTP Server 插件作为动态共享对象安装,请执行下列操作:
mod_so.c
模块。 Apache HTTP Server 插件将作为动态共享对象 (DSO) 安装在 Apache HTTP Server 安装中。Apache 中的 DSO 支持是基于模块 mod_so.c
的,必须在加载 mod_wl_20.so 之前启用该模块。如果使用 Apache 提供的脚本安装 Apache HTTP Server,则 mod_so.c
已被启用。通过执行以下命令,验证是否已启用 mod_so.c
:
APACHE_HOME
\bin\apache -l
(其中 APACHE_HOME
是包含 Apache HTTP Server 安装的目录。)
此命令会列出所有已启用的模块。如果未列出 mod_so.c
,则必须重新生成 Apache HTTP Server,以确保配置下列选项:
...
--enable-module=so
--enable-rule=SHARED_CORE
...
请参阅位于 http://httpd.apache.org/docs/2.0/dso.html 的“Apache 2.0 Shared Object (DSO) Support”。
mod_wl_20.so
文件复制到 APACHE_HOME
\modules
目录中,并将以下行手工添加到 APACHE_HOME
/conf/httpd.conf 文件中,为 Apache 2.0.x 版安装 Apache HTTP Server 插件模块: LoadModule weblogic_module modules/mod_wl_20.so
Apache HTTP Server 插件可识别 Web 服务器插件的常规参数中列出的参数。要修改 Apache HTTP Server 插件的行为,请在以下块中定义这些参数:
APACHE_HOME
\conf\httpd.conf 文件的语法: APACHE_HOME\bin\apachectl -t
此命令的输出将报告 httpd.conf
文件中的任何错误或返回:
Syntax OK
/weblogic/
”(这将打开默认 WebLogic Server HTML 页、欢迎文件或默认 Servlet,如 WebLogic Server 上对默认 Web 应用程序的定义)来测试插件。例如: http://myApacheserver.com/weblogic/
在 Apache HTTP Server 中安装插件后,需要对 WebLogic Server Apache 插件进行配置并将服务器配置为使用该插件。本部分说明如何编辑 Apache httpd.conf
文件以指示 Apache 服务器为作为 Apache 模块的插件加载 WebLogic Server 库,并指定应由该模块处理的应用程序请求。
编辑 Apache HTTP Server 安装中的 httpd.conf
文件以配置 Apache HTTP Server 插件。
本部分说明如何查找和编辑 httpd.conf
文件以实现下列操作:配置服务器以使用 WebLogic Server Apache 插件、按路径或 MIME 类型代理请求、启用 HTTP 隧道,以及使用其他 WebLogic Server 插件参数。
httpd.conf
文件。 该文件位于 APACHE_HOME
\conf\httpd.conf
(其中 APACHE_HOME
是 Apache HTTP Server 安装的根目录)。请参阅设置边界身份验证中的示例 httpd.conf
文件。
httpd.conf
文件中。 LoadModule weblogic_module modules\mod_wl_20.so
IfModule
块: WebLogicHost 和 WebLogicPort 参数。
<IfModule mod_weblogic.c>
WebLogicHost myweblogic.server.com
WebLogicPort 7001
</IfModule>
MatchExpression
行添加到 IfModule
块中。请注意,如果同时启用按 MIME 类型进行的代理和按路径进行的代理,则按路径进行的代理优先于按 MIME 类型进行的代理。 例如,以下针对非群集 WebLogic Server 的 IfModule
块指定代理具有 MIME 类型 .jsp
的所有文件:
<IfModule mod_weblogic.c>
WebLogicHost myweblogic.server.com
WebLogicPort 7001
MatchExpression *.jsp
</IfModule>
<IfModule mod_weblogic.c>
WebLogicHost myweblogic.server.com
WebLogicPort 7001
MatchExpression *.jsp
MatchExpression *.xyz
</IfModule>
如果要按 MIME 类型将请求代理到 WebLogic Server 群集,请使用 WebLogicCluster
参数,而不使用 WebLogicHost
和 WebLogicPort
参数。例如:
<IfModule mod_weblogic.c>
WebLogicCluster w1s1.com:7001,w1s2.com:7001,w1s3.com:7001
MatchExpression *.jsp
MatchExpression *.xyz
</IfModule>
Location
块和 SetHandler
语句。SetHandler
指定Apache HTTP Server 插件模块的处理程序。例如,以下位置块代理 URL 中包含 /weblogic
的所有请求: <Location /weblogic>
SetHandler weblogic-handler
PathTrim /weblogic
</Location>
PathTrim 参数指定在将请求传递到 WebLogic Server 实例之前从 URL 的开始部分剪切的字符串(请参阅 Web 服务器插件的常规参数)。
Apache HTTP Server 插件可识别 Web 服务器插件的常规参数中列出的参数。要修改 Apache HTTP Server 插件的行为,请在以下块中定义这些参数:
如果希望保留几个单独的配置文件,则可通过在 httpd.conf
文件的 IfModule
块中使用 Apache Include 指令,在名为 weblogic.conf
文件的单独配置文件中定义参数:
<IfModule mod_weblogic.c>
# Config file for WebLogic Server that defines the parameters
Include conf/weblogic.conf
</IfModule>
weblogic.conf
文件的语法与 httpd.conf
文件的语法相同。
本部分描述如何创建 weblogic.conf
文件,并包括示例 weblogic.conf
文件。
Include
指令访问的文件(与 weblogic.conf
文件一样)中定义参数。 PARAM_1 value1
PARAM_2 value2
PARAM_3 value3
IfModule
块中的 MatchExpression
中指定的 MIME 类型匹配,又与 Location
块中指定的路径匹配,则 Location
块指定的行为优先。 CookieName
参数,则必须在 IfModule
块中定义它。 <VirtualHost>
块,则必须在 <VirtualHost>
块中包括虚拟主机的所有配置参数(例如 MatchExpression
)(请参阅 Apache Virtual Host documentation)。 <IfModule mod_weblogic.c>
WebLogicCluster agarwalp02:8005,agarwalp02:8006
Debug ON
WLLogFile c:/tmp/global_proxy.log
WLTempDir "c:/myTemp"
DebugConfigInfo On
KeepAliveEnabled ON
KeepAliveSecs 15
</IfModule>
<Location /jurl>
SetHandler weblogic-handler
WebLogicCluster agarwalp01:7001
</Location>
<Location /web>
SetHandler weblogic-handler
PathTrim /web
Debug OFF
WLLogFile c:/tmp/web_log.log
</Location>
<Location /foo>
SetHandler weblogic-handler
PathTrim /foo
Debug ERR
WLLogFile c:/tmp/foo_proxy.log
</Location>
MatchExpression
语句,而不使用 <files>
块。 以下示例 weblogic.conf
文件可以用作模板,您可以对其进行修改以满足您的环境和服务器的需要。以 # 开始的行是注释。
# 这些参数对于定向到当前模块
# 的 URL 是常用的。如果要替换每个 URL 的这些参数,
# 可以在 <Location> 或 <Files> 模块中重新设置
# 它们。(WebLogicHost、
# WebLogicPort、 WebLogicCluster 和 CookieName 除外。)
<IfModule mod_weblogic.c>
WebLogicCluster w1s1.com:7001,w1s2.com:7001,w1s3.com:7001
ErrorPage http://myerrorpage.mydomain.com
MatchExpression *.jsp
</IfModule>
####################################################
在此示例中,用于表示文件名模式的 MatchExpression
参数语法、HTTP 请求应转发到的 WebLogic Server 主机以及各种其他参数如下所示:
MatchExpression [filename pattern] [WebLogicHost=host] | [paramName=value]
下面的第一个 MatchExpression
参数指定文件名模式 *.jsp
,然后命名单个 WebLogicHost
。管道符号后的 paramName=value
组合指定 WebLogic Server 用于监听连接请求的端口,同时激活“Debug”选项。第二个 MatchExpression
指定文件名模式 *.http
并标识 WebLogicCluster
主机及其端口。管道符号后的 paramName=value
组合指定群集的错误页。
# 这些参数对于定向到当前模块
# 的 URL 是常用的。如果要替换每个 URL 的这些参数,
# 可以在 <Location> 或 <Files> 模块中重新设置
# 它们。
#(WebLogicHost、WebLogicPort、WebLogicCluster 和 CookieName 除外)
<IfModule mod_weblogic.c>
MatchExpression *.jsp WebLogicHost=myHost|WebLogicPort=7001|Debug=ON
MatchExpression *.html WebLogicCluster=myHost1:7282,myHost2:7283|ErrorPage=
http://www.xyz.com/error.html
</IfModule>
# 这些参数对于定向到当前模块
# 的 URL 是常用的。如果要替换每个 URL 的这些参数,
# 可以在 <Location> 或 <Files> 模块中重新设置
# 它们。
#(WebLogicHost、WebLogicPort、WebLogicCluster 和 CookieName 除外)
<IfModule mod_weblogic.c>
WebLogicHost myweblogic.server.com
WebLogicPort 7001
MatchExpression *.jsp
</IfModule>
# VirtualHost1 = localhost:80
<VirtualHost 127.0.0.1:80>
DocumentRoot "C:/test/VirtualHost1"
ServerName localhost:80 <IfModule mod_weblogic.c>
#... WLS 参数 ...
WebLogicCluster localhost:7101,localhost:7201
# 示例:MatchExpression *.jsp <some additional parameter>
MatchExpression *.jsp PathPrepend=/test2
</IfModule>
</VirtualHost>
# VirtualHost2 = 127.0.0.2:80
<VirtualHost 127.0.0.2:80>
DocumentRoot "C:/test/VirtualHost1"
ServerName 127.0.0.2:80
<IfModule mod_weblogic.c>
#... WLS 参数 ...
WebLogicCluster localhost:7101,localhost:7201
# 示例:MatchExpression *.jsp <some additional parameter>
MatchExpression *.jsp PathPrepend=/test2
#... WLS 参数 ...
</IfModule>
</VirtualHost> <IfModule mod_weblogic.c>
必须为“ServerName”定义唯一值,否则某些插件参数将不能按预期工作。
本部分包含 Apache 2.0 的示例 httpd.conf
文件。您可将此示例用作模板,并对其进行修改以满足您的环境和服务器的需要。以 # 开始的行是注释。
请注意,Apache HTTP Server 不区分大小写。
####################################################
APACHE-HOME/conf/httpd.conf file
####################################################
LoadModule weblogic_module libexec/mod_wl_20.so
<Location /weblogic>
SetHandler weblogic-handler
PathTrim /weblogic
ErrorPage http://myerrorpage1.mydomain.com
</Location>
<Location /servletimages>
SetHandler weblogic-handler
PathTrim /something
ErrorPage http://myerrorpage1.mydomain.com
</Location>
<IfModule mod_weblogic.c>
MatchExpression *.jsp
WebLogicCluster w1s1.com:7001,w1s2.com:7001,w1s3.com:7001
ErrorPage http://myerrorpage.mydomain.com
</IfModule>
使用边界身份验证可确保通过 Apache 插件访问的 WebLogic Server 应用程序的安全。
WebLogic 标识声明提供程序对来自访问 WebLogic Server 应用程序的外部系统的标记进行身份验证,包括对通过 Apache HTTP Server 插件访问 WebLogic Server 应用程序的用户进行身份验证。按照下列步骤,创建确保插件安全的标识声明提供程序:
web.xml
部署描述符文件中将 clientCertProxy
设置为 True(如果使用群集,也可以选择在管理控制台中,依次选择“群集”-->“配置”-->“常规”选项卡,在该选项卡上对整个群集将 Client Cert Proxy Enabled
特性设置为 True)。clientCertProxy
特性可与第三方代理服务器(如负载平衡器或 SSL 加速器)一起使用以启用 2 向 SSL 身份验证。有关 clientCertProxy
特性的详细信息,请参阅“开发 WebLogic Server 的 Web 应用程序、Servlet 和 JSP”中的 context-param。 clientCertProxy
之后,请务必使用连接筛选器来确保 WebLogic Server 仅接受来自运行 Apache 插件的计算机的连接。请参阅“WebLogic 安全性编程”中的使用网络连接筛选器。 请参阅“开发 WebLogic Server 的安全提供程序”中的标识声明提供程序。
可以使用安全套接口层(Secure Socket Layer,简称 SSL)协议保护 Apache HTTP Server 插件和 WebLogic Server 之间的连接。SSL 协议对 Apache HTTP Server 插件和 WebLogic Server 之间传递的数据提供机密性和完整性。
Apache HTTP Server 插件不使用 HTTP 请求中(通常由浏览器)指定的传输协议(http
或 https
)来确定是否使用 SSL 协议来保护 Apache HTTP Server 插件和 WebLogic Server 之间的连接。
虽然可以在 HTTP 客户端和 Apache HTTP Server 之间使用双向 SSL,但请注意,在 Apache HTTP Server 和 WebLogic Server 之间使用的是单向 SSL。
要在 Apache HTTP Server 插件和 WebLogic Server 之间使用 SSL 协议,请执行下列操作:
httpd.conf
文件中的 WebLogicPort
参数设置为步骤 2 中配置的 WebLogic Server SSL 监听端口。 httpd.conf
文件中的 SecureProxy
参数设置为 ON
。 httpd.conf
文件中设置可定义有关 SSL 连接的信息的任何其他参数。有关可以为插件配置的 SSL 参数的完整列表,请参阅 Web 服务器插件的 SSL 参数。 配置 Apache 插件以使用 SSL 时会出现以下已知问题:
<Location>
标记内配置。 <Location /weblogic>
SetHandler weblogic-handler
</Location>
<IfModule mod_weblogic.c>
WebLogicHost localhost
WebLogicPort 7001
PathTrim /weblogic
</IfModule>
<Location /weblogic>
SetHandler weblogic-handler
PathTrim /weblogic
</Location>
Include
指令不能与 Apache SSL 一起使用。必须在 httpd.conf
文件中直接配置所有参数。使用 SSL 时请不要使用以下配置: <IfModule mod_weblogic.c>
MatchExpression *.jsp
Include weblogic.conf
</IfModule>
当 Apache HTTP Server 插件尝试连接到 WebLogic Server 时,插件使用几个配置参数确定等待连接到 WebLogic Server 主机的时间长度,以及建立连接后插件等待响应的时间长度。如果插件无法连接或未收到响应,则插件将尝试连接到群集中的其他 WebLogic Server 实例并向其发送请求。如果连接失败或者没有来自群集中任何 WebLogic Server 的响应,则会发送错误消息。
图 3-1 说明插件如何处理故障转移。
WebLogic Server 主机无法响应连接请求可能表明下列问题:
所有 WebLogic Server 实例都无法响应可能表明下列问题:
在有负载时,Apache 插件可能收到来自后端 WebLogic Server 实例的 CONNECTION_REFUSED 错误。可根据以下调整提示减少 CONNECTION_REFUSED 错误:
AcceptBackLog
设置。 httpd.conf
文件中的 KeepAlive
指令设置为 On。例如: # KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
请参阅位于 http://httpd.apache.org/docs-project/ 的 Apache HTTP Server 2.0 文档。
TcpTimedWaitDelay
设置为较低的值。通过编辑 HKEY_LOCAL_MACHINE
下的注册表项来设置 Windows NT 中的 TIME_WAIT 时间间隔。 SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay
如果此项不存在,则可以将其作为 DWORD 值创建。数字值是要等待的秒数,可将其设置为介于 30 和 240 之间的任意值。如果未设置,默认情况下 Windows NT 会将 TIME_WAIT
设置为 240 秒。
HKEY_LOCAL_MACHINE
下的注册表项降低 TcpTimedWaitDelay
的值: SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
tcp_time_wait_interval
降低为一秒(如果可能,对 WebLogic Server 计算机和 Apache 计算机都进行此设置): $ndd /dev/tcp
param name to set - tcp_time_wait_interval
value=1000
limit
(.csh
) 或 ulimit
(.sh
) 指令,可以制作一个脚本来提高此限制。例如: #!/bin/sh
ulimit -S -n 100
exec httpd
如果仅运行一个 WebLogic Server 实例,则插件仅尝试连接到使用 WebLogicHost 参数定义的服务器。如果尝试失败,则会返回 HTTP 503
错误消息。插件继续尝试连接到该同一 WebLogic Server 实例,直到超出 ConnectTimeoutSecs。
使用 httpd.conf
或 weblogic.conf
文件中的 WebLogicCluster
参数指定 WebLogic Server 列表时,插件将该列表用作在群集成员之间进行负载平衡的起点。将第一个请求路由到这些服务器之一后,会返回一个动态服务器列表,其中包含群集中已更新的服务器列表。更新的列表添加群集中的任何新服务器并删除不再属于群集或无法响应请求的任何服务器。当群集中发生更改时,会使用 HTTP 响应自动更新此列表。
当请求包含存储在 Cookie 或 POST 数据中的会话信息或包含编码到 URL 中的会话信息时,会话 ID 会包含对最初建立会话的特定服务器实例(称为主服务器)的引用,并包含对复制原始会话的其他服务器(称为次级服务器)的引用。包含 Cookie 的请求会尝试连接到主服务器。如果该尝试失败,则会将该请求路由到次级服务器。如果主服务器和次级服务器均故障,则会话将丢失,插件将尝试与动态群集列表中的其他服务器建立新的连接。请参阅图 3-1 连接故障转移。
注意: | 如果 POST 数据大于 64K,插件将不会对 POST 数据进行解析以获取会话 ID。因此,如果您将会话 ID 存储在 POST 数据中,插件无法将请求路由到正确的主服务器或次级服务器,从而可能导致会话数据的丢失。 |
在上图中,红圈中允许的最大重试次数等于 ConnectTimeoutSecs 除以 ConnectRetrySecs。