级别: 中级 Daniel Krook (krook@us.ibm.com), IT 专家, 产品服务, IBM
2005 年 6 月 01 日
传统上一直认为部署在 IBM® WebSphere® Application Server 上的 Enterprise Java™ 应用程序与部署在 Apache,MySQL 和 PHP 环境中的站点之间存在竞争,是彼此之间相互排斥的解决方案。但是,您可以同时运行 WebSphere 和 PHP 以此来获得它们对您的开发需求所体现出来的优势。
引言
Apache、MySQL 和 PHP(AMP)技术堆以及 IBM 中间件,例如 IBM HTTP 服务器、DB2® Universal Database 和 WebSphere Application Server,传统上一直被认为是彼此之间相互竞争的、并且相互之间存在排斥性的用于通用 Web 应用开发挑战的解决方案。在这个由用户界面层、业务逻辑层和数据存储层组成的标准应用程序模型中,开放源代码组织和 IBM 都提供了应用程序以提供服务来支持每一个特定角色:
- Apache HTTP Server 和 IBM HTTP Server 竞争静态内容 Web 服务器的角色。
- PHP 和由 WebSphere Application Server 提供的 J2EE™ 环境竞争业务层。
- MySQL 与 DB2 UDB 竞争数据层。
但是,来自每一群组的单个软件与来自其它套件的产品混合起来执行一个 Web 应用程序的任务,这种现象越来越普遍。例如,Develop IBM Cloudscape® 和使用 PHP 的 DB2 Universal Database 应用程序向您显示了如何从 PHP 应用程序连接到 DB2,同时在 IBM HTTP 服务器上置入 PHP 应用程序向您显示了如何向 IBM HTTP 服务器中添加 PHP 支持。
两种软件解决方案共存在同一个较大的应用程序中,并在 Web 应用程序内部竞争同一个角色的情况比较少见,但是这种方案切实可行。本文将向您展示在将 Apache 作为 Web 服务器以及将 DB2 UDB 作为数据库的环境下,而在应用层对使用 WebSphere Application Server 和 PHP 的单一服务器进行配置的操作确实是可以实现的。
您为什么想要去进行这个操作呢?
也许您必须要将企业内部网应用程序详细地展现为 Web,或者为了不用用户的需求而向您的数据提供一个或者多个灵活的前端。也许您喜欢在不牺牲您现有的应用程序基础结构的前提下尝试一个平台方案。由内容管理工具和用于数据的表达逻辑组成的 Web 应用程序有两个接口是非常普遍的现象。您应该感觉到您能够为每一个部件选择最简明的应用程序层。
我们将首先考虑组成三层 Web 应用程序的角色,然后按照项目的需要匹配通用的实现模型。我们将基于这些业务的需要来选择特殊的中间件,然后对软件进行安装和配置以对其进行支持。最后,您将在该环境下安装所提供的样本应用程序,并且运行该程序。
样本应用程序
该样本代码展示了由两部分组成的 Web 应用程序,该程序模拟一个收养猫的站点。因此它支持的这个工具以及虚构的组织后面我们叫做 Catabase。该样本实例由部署在 WebSphere Application Server V5.1 上的 Struts 应用程序组成,该程序用作专有内容管理工具用于 Catabase 小组输入信息。PHP 5 公共站点将显示其内容,并且使用户可以基于动物的属性来搜索动物。被两组件共享的数据库是 DB2 UDB Enterprise Server Edition Version 8.2。用于这两部分的 Web 服务器实例是 Apache 1.3。
您应该对 Web 服务器、服务器端编程和数据库设计有基本的认识和了解。建议您要有使用 Jakarta Struts 框架结构、PHP 和 Linux® 命令行的开发经验。
Web 应用程序 101
Web 应用程序是一种软件系统,它使用 Web 浏览器和 HTTP 协议的请求/响应模型作为用户接口。Web 应用程序用来销售产品,发布信息和使传统应用程序能通过 Web 访问,例如公司企业内部网上的人力资源系统。
大部分的 Web 应用程序共享一个基本的体系架构,该体系架构由三个基本层组成:
- Web 服务器用于服务静态内容,例如图像、JavaScript 文件和样式表。
- 应用层用于处理业务逻辑,例如接受订单或者选择显示的内容。
- 后台数据存储 能够持久保存信息,并且能够基于权限和规则对其提供访问功能。
一个描述这些角色的比较好的比喻就是餐馆场景。这种模型的简化描述如下:
- Web 服务器是服务员。当一个用户发出命令时,该服务员就会消失,然后返回命令。他可以返回诸如刀叉一类的"静态"事物,或者他可以按需返回"准备好"的事物,例如汉堡和三明治。
- 应用程序服务器是炊事员。他或者她接收来自服务员的请求,准备好用餐者需要的食物,并且可能参考其它的资源来获取如何准备饭菜的信息。
- 数据库用作食谱。它通过分类和索引来存储和组织食谱。
Web 应用程序可以根据功能和观众的意图细分为几个种类。这两组就是企业内联网式 Web 应用程序和因特网式 Web 应用程序,它们是通过用户的基础和开发模型进行划分的:
企业内部网式的 Web 应用程序
企业内联网式的应用程序符合经典的封装式应用程序软件模型。它们受益于现存的软件设计模式,这种模式已经影响了程序开发三十多年。这些应用程序是基于版本驱动的,并且非常依赖于用户的会话、数据输入格式和优化后用于读写的数据库。
开发过程应该使用经过经久考验的解决方案,以及在过去几十年里实现了的框架结构。这些应用程序用来处理用户的数据,并且将每一个请求都作为一个重要的带有明确事务生命周期的工作单元。代码发布是面向于统一档案文件的部署,这些文件可能包含部署描述符、组件模块和所支持文件的目录。
一般说来,企业内联网式 Web 应用程序具有:
- 明确的发布周期和版本模式。
- 定义了负责进行部署的特殊角色和流程。
- 利用了时间考验的企业设计模式。
- 使用了类似 Jakarta Struts 的第三方的框架结构,该结构善于处理以表格为主的应用程序。
- 已经阅读/编写了面向事务的数据库。
- 主要针对某一个浏览器厂商以及/或者发行商。客户端的功能已提前知道,或者因为该应用程序提供的优点非常关键而期望用户要有意识地使用特定的用户代理,或者假定用户经常使用这些服务。
因特网样式 Web 应用程序
比较来说,因特网式应用程序更具组织性。二十世纪九十年代初期 HTML 的产生引起了媒介的快速发展,因此它们相对缺乏稳定性。这些应用程序着重于快速的发布周期和优秀的可用性,以此来吸引和留住访问者。正因如此,它们需要有迅速的响应时间,并且应该通过那些能够随着业界发展趋势而发展的信息架构师和图形设计者来进行设计。
这些应用程序以文件为中心,并且受益于增量部署,这对服务器的运行影响会最小。开发者对文件命名必须具有非常明确的控制功能,以此保持对搜索引擎的优化趋势和 Web 的本来语义。除此之外,为了优化网络通信,开发者必须对输出数据的大小、格式和编码方法具有细微的控制。
因特网样式的 Web 应用程序:
- 以数值文件的大小的最优化来保留带宽。
- 遵守搜索引擎最优化策略。
- 包括成功设计和可用性趋势。
- 适合新的浏览器性能和 Web 标准。
- 由设计者进行维持,而且他的背景一般不是编程人员。
- 需要快速的开发、测试和部署周期。
- 需要经常性地打补丁或者增加新功能。
- 使用只读或者读取最优化的数据存储产品。
介绍 Catabase
与许多通用的 Web 应用程序一样,Catabase Web 站点有两个截然不同的组件来支持它所有的需求。这些组件影射成前面已经描述过的企业内联网样式的 Web 应用程序和因特网样式的 Web 应用程序:
- 一个专有管理控制台用来管理应用程序中所用到内容。
- 一个公用区域用于将选中的输出信息显示给公众。
我们的应用程序需求概述了统一化的应用程序必须要完成的操作,以及怎样对其进行的操作。
- 用于内容管理工具的功能需求
实际上,Catabase 必须要管理这些猫的属性以及它们与人员的关系。为了能够让站点访问者收养这些猫,该 Catabase 管理小组必须输入数据并对其进行修改以提供有关猫的信息。
- 用于内容管理工具的非功能性需求
该 Catabase 管理工具必须通过密码来保证安全性,并且只对那些具有管理职责的用户可用。必须要保证人员和猫的数据的完整性。整个管理部分必须受到保护,防止网络入侵。
- 用于面向公众站点的功能需求
该站点必须提供对信息的简单访问功能,这些信息包括可以被收养的有关猫和作为联系人、志愿者和董事会成员的人员信息。还需要具有搜索功能,这是因为用动物作为号召物的企业联合组织要与附属的 Web 站点以及对其感兴趣的用户共享信息。
- 用于面向公众站点的非功用性需求
该站点必须具有灵活性,并且能够很容易地适应 Web 的功能性和设计的发展趋势。如果出现错误或者用户发出抱怨,那么站点会进行快速和局部化的更改而得到更新,同时这些更改并不会因为重新启动服务器而中断当前的站点访问者。
选择我们的工具
我们的要求也变得清晰起来,我们需要查看可用的中间件以支持每一个 Catabase 组件。
当进入 Web 应用程序开发的构架设计阶段时,项目管理员和开发者都对哪一个软件所提供的功能将最有效地满足业务需求很感兴趣。项目管理员应该知道什么样的工具适合客户端的需要,知道这些工具与给定的开发小组的技能集有多匹配,知道某种工具是否与已有的解决方案集成,并且还要知道 -- 当然 -- 每步操作将如何影响底线。开发者必须知道什么样的工具可以适合即将到来的任务,以及他们怎样使用它们的革新功能来增强当前的技能集和代码库。而且,了解对普通问题的并行解决方法使他们更好地理解自己的解决方案。
 | WebSphere Application Server V6
尽管我们的样本场景使用的 WebSphere Application Server V5.1,但是您应该能够将这些操作步骤很容易地应用到更高的版本中。例如,WebSphere Application Server V6 的管理控制台组织了不同于早期版本的资源管理、安全性(Security)管理 和系统环境管理,但是如果您不能够在显示出的层次树中找到这些选项,那么就使用管理控制台顶部的帮助链接对其进行搜索。 |
|
WebSphere Application Server 的优点
我们在样本实例中使用的 WebSphere Application Server Version 5.1 提供了 Java 2 Enterprise Edition 1.3(J2EE)功能,例如:
- 压缩的基于档案文件的部署单元。
- 明确定义的软件生命周期和部署角色。
- 通过支持 servlet 过虑器实现应用程序安全性。
而且,WebSphere 很适合于企业内部网式应用程序的开发,这是因为用于 WebSphere Software V6 的 IBM WebSphere Studio Application Developer Version 5 和 IBM Rational® Application Developer 的集成开发环境(IDE)提供了对第三方框架(例如 Struts)的内置支持功能。这两种 IDEs 通过提供高级的调试和代码检查功能,而能快速开发管理重要数据的质量应用程序。而且,这些工具使得继续保持用于 J2EE 的企业应用程序开发模式的操作变得更加简单。
PHP 的优点
PHP 允许快速的开发周期,这是因为它是一种嵌入到 HTML 文件中的解释性语言。在开发过程中没有必要重新编译这些文件以对其进行测试;而只要对浏览器进行刷新。同样,PHP 脚本程序的部署并不需要重新启动 Web 或者应用程序服务器。
因为在工作站操作系统例如 Windows® XP 上支持 PHP,所以开发者可以使用代码编辑器来编写代码并对代码进行测试,甚至可以在(安全的) FTP 上进行部署或者在网络上使用很多工具可以进行共享。
技术选择
基于上述的这些优点:
- 该样本应用程序的内联网式内容管理部分是使用 Struts 框架创建,其中该框架由 WebSphere Application Server V5.1 提供 J2EE 1.3 环境进行支持。
- 作为一种集成开发环境,WebSphere Studio Application Developer Version 5.1 和 Rational Application Developer V6 都可以用来开发代码并对其进行测试。
- 对公共站点来说,选用 PHP 5, 这是因为它具有快速的重复切换功能和灵活性。这就提供了最强大的功能,因为应用程序的前端将比内部的应用程序变化得更为经常。这同样也导致了对更改搜索引擎优化策略做出快速的反应,以及加速开发小组的开发过程。除此之外,它向我们提供了一种改进的面向对象的框架结构和用于 RSS 需要的 XML 功能。
- Apache 1.3 用做 Web 服务器,这是因为它非常适合对我们的两个应用程序层进行集成。
- DB2 UDB 是我们两个应用程序的共享数据库。
PHP、WebSphere Application Server、Apache、DB2 UDB 和 Linux 操作系统可以当作中间件,这些术语用来描述向应用程序提供环境和服务的软件,这些应用程序是根据我们的项目需求进行开发的。
下一步,我们将概要地讲述安装工作环境以及对其进行配置的操作步骤。
 |
Intel EM64T 或者 AMD64 系统
这些安装假设都是在 x86 32-bit 的 PC 平台上进行的。尽管可能需要做出一些细微的调整,但是他们也已经很好地了解了在 x86_64 平台上使用 32-bit 的内核。虽然在平台上编译了 Apache Web 服务器,但是目前 IBM 并没有在它支持的站点上提供可以使用的 x86_64-bit WebSphere 插件。另外,在该平台上编译 PHP 的操作将会向用户提供一个与在该平台上支持 WebSphere 的 32-bit 版本的 IBM HTTP Server 不相兼容的共享对象。
|
|
安装中间件
我们的架构决策决定了我们支持我们的应用程序所必须的软件,现在是安装这些软件的时候了。这里有无数的资料记录了我们所必须的每一个中间件组件的安装过程,但是按照特定的次序来安装软件以支持该样本应用程序是很重要的:
操作系统
虽然该样本应用程序及其运行的软件实际上都是独立的平台,本文使用的操作系统是 SuSE Linux Professional 9.2。虽然 SuSE 的缺省安装过程满足大部分应用程序环境的需要,但是还需要安装一些重要的程序包群,并且启用一些特性,这样在以后的操作中可以正确地安装 PHP 和 WebSphere Application Server,并对其进行正确地配置。(请查看下载文件里的 Appendix A README 文件中有关用来测试 Catabase 应用程序的特殊安装过程的记录。)
- 选择 Initial Installation 后,必须要对 Base Installation 窗口中的一些子任务进行配置。其中之一就是 Installation Settings 标题下的软件 。从 Software Selection 对话框中选择 Detailed selection... 按钮。
- 在生成的控制面板中,确保选中以下的选项:
- C/C++ Compiler and Tools
- Java
- Experienced User
- 在 Filter 下拉菜单的 Package Groups 选项中,展开 System,然后激活 Libraries。确保选中以下的程序包被选中:
- 同样展开 Development,然后激活 Libraries。确保选中以下的程序包:
- libxml2-devel
- readline-devel
- 接收完以上的程序包和程序组后,选中的 Software 安装内容应该是:
- Standard system with KDE
- + Java
- + KDE Desktop Environment
- + C/C++ Compiler and Tools
- + Office Applications
- + Help & Support Documentation
- + Graphical Base System
- + Experienced User
现在您可以着手进行剩余的安装设置以执行完安装过程。
- 完成安装过程后,将会向您提供几个配置(Configuration)选项。为了在系统的域中提供唯一主机名,您应该更改一些设置,以便配置参数如下所示:
- Ethernet Adapter Configured with DHCP
- 主机名称:somehost.example.com
- 名称服务程序: set by DHCP
- 搜索表: set by DHCP
- 在网络子任务下,选择 Network Interfaces。
- 在已经配置的设备窗格中,单击 Change... 按钮,然后选择用于预选设备的 Edit 按钮。
- 在网络地址设置对话框中,选择 Host name and name server 按钮。
- 在生成的对话框中,更改您的主机名称和域名,不要选中 Change host name via DHCP 对话框。
- 为了完成剩余的操作系统的安装操作,您可以选择您必须的设置选项,然后让安装程序完成安装过程。
- 首次启动系统后,以根用户登录,并且为在下一节用到的安装文件创建名为 src 的目录。
清单 1. 准备编译目录和安装源代码
 |
使用 MySQL
在这个问题上您可能选择安装 MySQL database server Version 4.1。从MySQL下载该服务器和开发程序库以用于 PHP 开发。下载之后,在您的 PHP configure 代码行添入以下代码:
--with-mysqli=/usr/bin/mysql_config
|
|
数据库
Catabase 应用程序的数据是存储在 DB2 Universal Database Enterprise Server Edition V8.2。虽然 DB2 的安装设置是比较简单的,但是必须要对一些选项进行配置以支持我们的应用程序。(请查看下载文件里的 Appendix B README 文件中有关用于测试应用程序的特殊安装过程的记录。)
- 在 Instance setup 操作步骤中选中 Create a DB2 instance 单选按钮。
- 在 Instance owning-user 操作步骤中,在 db2grp1 组中创建新用户 db2inst1 和输入用户的密码,并确认该密码。
- 在 Instance TCP/IP操作步骤中选中 Configure 单选按钮,并记录下 Port number 参数值。测试环境使用端口 50001。
- 在 Instance properties 操作步骤中,在下拉菜单 Authentication type 选择 Server,并选中 Autostart the instance at system startup 对话框。
Web 服务器
为使 Web 服务器使用 HTTPS 来保护用户与 Catabase 内容管理工具之间的交互操作, Apache HTTP Server 必须在 SSL 的支持下进行编译。而且必须对该服务器进行配置,使其在端口 80 上监听 HTTP,在端口 443 监听 HTTPS。(请查看参考文献中有关 OpenSSL、mod_ssl 和 Apache 的下载信息。)
 |
Apache 版本和 mod_ssl
在这里列出的每个组件的版本号可能会在将来发生变化。但是 mod_ssl 版本号的第二部分与您正在安装的 Apache 版本相匹配是非常重要的。本文中,该版本号为 1.3.33.
|
|
-
将源文件放到您前面创建的 src 文件夹中,对每一个文件进行解压缩后,使用
tar 进行解压缩。
清单 2. 解压缩出源代码文件夹。
cd ~/src
tar -zxvf openssl-0.9.7e.tar.gz
tar -zxvf mod_ssl-2.8.22-1.3.33.tar.gz
tar -zxvf apache_1.3.33.tar.gz
tar -zxvf php-5.0.4.tar.gz
|
- OpenSSL 是用于 SSL 通信的密码方法库,并且被 mod_ssl 用来对 Apache 的 HTTP 通信进行加密。
清单 3. 编译 OpenSSL 0.9.7e
cd openssl-0.9.7e
./config -fPIC
make
|
-
下一步,对 mod_ssl 进行配置。对 mod_ssl 进行配置的操作要将信息配置到 Apache 源代码中。您同样可以在这里添加其它的 Apache 配置标志。
清单 4. 配置 mod_ssl 2.8.22-1.3.33
cd ../mod_ssl-2.8.22-1.3.33
./configure \
--with-apache=../apache_1.3.33/ \
--prefix=/opt/local/apache \
--with-ssl=../openssl-0.9.7e \
--enable-module=so \
--enable-shared=max |
-
在对 mod_ssl 配置完毕后,您将被指导进行 Apache 安装。
清单 5. 配置 Apache HTTP Server 1.3.33
cd ../apache_1.3.33/
make
|
- 对于这个问题,您将生成三个 Server Certification Files,它们是根据您在对以下五个问题的回答中的信息来创建得到的:
清单 6. 创建服务器证书文件
- 步骤 0:判定用于认证的签名规则
- 步骤 1:生成 RSA 私有密钥(1024 位)[server.key]
- 步骤 2:生成 X.509 证签名请求 [server.csr]
- 步骤 3:生成 Snake Oil CA 签署的 X.509 证书 [server.crt]
- 步骤 4:使用登录密码对 RSA 进行加密以提高安全性 [server.key]
对这些问题都选择缺省选项,创建一个自签名的证书,然后执行最后一步操作,Encrypt the private key now? 选择否。当您回答完这些问题后,您将看到一个消息告诉您文件已经创建了。
清单 7. 服务器证书文件
RESULT: Server Certification Files
o conf/ssl.key/server.key
The PEM-encoded RSA private key file which you configure
with the 'SSLCertificateKeyFile' directive (automatically done
when you install via APACI). KEEP THIS FILE PRIVATE!
o conf/ssl.crt/server.crt
The PEM-encoded X.509 certificate file which you configure
with the 'SSLCertificateFile' directive (automatically done
when you install via APACI).
o conf/ssl.csr/server.csr
The PEM-encoded X.509 certificate signing request file which
you can send to an official Certificate Authority (CA) in order
to request a real server certificate (signed by this CA instead
of our demonstration-only Snake Oil CA) which later can replace
the conf/ssl.crt/server.crt file.
|
-
最后,您就完成了 Apache 的安装过程。
清单 8. 安装 Apache
- 如果按照我们的操作计划,您将会看到以下信息:
清单 9. 成功安装 Apache
+--------------------------------------------------------+
| You now have successfully built and installed the |
| Apache 1.3 HTTP server. To verify that Apache actually |
| works correctly you now should first check the |
| (initially created or preserved) configuration files |
| |
| /opt/local/apache/conf/httpd.conf
| |
| and then you should be able to immediately fire up |
| Apache the first time by running: |
| |
| /opt/local/apache/bin/apachectl start
| |
| Or when you want to run it with SSL enabled use: |
| |
| /opt/local/apache/bin/apachectl startssl
| |
| Thanks for using Apache. The Apache Group |
| http://www.apache.org/ |
+--------------------------------------------------------+
|
- 您现在应该启动服务器,并且要确定服务器是否在运行,可以通过在您的浏览器中输入
http://localhost/ 和 https://localhost/ (如图 1)来运行该服务器。
图 1. 成功安装 Web 服务器。
 | |
应用程序层
现在我们来安装 Catabase 应用程序的内核环境:WebSphere Application Server 和 PHP。这两种应用程序环境将会接收到来自 Apache 的请求。
WebSphere Application Server V5.1 的设置过程很简单易懂,但是必须要选中其中的一些选项,这样我们可以确保对其进行配置以支持我们的应用程序。(请查看下载文件中的 Appendix C README 文件,以获取有关用以测试 Catabase 应用程序的特殊安装的文件信息。)
- 当安装程序提示您选择完全(Full)安装或者是自定义(Custom)安装时,请选择 Custom 单选按钮。
- 在特性窗格的列表中,确保您没有选择 Embedded messaging 选项及其子选项。在 Web 服务器插件选项下面。确保您选中了Plug-in for Apache(TM) Web Server v1.3。。
- 键入或者输入 /opt/local/apache/conf/httpd.conf,这是当安装程序提示您安装 Plug-in for Apache(TM) Web Server v1.3 的配置文件时您所看到的参数值。
PHP 5 是最后一个要安装的程序,不过很容易安装。您同样也可以选择添加其它的 PHP 配置标志(如清单 10)。该操作完成后,重新启动 Apache(如清单 11)。
清单 10. 配置、编译并安装 PHP 5.0.4
cd ../../php-5.0.4
./configure \
--prefix=/opt/local/php \
--with-apxs=/opt/local/apache/bin/apxs
--with-ibm-db2=/home/db2inst1/sqllib
make
make install
|
 |
进行测试
您可以在选择 make install 之前选择运行 make test ,以便在您的 PHP 创建过程中运行 PHP Quality Assurance Team 的测试实例。
|
|
清单 11. 使用 HTTPS 停止和启动 Apache
/opt/local/apache/bin/apachectl stop
/opt/local/apache/bin/apachectl startssl
|
对中间件进行配置和测试
既然已经安装完了软件环境,那就应该更改总体的配置以确保所有的组件能够正常运行和通信。
Apache 模块
尽管 PHP 和 WebSphere 已经添加了动态共享对象(DSO)实体,它们可用来将 Apache 链接到配置文件,但是如果不对这三个文件进行更改,那么它们就不能正常运行。WebSphere 插件入口必须移到 PHP 插件上方才能正常工作。除此之外,mod_ssl 需要 WebSphere 插件的 EAPI 版本。最后,您必须要插入更多代码行:
- 在文本编辑器中打开 /opt/local/apache/conf/httpd.conf,然后转到文件的末尾。PHP 和 WebSphere 的安装添加了以下代码行:
清单 12. 错误的 httpd.conf LoadModule 实体
LoadModule app_server_http_module /opt/WebSphere/AppServer/bin/mod_app_server_http.so
LoadModule php5_module libexec/libphp5.so
WebSpherePluginConfig /opt/WebSphere/AppServer/config/cells/plugin-cfg.xml |
- WebSphere 条目 必须 在 PHP 条目之上,同时您必须将 mod_app_server_http.so 条目更改为 EAPI 版本。交换清单 13 中所显示的代码行的次序,然后将其整体移到现有的 LoadModule 模块末端。
清单 13. 纠正后的 httpd.conf LoadModule 实体
LoadModule app_server_http_module /opt/WebSphere/AppServer/bin/mod_app_server_http_eapi.so
WebSpherePluginConfig /opt/WebSphere/AppServer/config/cells/plugin-cfg.xml
LoadModule php5_module libexec/libphp5.so |
- 在这几个代码行下面、已有的 AddModules 清单后面,并且在已有的 PHP 5 mod_php5.c 条目上方添加该代码行:
清单 14. 添加的 httpd.conf AddModule 条目
AddModule mod_app_server_http.c
|
- 为了引导 Apache 代理把某些请求转交给 PHP,需要添加 AddType 指令,并且将 index.php 作为一个可识别的 DirectoryIndex 值来包含。您现在可以保存 httpd.conf,然后将其关闭。
清单 15. 新的 httpd.conf 值
AddType application/x-httpd-php .php
DirectoryIndex index.html index.php
|
- 为了能够提供环境变量,PHP 必须要连接到 DB2,将该代码行添加到 Apache 的启动脚本程序中,/opt/local/apache/bin/apachectl。
清单 16. 用于 DB2 的新 apachectl 条目
. /home/db2inst1/sqllib/db2profile
|
- 运行 Apache 配置测试,查看并寻找 Syntax OK 结果,以确保每步操作都正常进行。
清单 17. 确认所有的改动在语法上都是正确的
/opt/local/apache/bin/apachectl configtest
|
 |
锁定 WebSphere 管理控制台
您可以利用 WebSphere Application Server 管理控制台中的几个安全性选项对其进行保护,使之免受越权的访问行为。其中一个选项就是针对本地操作系统来添加用户,并对其进行验证。如果您正在以根用户方式运行 WebSphere,您也只能进行这步操作。
- 选择 System Administration => Console Users,添加用户。
- 选择 Security => User Registries => Local OS,在此输入根用户和密码。
- 选择 Security => Global Security,然后选中 Enabled box.Uncheck the Enforce Java 2 Security 项。
- 重新启动 WebSphere Application Server,您将需要一个本地操作系统用户 ID 和密码来访问控制台,该控制台可以通过 HTTPS 进行访问。
|
|
WebSphere 插件
下一步,配置 WebSphere Application Server,通过管理控制台来监听来自 Apache 的 443 端口的请求,然后重新启动服务器:
- 在浏览器中打开 http://localhost:9090/admin/。
- 展开 Environment 选项,然后选择 Virtual Hosts。
- 在 Virtual Hosts 窗格中,选择虚拟主机 default_host。
- 选择 Additional Properties 区域下的 Host Aliases。
- 单击 New 按钮,然后输入以下数值:
- 选择 OK。
- 选择 Message(s) 节中的 Save。
- 单击 Save 按钮。
- 展开 Environment 选项,然后选择 Update Web Server Plugin。
- 选择 OK。
清单 18. 重新启动 WebSphere
ulimit -s 4096
/opt/WebSphere/AppServer/bin/stopServer.sh server1
/opt/WebSphere/AppServer/bin/startServer.sh server1
|
- 现在,对配置进行测试。WebSphere Application Server V5 中包括了名为 Plants By WebSphere 的样本应用程序,我们运行该程序来确保 Apache 正在监听端口 80 和 443 的请求。在浏览器中打开
http://localhost/PlantsByWebSphere/ 和 https://localhost/PlantsByWebSphere/。
图 2. 成功安装 Web 服务器插件。
PHP
现在,确认 PHP 同样也可以用于 Apache:
- 在 /opt/local/apache/htdocs/ 中创建名为 test.php 的文件,并且输入以下代码:
清单 19. 确认 PHP
- 使用以下的 URLs,通过端口 80 和 443 来访问该文件:
http://localhost/test.php 和 https://localhost/test.php
图 3. 成功安装 PHP。
- 您必须对 php.ini 文件做少量改动,以便通过 PHP 的 ODBC 接口从 DB2 正确地接受 BLOB 数据。这种补丁在文档使用 PHP 和 IBM DB2 Universal Database Version 8 的应用程序开发经验中已有记录。如果您目前还没有 /opt/local/php/lib/php.ini 文件,可以从 src 目录中复制一份。
清单 20. 如果不存在 php.ini 就需要创建 php.ini
cp ~/src/php-5.0.4/php.ini-recommended /opt/local/php/lib/php.ini
|
在 php.ini 中,要确保为这两个键值设置为以下的参数值。
清单 21. 新的 php.ini 值
; Handling of LONG fields. Returns number of bytes to variables. 0 means
; passthru.
odbc.defaultlrl = 1M
; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char.
; See the documentation on odbc_binmode and odbc_longreadlen for an explanation
; of uodbc.defaultlrl and uodbc.defaultbinmode
odbc.defaultbinmode = 1
|
- 下一步,安装 PHP Extension 和 Application Repository (PEAR) Database Abstraction Layer (DB),这是对 PHP 专用数据库功能提供了公用接口的程序包。该操作为数据访问提供了类似于 JDBC 的公用 API 。
清单 22. 下载并安装 PEAR DB
/opt/local/php/bin/pear install DB
|
- 最后,重新启动 Apache。
清单 23. 重新启动 Apache
/opt/local/apache/bin/apachectl stop
/opt/local/apache/bin/apachectl startssl
|
操作系统用户
我们的应用程序使用两个不同的用户来访问数据库:
您想为两种类型的用户提供不同的特权等级。创建两个最小权限的操作系统用户用于身份验证和 DB2 数据库表格级的特权:cms_usr 和 site_usr。同样也要设置他们的初始密码。本文中,密码与用户的名字相同。
清单 24. 创建新用户,然后设置用户的密码
useradd -c "Catabase DB2 Site User" -s /bin/false site_usr
useradd -c "Catabase DB2 CMS User" -s /bin/false cms_usr
passwd site_usr
passwd cms_usr
|
配置用于 Catabase 应用程序的中间件
尽管 Catabase Web 应用程序由两个分离的组件组成,但是它们共享一个数据库。内容管理系统的特权是可以使用插入(INSERT)、更新(UPDATE)和删除(DELETE)功能,而公共站点的用户只能享有选择(SELECT)权利。
创建数据库
- 如图 4 所示是该 Catabase 数据模型的结构。该样本代码提供了组成该结构的数据定义语言(Data Definition Language,DDL)和集成交换格式(Integration Exchange Format,IXF)文件。您仍然需要先创建名为 CATABASE 的数据库来存放它们。
图 4. Catabase 数据模型
清单 25. 创建数据库
db2 => CREATE DATABASE CATABASE
|
- 现在,从下载的代码样本里找到的 catabase.ddl 文件,并执行它来创建我们的表格。DDL 同样也包含了我们的两个数据库用户使用的 GRANT 语句。您将必须在一般提示符下运行该命令,而不是在有交互性的 DB2 命令行处理器下。
清单 26. 创建表格
- 下一步,使用下载文件中提供的 IXF 将初始数据填充到表格中。
清单 27. 导入数据
db2 => import from BREEDS.ixf of ixf insert into BREEDS
db2 => import from COLORS.ixf of ixf insert into COLORS
db2 => import from NOTE_TYPES.ixf of ixf insert into NOTE_TYPES
db2 => import from ROLES.ixf of ixf insert into ROLES
db2 => import from STATUSES.ixf of ixf insert into STATUSES
db2 => import from PHOTOS.ixf of ixf insert into PHOTOS
db2 => import from CATS.ixf of ixf insert into CATS
db2 => import from HUMANS.ixf of ixf insert into HUMANS
db2 => import from ADOPTIONS.ixf of ixf insert into ADOPTIONS
db2 => import from NOTES.ixf of ixf insert into NOTES
db2 => import from HUMAN_ROLE.ixf of ixf insert into HUMAN_ROLE
db2 => import from CAT_PHOTO.ixf of ixf insert into CAT_PHOTO
db2 => import from CAT_COLOR.ixf of ixf insert into CAT_COLOR
db2 => import from CAT_BREED.ixf of ixf insert into CAT_BREED |
- 对 DB2 进行最后的优化,该操作在 使用 PHP 开发 IBM Cloudscape 和 DB2 Universal Database 应用程序文中已有描述。这些命令将会提高我们的 PHP 应用程序查询系统的性能。
清单 28. 优化 PHP 的 DB2 查询功能
db2 => UPDATE CLI CFG FOR SECTION CATABASE USING LONGCOMPAT 0
db2 => UPDATE CLI CFG FOR SECTION CATABASE USING PATCH2 6
|
在管理控制台中创建数据源
- 现在可以对 WebSphere Application Server 进行配置使其连接到应用程序数据库。创建两个对应操作系统用户的登录别名。在 WebSphere Application Server 管理控制台中,我们必须要创建 Java 2 Connector 安全性用户:
- 选择 Security => JAAS Configuration => J2C Authentication Data。
- 选择 New,然后输入
cms_usr 作为别名,并输入前面已经确认的用户 ID 和密码,然后单击 OK。
对 site_usr 重复这些操作步骤,然后 Save 您的修改内容。
- 下一步,创建新的 JDBC Provider:
- 选择 Resources => JDBC Providers,然后选择 New。
- 从 JDBC Providers 清单中选择 DB2 Universal JDBC Driver Provider,然后单击 OK。
- 接受后面出现的页面上所有的缺省值,确保以下的条目位于 Classpath 域中:
- ${DB2UNIVERSAL_JDBC_DRIVER_PATH}/db2jcc.jar
- ${UNIVERSAL_JDBC_DRIVER_PATH}/db2jcc_license_cu.jar
- ${DB2UNIVERSAL_JDBC_DRIVER_PATH}/db2jcc_license_cisuz.jar
- 定义其中一个在上述类路径入口中使用的 WebSphere 变量。选择 Environment => Manage WebSphere Variables。
确保以下的两个变量被设置到 DB2 安装根目录下:
- DB2UNIVERSAL_JDBC_DRIVER_PATH = /opt/IBM/db2/V8.1/java
- UNIVERSAL_JDBC_DRIVER_PATH = /opt/IBM/db2/V8.1/java
- 下一步,创建用于驱动程序的两个数据源。一个用于 DB2 用户。 在 Additional Properties 对话框中选择 JDBC Providers => DB2 Universal JDBC Driver Provider => Data Sources。
选择 New,然后输入以下数值用于此数据源:
- 名称:
数据库 CMS 数据源
- JNDI 名称:
jdbc/catabasecms
- 组件管理的认证别名:
cms_usr
- 重复步骤 4,使用以下数值设置第二个数据源:
- 名称:
Catabase Site Data Source
- JNDI 名称:
jdbc/catabasesite
- 组件管理的认证别名:
site_usr
- 为使这两个新的数据源连接到我们前面创建的数据库,在 Data Sources 窗口中选择它们的名称,然后在 Additional Properties 对话框中选择 Custom Properties。在后续产生的窗口中,为这两个数据源设置数值:
- driverType:
4
- databaseName:
CATABASE
- serverName:
127.0.0.1
- portNumber:
50001
- 保存您的修改内容,然后返回到 Data Sources 窗格,单击 Test Connection。您将会看到如图 5 所示的消息。
图 5. Catabase 数据源

 |

|
安装 Catabase 应用程序
内容管理工具
我们下一个操作步骤是将 Catabase Enterprise ARchive(EAR)部署到 WebSphere Application Server 中。
- 从 WebSphere 管理控制台中选择 Applications => Enterprise Applications。
- 单击 Install 按钮,然后单击 Browse...,从下载代码样本中上载 CatabaseEAR.ear 文件。
- 为能够生成缺省绑定及映射,选择 Next。
- 步骤 1:提供了执行安装过程的选项,选择 Next。
- 步骤 2:将资源引用映射到资源,选择 jdbc/catabasecms。
- 步骤 3:映射 Web 模块的虚拟主机,选择 Next。
- 步骤 4:将模块映射到应用程序服务器,选择 Next。
- 步骤 5:最后,选择 Finish,然后选择 Save to Master Configuration。
- 再次选择 Applications => Enterprise Applications。
- 选中复选框 CatabaseEAR,然后单击 Start 按钮。
- 选择 Environment => Update Web Server Plugin,然后单击 OK。
- 为了验证该安装过程,打开 https://<localhost>/admin/,然后利用缺省的带管理员权限的用户名登录;krook@example.com 的密码是 DAN(图 6)。
图 6. 猫的注册表。
 |
PHP 样本代码 公用站点 PHP 5 应用程序重新使用了一些相同的概念上的对象用作 Struts 应用程序,例如 Cat 和 Human。它同样也提供了对 PHP 5 新特性的论证。参考文献中的升级到 PHP 5 详细地描述了这些改善方法:
- 通过 magic_set 和 _get 函数封装对象成员。
- 用于每一个单独管理员的私有构建程序。
- 面向对象的 DOM 将
Cat 对象转换为用于 RSS 喂养的 XML。
- _toString 方法提供了使用
echo 时对象状态的概要说明。
|
|
公用的 Web 站点
为了安装 Catabase 公用的 Web 站点,我们仅仅需要将 htdocs目录的内容安装到 Apache 服务器根目录 /opt/local/apache/htdocs 中。
图 7 显示了用于 PHP 应用程序的目录布局。因为 PHP 中的应用程序开发与 J2EE 标准或 Struts 框架结构的构造方式不同,所以设计中允许存在定制的误差。这就是我喜欢的结构方式,尽管您可能会选择 locate your includes elsewhere。
图 7. 站点的目录结构
为安装此站点,您可以从下载文件中将 PHP 应用程序解压缩。将 htdocs 文件夹的内容复制到 /opt/local/apache/htdocs。为了验证该安装过程,在浏览器中打开 http://<localhost>/,然后您应该会看到如图 8 所示的输出信息:
图 8. 公用站点。
将应用程序结合在一起
为了证明您的 Catabase 应用程序的安装过程已经得到正确地配置,请使用内容管理工具中的添加和修改链接,使用包含的样本猫,或者添加您自己的猫。因此,打开此公用站点,显示出您的修改信息。Catabase Web 站点登录页将会显示最后三个有特色的动物,同时收养猫节中的目录页面将会全部将它们显示出来。您同样也可以在站点工具节中搜索各种条目。
结论
本文展示了 Apache、MySQL 和 PHP 技术,以及 IBM 中间件如何适合通用的三层 Web 应用程序模型的角色。我们同时也看到了如何将来自任意组织的软件程序包独立地交换到每一个角色中。最后,我们已经看到您甚至可以将传统意义上存在竞争性的程序包组合在同一层面上来迎合业务需要,就以 Catabase 为例来说,从公用的 Web 服务器到数据库,它都支持两种不同的观众。 此实例演示和提供的操作步骤已经激发您使用 IBM 和开放的源社区提供的工具来开发新型的 Web 应用程序。
致谢
我非常感谢 Catherine Fugarino 的支持以及 Scott Rademaker 对本文的评论。我同时也对 Carlos Hoyos、Larry Lin、Albert James、Martina James、Doug Weatherbee、Tim Gales 和 Chris Snyder 表示感谢,感谢他们对我的帮助。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Catabase Web application | catabase.zip | 2.4 MB |
FTP | HTTP |
|---|
参考资料
关于作者  | |  | Daniel Krook 是位于 New York,White Plains 的 IBM 公司的 IT 专家。他在 Connecticut ,Hartford 的 Trinity College 主修政治科学和国际学,但是最近他使用 WebSphere 和 DB2 连同 Apache,MySQL 和 PHP 创建了应用程序。您可以通过 krook@us.ibm.com 联系他。 |
对本文的评价
|