WebObjects/Web 应用程序/部署/Apache
在 Mac OS X、Linux 或 Solaris 上的部署场景中,您的应用程序很可能部署在 Apache 上。此外,如果您使用 WODirectConnectEnabled=false 进行开发(您应该这样做,请参阅直接连接部分了解更多信息),您也将通过 Apache 在本地运行应用程序。Apache 是一个非常可扩展的 Web 服务器,它提供大量功能,我们将在本文档中详细介绍其中一些功能。
WebObjects 应用程序以“分离安装”方式部署。分离安装意味着您的应用程序代码、组件和资源部署在一个位置,以便从您的 WebObjects 应用程序提供服务(在 OS X 上,为 /Library/WebObjects/Applications/YourApp.woa),而您的 WebServerResources 则安装在另一个位置(在 OS X 上,为 /Library/WebServer/Documents/WebObjects/YourApp.woa/Contents/WebServerResources),以便由 Apache 直接提供服务。这提供了最佳性能方案,因为 Apache 专为提供静态内容而进行了优化,并且没有必要将对大型二进制文件的请求通过 WebObjects 发送。
为了从 Apache 获得最佳性能,您应该确保启用了 mod_expires。mod_expires 控制应用于静态资源请求的缓存头。根据您的安装情况,Apache 可能默认禁用 mod_expires,这会导致您的最终用户浏览器在每个页面上重新请求您网站上的每个资源,即使是常见的标题图形也是如此。
一个 mod_expires 配置示例如下所示
<IfModule mod_expires.c> ExpiresActive On ExpiresDefault A60 ExpiresByType image/bmp A3600 ExpiresByType image/gif A3600 ExpiresByType image/ief A3600 ExpiresByType image/jpeg A3600 ExpiresByType image/png A3600 </IfModule>
您还需要相应的类型扩展映射
<IfModule mod_mime.c> AddType image/bmp bmp AddType image/gif gif AddType image/ief ief AddType image/jpeg jpeg AddType image/jpeg jpg AddType image/jpeg jpe ... </IfModule>
这告诉 Apache,当请求类型为 image/gif 时,请求浏览器将被告知在 1 小时内不要再次请求该图像(A3600 = 3600 秒)。
任何使用过 WebObjects 的人都可能注意到 WebObjects URL 很长(http://yoursite.com/cgi-bin/WebObjects/AppName.woa/wa/something)。常见的要求是为那些习惯于只请求“http://yoursite.com”的最终用户使这些 URL 变得更友好。幸运的是,Apache 提供了一个非常广泛的模块,称为“mod_rewrite”,它允许您根据一系列正则表达式和规则重写您网站的 URL 请求。
Aaron Rosenzweig 有一篇关于在 Apache 中使用 mod_rewrite的非常详尽的文章。
在使用 mod_WebObjects 时,我在使用 mod_rewrite 时遇到了一个问题,即 mod_WebObjects 必须先加载,否则它无法正常工作(它将在 cgi-bin 适配器中正常工作)。
所以在 http.conf 中,搜索 mod_rewrite 并将其更改为
LoadModule WebObjects_module /System/Library/WebObjects/Adaptors/Apache/mod_WebObjects.so LoadModule rewrite_module libexec/httpd/mod_rewrite.so
,再次查找
AddModule mod_WebObjects.c AddModule mod_rewrite.c
在 /System/Library/WebObjects/Adaptors/Apache/apache.conf 中仍然有一个加载模块,但您可以忽略它——它会生成一条关于加载两次的警告。
以下是我们在一个应用程序中使用的 mod_rewrite 示例
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^/$ /page/HomePage [R] RewriteCond %{QUERY_STRING} ^appNum=([-0-9]+)(.*)$ RewriteRule ^/page/(.*)$ /cgi-bin/WebObjects/AppName.woa/%1/wa/viewPage?pageName=$1%2 [L,PT] RewriteRule ^/page/(.*)$ /cgi-bin/WebObjects/AppName.woa/wa/viewPage?pageName=$1 [L,PT,QSA] </IfModule>
WOA 以格式 http://site.com/page/HomePage?appNum=2 生成 URL,它将变为 http://site.com/cgi-bin/WebObjects/AppName.woa/2/viewPage?pageName=HomePage。
许多人表示有兴趣将 WebObjects 适配器与 Apache 2.2.x 一起使用。我终于有机会坐下来,今天就处理它。我写信通知您,它可以在 Project Wonder CVS 存储库中获得。
必要的更改结果证明主要是对过时/弃用函数进行的微小更新。最大的(也是非平凡的)更改是针对 SSL 支持。它已被重写为使用 Apache 的 mod_ssl 模块。
我已经在 MacOS X 10.4.7、Apache 2.2.2 上进行了测试,有无 ssl 支持。它在我的所有测试中都按预期工作。
由于 Apache 2.2.x httpd.conf 文件中新的、非常严格的默认访问规则,配置 Web 服务器以与适配器一起工作结果证明具有挑战性。一旦我发现了这一点,更改设置就变得微不足道,但值得在这里提一下,以避免人们感到沮丧。
新的默认配置是
<Directory /> Options FollowSymLinks AllowOverride None Order deny,allow Deny from all </Directory>
您可以选择注释掉该代码块的最后两行,或者在 VirtualHost 块中覆盖它们。仅仅设置通常的 Location 块对我来说似乎行不通。
当然,您也可以将 WebObjectsAlias 设置的名称从 /cgi-bin/WebObjects 更改为 <foo>/WebObjects,或者注释掉 /cgi-bin/ 目录的 ScriptAlias 定义。
除了这些提示之外,它基本上是标准的编译、安装和配置。*
- 更改 Wonder 存储库的 Adaptors 目录中的 make.config 文件以反映您的 apache 安装设置。
- 运行 make 以构建适配器
- 因为你忘记了一个设置而诅咒。修复它。
- make clean; make
- 使用 apxs 安装 mod_WebObjects 模块
- 配置您的 httpd.conf,并将 WebObjects 目录从标准位置(如果在 MacOS X 上)链接或复制到您的新 htdocs 目录。
- apachectl configtest; apachectl graceful
- 测试。
- 再次诅咒。根据需要更改 httpd.conf 文件。
- apachectl graceful。根据需要转到第 8 步。
- 最后!apachectl graceful
享受您全新的 WO 适配器。:)
- 注意:如果您遇到以下错误
libtool: compile: unable to infer tagged configuration libtool: compile: specify a tag with `--tag' apxs:Error: Command failed with rc=65536
在 make.config 的末尾添加以下内容:CC = gcc