Sun ONE Application Server 7 管理员指南 |
第 7 章
配置 Web 服务器插件本章介绍 Sun ONE Application Server 如何处理超文本传输协议 (HTTP) 请求,以及如何配置并与 Sun ONE Application Server 一起使用 Web 服务器插件。此外,还介绍了如何配置并与 Microsoft IIS 和 Apache Web 服务器一起使用 Web 服务器插件。
本章包括以下主题:
关于 Web 服务器插件Web 服务器插件是 HTTP 反向代理插件,允许您指示 Sun ONE Web Server 或 Sun ONE Application Server 将某些 HTTP 请求转发至其他服务器。例如,您可以对连接至因特网的 Web 服务器进行配置,以便将特定 Web 应用程序的请求转发至位于公司防火墙之后的应用服务器。
在 Sun ONE Application Server 中,Web 服务器插件允许在不同的服务器实例之间转发 HTTP (Web) 请求。
Web 服务器插件执行以下功能:
要了解 Web 服务器插件的工作原理,必须了解 HTTP 请求的基本原理,尤其是 Sun ONE Application Server 用来处理 HTTP 请求的方法。
处理客户机请求Sun ONE Application Server 是可以直接接受并响应 HTTP 请求的应用服务器。本节将介绍 HTTP 的基本原理以及 Sun ONE Application Server 处理请求的方式。本节包括以下主题:
HTTP 基本原理
简而言之,HTTP/1.1 协议的工作原理如下:
请求由表示方法(例如 GET 或 POST)的行、表示所请求的资源的通用资源标识符 (URI) 以及 HTTP 协议版本组成,各部分以空格分隔。
请求后面通常包含一些标题、表示标题结尾的空白行,有时还会包含正文数据。标题可提供各种有关请求或客户机正文数据的信息。标题通常只针对 POST 和 PUT 方法发送。
以下显示的示例请求由浏览器发送,用于请求服务器 foo.com 返回 /index.html 中的资源。此示例使用了方法 GET,因此未发送任何正文数据(此请求用于获取而不是发送某些数据)。
GET /index.html HTTP/1.0
User-agent:Mozilla
Accept:text/html, text/plain, image/jpeg, image/gif, */*
Host:foo.com
此服务器接收请求并对其进行处理。尽管它可以同步处理多个请求,但仍单独处理每个请求。每个请求被分为一系列步骤,这些步骤合起来构成请求处理进程。
此服务器生成响应,其中包含 HTTP 协议版本、HTTP 状态代码和原因词组,三者之间以空格分隔。响应后面通常包含一些标题。标题结尾以空白行表示。之后是响应的正文数据。典型的 HTTP 响应可能如下所示:
HTTP/1.0 200 OK
Server:Standard/7.0
Content-type:text/html
Content-length: 83
<HTML>
<HEAD><TITLE>Hello World</Title></HEAD>
<BODY>Hello World</BODY>
</HTML>
状态代码和原因词组通知客户机服务器处理请求的方式。通常情况下,返回状态代码 200,表示已成功处理请求,且正文数据包含请求的项目。其他结果代码表示重定向到其他服务器或浏览器的高速缓存,或者返回各种类型的 HTTP 错误,例如,“404 Not Found”。
请求处理进程的执行步骤
Sun ONE Application Server 在首次启动时将执行某些初始化任务,然后等待客户机(例如浏览器)发出 HTTP 请求。它在接收到请求时,将首先选择虚拟服务器。
选择虚拟服务器后,该虚拟服务器的 obj.conf 文件将指定如何通过以下步骤处理请求:
- AuthTrans(授权转换)
验证请求中发送的任何授权信息(例如,名称和口令)。
- NameTrans(名称转换)
将逻辑 URI 转换为本地文件系统路径。
- PathCheck(路径检查)
检查本地文件系统路径是否有效,并检查请求者对此文件系统上的请求资源是否具有访问权限。
- ObjectType(对象类型确定)
确定所请求资源的 MIME 类型(多用途 Internet 邮件编码),例如,text/html、image/gif 等。
- Service(生成响应)
生成响应并将其返回客户机。
- AddLog(添加日志条目)
向日志文件中添加条目。
- Error(服务)
仅当前面的步骤中发生错误时才会执行此步骤。如果发生错误,服务器将记录错误信息并中止此进程。
Web 服务器插件配置Web 服务器插件的配置和行为由一组配置文件决定。Sun ONE Application Server 将在每次处理客户机请求时查看这些文件中定义的配置。这些配置文件名为 obj.conf 和 init.conf。obj.conf 文件以虚拟服务器的名称作为前缀,例如 server1-obj.conf。有关详细信息,请参见 obj.conf 文件。
Sun ONE Application Server 的每个实例都有其自己的 init.conf 文件,服务器将在启动时引用此文件。
正如前面的主题所介绍,obj.conf 配置文件包含一系列指令,用于通知 Sun ONE Application Server 在客户机请求和响应进程的每个阶段要执行的操作。每个指令都调用服务器应用程序函数 (SAF)。
obj.conf 文件对 Sun ONE Application Server 的运行至关重要。通过管理界面对服务器进行更改时,系统将自动更新 obj.conf。
init.conf 配置文件用于设置在初始化过程中配置服务器的变量的值。服务器将在启动过程中执行此文件中指定的配置参数。有关详细信息,请参见《Sun ONE Application Server Administrator's Configuration File Reference》。
下图显示 Web 浏览器、前端 Web 服务器、后端应用服务器以及 Web 服务器插件的 service-passthrough 和 auth-passthrough SAF 之间的关系:
图 7-1 Web 浏览器、Web 服务器、应用服务器以及 Web 服务器插件 SAF 之间的关系
Web 服务器插件 SAF 参考本节介绍以下服务器应用程序函数 (SAF) 的功能和行为:
init-passthrough
init-passthrough 函数用于初始化 Web 服务器插件。必须调用此函数,才能使用 Web 服务器插件。
示例:
Init fn="load-modules" shlib="c:/plugins/passthrough.dll" funcs="init-passthrough,auth-passthrough,check-passthrough,service-passthrough" NativeThread="no"
Init fn="init-passthrough"
auth-passthrough
auth-passthrough SAF 可在 AuthTrans-class 指令中使用。
auth-passthrough 函数检查传入的 HTTP (web) 请求中是否存在由中间服务器上运行的 service-passthrough 函数编码的客户机信息。客户机信息包括:
当 auth-passthrough 检测到编码的客户机信息时,它将把请求作为初始客户机的直接请求,而不是作为由运行 service-passthrough 的中间服务器转发的请求处理。
这在两层部署方案中很有用;
在此类网络体系结构中,客户机始终与运行代理插件的前端 Web 服务器连接。此 Web 服务器是用来将请求转发至 Sun ONE Application Server 的服务器。这表示 Sun ONE Application Server 只能从代理主机(本例中为 Web 服务器)接收请求,而不能直接从客户机主机接收请求。也就是说,如果应用程序(部署在两道防火墙之后的 Sun ONE Application Server 实例中)查询客户机信息(例如,客户机的 IP 地址),则将获得代理主机 IP(因为它是中继请求的实际初始主机)。可以使用 auth-passthrough SAF 修改此行为,以显示远程(代理)客户机信息。
由于 auth-passthrough 可能会覆盖用于验证的信息(例如,请求源自的 IP 地址),因此必须只允许将信任的客户机或服务器连接至运行 auth-passthrough 的服务器。作为一种预防措施,建议您只使用公司防火墙之后的服务器来运行 auth-passthrough。可通过 Internet 访问的服务器不应运行 auth-passthrough SAF。只有在需要有关初始客户机的相关信息时,才能使用 auth-passthrough SAF。
请注意,在以上所述的方案中,SSL 客户机验证只能在 Web 服务器上打开,并且始终要在应用服务器上关闭,这样配置才能正常工作。
命令示例:
AuthTrans fn="auth-passthrough"
service-passthrough
service-passthrough SAF 可在 Service-class 指令中使用。
service-passthrough SAF 将请求从一个服务器转发至另一个服务器进行处理。可以将 service-passthrough SAF 配置为使用 SSL 连接或非 SSL(HTTPS 或 HTTP)连接与远程服务器建立连接,并且不受用于接收初始请求的连接类型的影响。service-passthrough SAF 用于对有关初始客户机的信息进行编码,此信息可以由远程服务器上运行的 auth-passthrough 函数进行解码。
service-passthrough 指令通常与 obj.conf 配置文件中的其他指令组合使用,如下所示:
<Object name="passthrough">
ObjectType fn="force-type" type="magnus-internal/passthrough"
Error reason="Bad Gateway" fn="send-error" uri="$docroot/badgateway.html"
</Object>
<Object name="default">
....
NameTrans fn="assign-name" from="(/webapp1|/webapp1/*)" name="passthrough"
...
</Object>
如果后端应用服务器已关闭,则将向用户显示本地 HTML 文件 badgateway.html。如果运行 service-passthrough SAF 的服务器需要提供它可以访问的文件,并只将被拒绝的请求转发到后端应用服务器,则 ObjectType 行将改为:
ObjectType fn="check-passthrough" type="magnus-internal/passthrough"
check-passthrough
check-passthrough SAF 可在 ObjectType-class 指令中使用。
check-passthrough 函数检查本地服务器中是否存在请求的资源(例如,HTML 文档或 GIF 图像)。如果不存在,check-passthrough SAF 将设置类型,指示应将请求传递到其他服务器以便由 service-passthrough SAF 进行处理。
参数:
type -(可选)请求资源不存在时设置的类型。默认类型为 "magnus-internal/passthrough"。
示例
ObjectType fn="check-passthrough"
使用 Web 服务器插件要在 Sun ONE Web Server 上使用 Web 服务器插件,必须同时更改 Sun ONE Application Server 和 Sun ONE Web Server 的配置文件。请按照本节列出的步骤配置和使用 Sun ONE Web Server 插件:
对 Sun ONE Web Server 的更改
在更改重要的配置文件(例如 magnus.conf 和 obj.conf)之前,请对其进行备份。
- 在 Web 服务器安装位置创建一个目录,用来包含 passthrough 插件。例如:
cd /webserver_install_dir/plugins
mkdir -p passthrough/bin
- 将 passthrough 插件从 Sun ONE Application Server 安装位置复制到这个新的 Web 服务器目录中。例如:
cd appserver_install_dir/lib
cp libpassthrough.so webserver_install_dir/plugins/passthrough/bin
对于 Windows,请复制 passthrough.dll 文件。
- 编辑 magnus.conf 文件(位于 webserver_install_dir/https-host.domain/config 中)并添加以下行:
Init fn="load-modules" shlib="webserver_install_dir/plugins/passthrough/bin/libpassthrough.so" funcs="init-passthrough,auth-passthrough,check-passthrough,service-passthrough" NativeThread="no"
Init fn="NSServletEarlyInit" EarlyInit=yes
Init fn="NSServletLateInit" LateInit=yes
Init fn="init-passthrough"
- 编辑 obj.conf 文件(位于 webserver_install_dir/https-host.domain/config 中)并添加 NameTrans 指令,如下所示:
<Object name=default>
NameTrans fn="NSServletNameTrans" name="servlet"
NameTrans fn="assign-name" from="/*" name="passthrough"
</Object>from="/*"uri 是远程服务器上部署的 Web 应用程序的上下文根,passthrough 与 obj.conf 中的 <Object> 的名称相对应。
例如:
<Object name="default">
...
NameTrans fn="assign-name" from="(/webapp1|/webapp1/*)" name="passthrough"
...
</Object>- 请在 obj.conf 文件中添加以下行:
<Object name="passthrough">
ObjectType fn="force-type" type="magnus-internal/passthrough"
PathCheck fn="deny-existence" path="*/WEB-INF/*"
Service type="magnus-internal/passthrough" fn="service-passthrough"
servers="http://servername:port"
Error reason="Bad Gateway" fn="send-error" uri="$docroot/badgateway.html"
</Object>- 重新启动 Sun ONE Web Server 实例。
下一步,必须配置 Sun ONE Web Server,将请求路由到 Web 服务器插件。
对 Sun ONE Application Server 的更改
在更改重要的配置文件(例如 magnus.conf 和 obj.conf)之前,请对其进行备份。
- 编辑 install_dir/domains/domain1/server1/config/init.conf 文件并添加以下行:
在 UNIX 上:
Init fn="load-modules" shlib="webserver_install_dir/plugins/passthrough/bin/libpassthrough.so"
funcs="init-passthrough,auth-passthrough,check-passthrough,service-passthrough" NativeThread="no"
Init fn="init-passthrough"在 Windows 上:
Init fn="load-modules" shlib="c:/install_dir/bin/passthrough.dll" funcs="init-passthrough,auth-passthrough,check-passthrough, service-passthrough" NativeThread="no"
Init fn="init-passthrough"- 编辑 install_dir/domains/domain1/server1/config/server1-obj.conf 并添加 AuthTrans 指令,如下所示:
<Object name="default">
AuthTrans fn="match-browser" browser="*MSIE*" ssl-unclean-shutdown="true" AuthTrans fn="auth-passthrough"
fn="service-passthrough" servers="server"
Error reason="Bad Gateway" fn="send-error" uri="$docroot/badgateway.html"
</Object>其中,server 是具有以下格式的 URL:
http://servername:port
- 重新启动 Sun ONE Application Server 实例。
上面是需要对 Sun ONE Application Server 所做的更改。下一节介绍的是配置单个应用服务器实例的步骤。要启用更多实例以使用 Web 服务器插件,必须更改这些应用服务器实例的配置文件。
配置 Microsoft IIS 以使用 Web 服务器插件配置 Microsoft Internet Information 服务以使用 Web 服务器插件涉及到对 Web 服务器插件和 Microsoft IIS 进行配置,使两者可以相互使用。
此外,您还可以配置服务器池,以处理在不同服务器上运行的多个应用程序。
本节包括以下主题:
为 IIS 配置 Web 服务器插件
要为 IIS 配置 Web 服务器插件,请执行以下任务:
- 在 C:\ 命令行提示处键入以下命令,在 IIS wwwroot 目录下为 Web 服务器插件创建一个目录:
md \Inetpub\wwwroot\sun-passthrough
- 将插件文件复制到 C:\Inetpub\wwwroot\sun-passthrough 目录。
- 使用文本编辑器将安装 Sun ONE Application Server 的计算机的 URL 添加到 C:\Inetpub\wwwroot\sun-passthrough\sun-passthrough.properties 文件中。
您需要通过文本编辑器添加以下信息:
server=http://appservername:port
其中,appservername 是安装 Sun ONE Application Server 的计算机的主机名或 IP 地址,port 是其侦听的端口号(此值通常设置为 80)。
- 在 C:\Inetpub\wwwroot\sun-passthrough\sun-passthrough.properties 文件中列出 Sun ONE Application Server 要处理的上下文根。
这些上下文根应与 Sun ONE Application Server 中部署的应用程序的上下文根相对应。对这些上下文根的请求将由 Sun ONE Application Server 处理,其他请求则由 IIS Web 服务器处理。用于将请求传递给 Web 应用程序的命令行如下:
passthrough=/webapplication
其中,/webapplication 是 Web 服务器的上下文根。要将所有请求传递给 Sun ONE Application Server,请添加以下行:
passthrough=/
至此,您已完成了对 Microsoft IIS 根目录下的 Web 服务器插件的配置。要完成整个过程,还需要配置 Microsoft IIS 以使用此 Web 服务器插件。
配置 IIS 以使用 Web 服务器插件
要配置 IIS 以使用 Web 服务器插件,需要打开 Windows Internet 服务管理器。Internet 服务管理器位于“控制面板”文件夹的“管理工具”文件夹中。
打开 Internet 服务管理器,并执行以下任务:
- 选择要启用此插件的 Web 站点。此 Web 站点通常命名为“默认的 Web 站点”。
- 在此 Web 站点上单击鼠标右键,并选择“属性”以打开“属性”记事本。
- 打开“ISAPI 过滤器”选项卡,单击“添加”按钮,然后执行以下步骤添加新的 ISAPI 过滤器:
- 现在,您需要创建并配置一个新的虚拟目录。执行以下步骤,创建并配置一个新的虚拟目录:
- 您需要停止并启动 Web 服务器,才能使新的设置生效。要停止 Web 服务器,请在此 Web 站点上单击鼠标右键,然后选择“停止”。要启动 Web 服务器,请在此 Web 站点上单击鼠标右键,然后选择“启动”。
接下来,在 Web 浏览器中键入以下地址,以访问此 Web 应用程序的上下文根:
http://webservername/webapplication
其中,webservername 是 Web 服务器的主机名或 IP 地址,/webapplication 是在 C:\Inetpub\wwwroot\sun-passthrough\sun-passthrough.properties 文件中列出的上下文根,用于验证 Web 服务器、Web 服务器插件和 Sun ONE Application Server 是否正常运行。
配置多个服务器池
通过在 sun-passthrough.properties 文件中配置服务器池,可以将 Web 应用程序分布到多个应用服务器中(即,在一组服务器上运行一些应用程序,而在另一组服务器上运行其他应用程序)。为每个服务器池选择一个唯一的名称(由字母和数字组成)。按照配置 Microsoft IIS 以使用 Web 服务器插件一节中的介绍完成为 Microsoft IIS 安装和配置 Web 服务器插件的步骤后,应编辑 C:\Inetpub\wwwroot\sun-passthrough\sun-passthrough.properties 文件并在相关的服务器和 passthrough 属性行之前加上为服务器池选择的唯一名称作为前缀。在服务器池名称后加上句点 (.)。
例如,sun-passthrough.properties 文件中的以下行定义了两个服务器池。第一个服务器池包含 server-a 以及上下文根 /app1 的服务请求。第二个服务器池包含 server-b 以及 /app2 和 /app3 上下文根的服务请求。
server=http://server-a
passthrough=/app1
serverpool2.server=http://server-b
serverpool2.passthrough=/app2
serverpool2.passthrough=/app
样例 sun-passthrough.properties 文件
# Sun ONE Application Server web server plugin for IIS
#
# This file is used to configure the Sun ONE Application Server web server
# plugin for IIS.Lines beginning with a '#' are ignored.
# server
#
# The server property specifies the URL of an application server.If multiple
# server properties are given, the plugin will distribute load across the
# specified application servers.
#
server=http://localhost:8080
# passthrough
#
# The passthrough property specifies the context root (virtual directory) of a
# web application.Requests for the given context root will be passed to the
# application server for processing.If 'passthrough=/' is specified, all
# requests will be passed to the application server for processing.
#
# passthrough properties should be ordered from most to least specific.For
# example, 'passthrough=/apps/app1' should appear before 'passthrough=/apps'.
#
# Multiple passthrough properties are allowed.
#
#passthrough=/webapp
#passthrough=/servlets
#passthrough=*.jsp
passthrough=/
# prefix
#
# The prefix property specifies the IIS virtual directory that contains the
# plugin DLL, sun-passthrough.dll.
#
prefix=/sun-passthrough
# error-url
#
# The error-url property specifies the URL of a page to redirect the client to
# when the application server is unavailable.
#
#error-url=/badgateway.htm
# It is possible to configure multiple server pools by prefixing the server
# and passthrough property names with a pool name followed by a period ('.').
# Pool names can be any sequence of letters and numbers.
#
# For example, the following properties define two server pools.One server
# pool will service the web applications at '/app1' and the other will service
# the web applications at '/app2' and '/app3':
#
#serverpool1.server=http://server-a
#serverpool1.passthrough=/app1
#
#serverpool2.server=http://server-b
#serverpool2.passthrough=/app2
#serverpool2.passthrough=/app3
配置 Apache Web 服务器本节介绍如何编译 Apache 源代码,以及如何配置 Apache Web 服务器安装以便与 Sun ONE Application Server 一起运行。
要使 HTTP 请求能够发送到 Sun ONE Application Server,必须编译 Apache 源代码以使用 mod_proxy 模块,还需要修改 httpd.conf 文件。
本节包含执行以下步骤的信息:
最低要求
必须满足以下要求才能成功编译 Apache Web 服务器并使用 mod_proxy 插件。
使用 mod_proxy 模块编译 Apache
- 使用内置 mod_proxy 模块从 www.apache.org 下载最新的 Apache 源代码分发
将源代码分发解压缩。源代码分发以压缩归档文件的形式提供。如果要安装 Apache 1.3.27,则源代码分发归档文件将为 apache_1.3.27.tar.gz。
- 使用以下命令解压缩归档文件:
$ tar -zxvf apache_1.3.27.tar.gz
此命令将在当前工作目录中创建名为 apache_1.3.27 的目录。
- 现在,您需要对环境进行配置以便对 Apache 源代码进行编译。源代码分发附带了一个名为 configure 的脚本,此脚本用于检查环境中是否存在成功编译 Apache 所需的必要支持文件(例如,标题、共享库和公用程序)。
要配置环境,请转至 Apache 源目录并继续执行以下步骤:
- configure 脚本成功运行后,您可以使用 make 命令对 Apache 进行编译,如下所示:
make
此命令将在屏幕上输出多个行,表示进程正在编译 Apache 源代码并正在链接 Apache。此进程通常不会出现错误。但如果出现错误,请检查是否正确下载了 Apache 的所有库文件和公用程序。
- 现在,您需要安装 Apache。Apache 将自动安装到 /usr/local/apache 目录(或指定的任何其他目录)中。要安装 Apache,请运行以下命令:
make install
如果此命令成功执行,则表明系统上已安装了 Apache。您应该在以下目录中看到 Apache 的安装文件:
/usr/local/apache
名为 httpd.conf 的主配置文件将安装在 /usr/local/apache/ 目录中。
修改 httpd.conf 文件
Apache 通过文件 httpd.conf 进行配置。此文件包含一些 Apache 指令,用于确定 Apache 服务器的各种操作参数。对于 Apache 的简单安装,需要修改以下几个指令:
ServerRoot "/usr/local/apache"
Port 5000ServerRoot 是安装 Apache 的路径。
现在,便可以对 Apache 进行配置,以执行默认的行为和 Web 服务。下一步,必须在 httpd.conf 文件中添加以下应用服务器特定的指令,使 Apache 能够将 HTTP 请求转发给 Sun ONE Application Server:
<IfModule mod_proxy.c>
ProxyPass / http://<s1as_server.some.domain>:<port>/
ProxyPassReverse / http://<s1as_server.some.domain>:<port>/
</IfModule>此处,<s1as_server.some.domain>:<port> 应该替换为 Sun ONE Application Server 的 URL 地址。为每个 Web 应用程序上下文根复制这两行,其中 /application 是 Web 应用程序上下文根,http://server 是 Sun ONE Application Server 的 URL。
至此,Apache Web 服务器即配置完毕。
启动和停止 Apache
Apache 附带了名为 apachectl 的脚本,此脚本可简化 Apache 的启动、停止和重新启动。运行以下命令启动 Apache
$ /usr/local/apache/bin/apachectl start
要停止 Apache,请运行以下命令:
use /usr/local/apache/bin/apachectl stop
启动后便可以测试 Apache 的安装。运行 Apache 后,请在 Web 浏览器中键入以下地址:http://localhost/。如果安装成功且 Apache 正在运行,则应该看到一个显示此信息的测试页。