WebObjects/Web 应用程序/部署/Linux
(修订版 1.5; 2003-03-02,查看完整修订版列表) 此文档的最新版本可以在http://www.tetlabors.de/wo/setup_webobjects_on_linux.html找到。
您可以对本操作指南做任何您想做的事情,但请自行承担风险。我不会承担任何责任。如果您不是这方面的专家,我建议先为测试目的设置一个新系统,然后将您新获得的知识用于实际系统。
本操作指南介绍了如何在 Linux 上设置 WebObjects 部署,大约需要两个小时 - 如果你知道自己在做什么。否则,可能需要更长的时间。:-) 它现在还涵盖了 WebObjects 5.2 的安装(有关更改,请参见本操作指南末尾的修订版列表)。
本操作指南基于 Timo Buhmann 的一篇关于如何在 Linux 下设置 WebObjects 的德文描述。由我进行翻译和重新格式化为 HTML 文档,并参考了 OmniGroup 的 WebObjects 邮件列表和 Jonathan Wolf Rentzsch 的一篇关于 Linux 和 WO 的文章。
我并非 Linux 方面的专家 - 在编写本教程之前,我仅仅使用过它两天左右。幸运的是,这里有足够多的人可以回答我在遇到问题时提出的各种问题。如果您在本文中看到奇怪或笨拙的地方,请发邮件给我并附上更正或改进内容。也许 Apple 会在下一个版本的 WebObjects 中集成 Linux 支持,这样您就不再需要本操作指南。在此之前:让我们开始动手吧!
为了最大限度地减少过程中的延迟,您可能需要在开始之前准备所有需要的东西。在本操作指南中,使用了以下软件
- Linux 发行版。对于我们实际安装 WebObjects 5.2,我们现在使用的是 SuSE 8.0 Professional。
- Apache 1.3.x:https://httpd.apache.ac.cn(新版本使用的是 1.3.27 版本)
- Java2 SDK:http://java.sun.com/j2se/1.4.1/download.html(J2SDK 1.4.1_02,标准 RPM 包)
我不确定只安装 Linux 版 JRE 是否足够。对于 Windows 部署,它肯定不起作用,因此我也决定选择 Linux 版的 SDK(它稍微大一些)。
- Solaris/Windows 版 WebObjects 5.1 或 5.2 CD(从http://store.apple.com获取)
有效的部署许可证密钥;对于 WebObjects 5.1,您可以使用 WebObjects 5.0 或 5.1 安装中的许可证密钥。重要提示:对于 WebObjects 5.2,您需要专门为此版本制作的密钥!旧版本的许可证密钥一开始可能有效,但稍后您将无法运行任何应用程序。:-(
- WebObjects 更新
- Solaris 版 WebObjects 5.1 更新版 3(压缩的 tar 文件和 shell 脚本):http://docs.info.apple.com/article.html?artnum=75277;完整的补丁列表位于http://docs.info.apple.com/article.html?artnum=70037
- 目前还没有 WebObjects 5.2 的更新,因此我暂时删除了更新部分。
如果您不想自己应用步骤 6 中讨论的 makefile 更改,可以从此处下载这些更改。在压缩包内,有针对 WebObjects 5.1 和 5.2 的不同文件夹。
在您的 Linux 安装中,以下软件包应该安装(每行的开头字母列出了 SuSE 7.1 安装的相应软件包系列,对于其他 Linux 发行版可能有所不同)
- a: compat(运行 Java 所需的库)
- ap: mc(Midnight Commander,并非必需 :)
- d: gcc(编译器)
- d: gdbm-devel(编译 Apache 源代码所需的库)
- d: linclude(gcc 需要)
- d: make(make 命令)
- n: ftp(用于从其他系统获取文件的 ftp 客户端,比 sftp 快得多)
- n: openssh(ssh 服务器和客户端工具,用于稍后部署应用程序)
- n: smbclnt(用于挂载来自 Windows 计算机的共享)
以下是不需要的,请在安装之前取消选择(或者如果您已经拥有运行系统,则卸载这些软件包)
- n: apache(您将自己制作)。
- d: java(JDK 1.1.8)
- d: javarunt(Java Runtime 1.1.8)
一个不错的软件包搜索网站是http://rpmfind.net。让安装程序自动解析软件包依赖关系,您就可以开始了...
完成 Linux 安装后,创建以下文件夹;我们稍后将使用它们来存放安装包,并在完成后删除它们
mkdir -p /opt/install/apache mkdir -p /opt/install/java mkdir -p /opt/install/woupdate
由于 Apache 2.x 版本无法与 WebObjects 适配器一起使用,因此您必须使用 Apache 1.3.x 版本。
重要提示 大约在 2002 年 6 月 20 日,Apache 中的一个安全漏洞被发现,它允许攻击者在服务器上执行代码,甚至可能获取 root 权限。由于所有版本(包括 1.3.24 及更早版本)都受此漏洞影响,因此您应该至少使用 1.3.26 版本,它修复了此安全漏洞。
将下载的 apache 源代码(apache_1.3.27.tar.gz)放入 /opt/install/apache。然后解压
cd /opt/install/apache tar xfvz apache_1.3.27.tar.gz cd apache_1.3.27
配置、构建和安装 Apache。必须安装 gdbm-devel 软件包才能正常运行。
./configure --prefix=/usr/local/apache --enable-module=so --enable-module=rewrite --enable-shared=max --enable-rule=SHARED_CORE
make clean; make; make install
使启动 Apache 更容易
ln -s /usr/local/apache/bin/apachectl /usr/bin/apachectl
尝试是否可以正常运行
apachectl start
现在在浏览器中打开 http://<your-host>。如果您看到了 Apache 默认页面,则一切正常。
重要提示 在默认安装中(如本操作指南中所述),系统应被视为不安全的,在未采取任何保护措施的情况下不要连接到互联网!由于我对 Linux/Apache 安全知之甚少,我强烈建议您参考一些安全操作指南,了解如何提高系统的安全性。
将下载的 SDK(j2sdk-1_4_0_01-linux-i586-rpm.bin)放到 /opt/install/java
cd /opt/install/java chmod a+x j2sdk-1_4_1_02-linux-i586-rpm.bin ./j2sdk-1_4_1_02-linux-i586-rpm.bin
阅读许可协议,并在最后输入 yes。然后脚本将解压缩 RPM 包,因此您现在可以安装它
rpm -i -vv j2sdk-1_4_1_02-fcs-linux-i386.rpm ln -s /usr/java/j2sdk1.4.1_02/bin/java /usr/bin/java
要查看是否可以正常运行,请尝试以下操作
java -version
输出应类似于以下内容
java version "1.4.1_02" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_02-b06) Java HotSpot(TM) Client VM (build 1.4.1_02-b06, mixed mode)
挂载 WebObjects 5.1 安装光盘
mount -t iso9660 -o nojoliet -o norock -o map=o /dev/cdrom /cdrom cd /cdrom ls
重要: 由于安装脚本区分大小写,CD 上的文件和文件夹必须包含正常大小写字母。如果您看到 /cdrom 中的所有内容都显示为小写或大写,但没有混合,则说明安装失败。:-(
为了解决这个问题,您可以将 CD 的内容复制到 Windows 计算机上的共享文件夹,然后从那里读取。假设 Windows 计算机的地址为 192.168.1.1,共享文件夹名称为 wocd,则您可以这样访问它
mount -t smbfs //192.168.1.1/wocd /cdrom -o username=smb,password=smb
在这个例子中,您需要在 Windows 计算机上设置一个用户名为 smb、密码为 smb 的用户。如果您在 Windows 上启用了来宾帐户(不推荐),则可以省略挂载命令的用户名/密码。
启动安装脚本并按照说明进行操作。
cd /cdrom/Deployment/SOLARIS ./install.sh
对于批处理设置,您可以使用以下方法
cd /cdrom/Deployment/SOLARIS ./install.sh -license B-111-AAA-111-AAA-111-AAA-111-AAA-111 -adaptorsOnly NO -minimalInstall NO -cgibin /usr/local/apache/cgi-bin -docroot /usr/local/apache/htdocs -woroot /opt/Apple
首先,请确保在开始安装或许可证密钥检查之前,将目录切换到 /cdrom/Deployment/SOLARIS。其次,您需要提供真实的许可证密钥,而不是 B-111-AAA-111-AAA-111-AAA-111-AAA-111。:-(
按照屏幕上的说明进行操作,等待安装完成。
如果出现错误,请尝试以下操作
ln -s /usr/bin/uncompress /usr/bin/compress
现在,如果 /etc/profile.local 不存在,请创建它。
touch /etc/profile.local
要在每次启动时导出 NEXT_ROOT,请将以下行添加到 /etc/profile.local 中
NEXT_ROOT=/opt/Apple export NEXT_ROOT
现在,您需要注销并重新登录,以便 NEXT_ROOT 生效。您也可以手动为当前会话导出 NEXT_ROOT
export NEXT_ROOT=/opt/Apple
要查看是否有效,请执行以下操作
echo $NEXT_ROOT
如果回显的是 /opt/Apple,则说明一切正常。:-(
对于 WebObjects 5.2,请跳过此步骤,因为目前没有更新可用。
在开始更新之前,需要从 Web 服务器卸载 mod_WebObjects,并停止所有与 WebObjects 相关的进程。由于我们到目前为止还没有使用过 WebObjects,所以这对于本操作指南来说无关紧要,但为了安全起见,请执行以下操作:apachectl stop
cd $NEXT_ROOT/Library/WebObjects/Executables ./WOServices stop
如果您正在运行独立 (EOF/WO) 应用程序,请也将其终止。此外,补丁脚本需要 gnutar。如果没有,您可以创建一个链接
ln -s /bin/tar /bin/gnutar
要安装更新,您需要下载两个文件:更新本身 (WO51SolarisUpdate3.TAR.Z) 和补丁脚本 (patcher.sh)。将这两个文件放入 /opt/install/woupdate,然后启动更新
cd /opt/install/woupdate cdsfdsfs chmod a+x patcher.sh ./patcher.sh -install WO51SolarisUpdate3.TAR.Z cd $NEXT_ROOT/Library/WebObjects/WODocumentRoot cp -R WebObjects /usr/local/apache/htdocs/WebObjects
编辑 $NEXT_ROOT/Library/Frameworks/JavaWebObjects.framework/Resources/WebServerConfig.plist
line 2: change /Library/WebServer/Documents to /usr/local/apache/htdocs
现在是激动人心的时刻:编译适配器!
由于 makefile 不包含 Linux 支持 - 顺便问一下,有充分的理由吗?- 您需要自己添加支持。幸运的是,适配器源代码随 WebObjects 提供。
我之前找到的所有解决方案都以某种方式破坏了脚本。例如,在 Solaris 上运行脚本需要进一步修改。在这里,我们将进行一个“干净”的解决方案,它为 Linux 添加了支持,而不会破坏其他平台的脚本。
首先,导出 OS 变量,以便脚本知道我们正在使用 Linux
export OS=LINUX
我们只需要在编译时使用它,不需要将其放入 /etc/profile.local(但如果您愿意,可以这样做)。接下来,使用您选择的编辑器打开文件 $NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors/make.config,并在 MacOS X Server 条目(大约第 17 行)之前插入(复制并粘贴)以下几行
# LINUX ifeq "LINUX" "$(OS)" ADAPTORS = CGI Apache # Default path for apxs APXS = /usr/local/apache/bin/apxs endif
保存并退出。
接下来,这部分对我来说有点棘手,因为 WebObjects 5.1 和 5.2 有所不同。
<WEBOBJECTS 5.1>
打开 $NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors/Apache/Makefile,并在最后一个 endif(大约第 66 行)之后复制并粘贴以下几行
ifeq "LINUX" "$(OS)" # If Apache is in a nonstandard location, change this APACHEINCLUDEFLAGS = -I/usr/local/apache/include CFLAGS = -O2 -Wall -I../Adaptor ${LDAPACHESSLFLAG} $(DEBUG_FLAG) -DSINGLE_THREADED_ADAPTOR -D$(OS) -DEAPI -DFORKING_WEBSERVER -DAPACHE ${OPENSSLINCLUDEFLAGS} ${APACHEINCLUDEFLAGS} ${OPENSSLLIBFLAGS} -L/lib APXSFLAGS = -i LDFLAGS += -G -L/lib -lc ${OPENSSLLIBFLAGS} all: adaptor adaptor: mod_WebObjects.so ○${APXS} ${APXSFLAGS} mod_WebObjects.so mod_WebObjects.so : mod_WebObjects.o ${COMMON_OBJFILES} # ${APXS} ${APXSFLAGS} -c mod_WebObjects.c ${COMMON_OBJFILES} # ${APXS} ${APXSFLAGS} mod_WebObjects.o ${COMMON_OBJFILES} ○ld ${LDFLAGS} mod_WebObjects.o ${COMMON_OBJFILES} -o mod_WebObjects.so clean: ○rm -f mod_WebObjects.so mod_WebObjects.o *.o #mod_WebObjects.o: mod_WebObjects.c # ${APXS} ${APXSFLAGS} -c mod_WebObjects.c mod_WebObjects.o: mod_WebObjects.c ${COMMON_OBJFILES} ○${CC} -c ${CFLAGS} mod_WebObjects.c ${COMMON_OBJFILES} endif
注意:这些奇怪的圆圈(例如,在 ○${APXS} ${APXSFLAGS} mod_WebObjects.so 的开头)不是打字错误,而是 TAB(制表符)键。make 进程需要它们才能成功完成,所以不要忘记它们!
</WEBOBJECTS 5.1>
<WEBOBJECTS 5.2> 打开 $NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors/Apache/Makefile,将其剪切到大约第 29 行,即 ifeq "SOLARIS" "${OS}" ... endif 块之后,删除所有后续行直至文件末尾。然后将以下几行追加到文件末尾,使其看起来像这样
ifeq "LINUX" "${OS}" ENABLE_SSL_SUPPORT = OPENSSL_INCL_FLAGS = OPENSSL_LIB_FLAGS = APACHE_INCL_FLAGS = -I/usr/local/apache/include CFLAGS +=-DEAPI ${APACHE_INCL_FLAGS} LDFLAGS += -G -L/lib -lc ${OPENSSL_LIB_FLAGS} endif CFLAGS += ${OPENSSL_INCL_FLAGS}
APXSFLAGS = -i
all: mod_WebObjects.so mod_WebObjects.so : mod_WebObjects.o ${COMMON_OBJFILES} ○ld ${LDFLAGS} mod_WebObjects.o ${COMMON_OBJFILES} -o mod_WebObjects.so ○${APXS} ${APXSFLAGS} mod_WebObjects.so mod_WebObjects.o : mod_WebObjects.c ${COMMON_OBJFILES} ○${CC} -c ${CFLAGS} mod_WebObjects.c ${COMMON_OBJFILES} clean: ○rm -f mod_WebObjects.so mod_WebObjects.o *.o include ../Adaptor/make.postamble
</WEBOBJECTS 5.2>
从这里开始,两个版本的操作都相同。
需要更改的最后一个文件是 $NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors/Adaptor/appcfg.c。搜索以下三行,从大约第 52 行开始
#ifndef MAXPATHLEN #define MAXPATHLEN 255 #endif
将这三行剪切并粘贴到以下行(大约第 72 行)_之后_,如下所示
#include <arpa/inet.h> /* inet_addr() */ #include <sys/param.h> #endif #ifndef MAXPATHLEN #define MAXPATHLEN 255 #endif
应用完这些更改后,执行以下操作
cd $NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors make clean; make
在编译过程中,mod_WebObjects.so 会自动放置到 /usr/local/apache/libexec 中,无需手动执行此操作。如果您在其中找到了 mod_WebObjects.so,则说明编译成功。CGI 适配器也已构建,可以在 $NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors/CGI/WebObjects 中找到,如果您想玩玩的话。
恭喜您,您快完成了!
将 WebObjects 的配置文件复制到 Apache 的 conf 文件夹
cd $NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors/Apache cp apache.conf /usr/local/apache/conf/webobjects.conf
编辑 /usr/local/apache/conf/httpd.conf。搜索行“LoadModule rewrite_module ...”,并在其_之前_插入以下几行
Include /usr/local/apache/conf/webobjects.conf <Location /cgi-bin/./> SetHandler WebObjects </Location>
搜索行“AddModule mod_rewrite.c”,并将以下行放在该行的_之后_
AddModule mod_WebObjects.c
搜索行“ServerName ...”,并将您的 DNS 主机名放在其中。如果您没有 DNS 主机名,也可以使用您的 IP 地址。httpd.conf 中关于这一点的解释非常好。
ServerName yourhost.yourdomain.com
现在编辑 /usr/local/apache/conf/webobjects.conf
line 4: replace SYSTEM_LIBRARY_DIR/WebObjects/Adaptors/Apache/mod_WebObjects.so with /usr/local/apache/libexec/mod_WebObjects.so line 5: put a # in front of AddModule mod_WebObjects.c to comment it out line 9: replace LOCAL_LIBRARY_DIR/WebServer/Documents with /usr/local/apache/htdocs
您可以选择更改以下内容
line 13: /cgi-bin/WebObjects (can be changed to /myFunkyAlias/WebObjects) line 28: https://127.0.0.1:1085 10 (can be changed to http://host1:1085,http://host2:1085 10, don't put spaces after the comma sign when adding multiple hosts!)
保存并退出。现在,要查看是否一切正常,请尝试
apachectl configtest
如果显示“Syntax OK”,则说明一切正常。否则,请尝试查找并更正它报告的错误。
启动 Apache 很简单
apachectl start
启动 wotaskd
$NEXT_ROOT/Library/WebObjects/JavaApplications/wotaskd.woa/wotaskd &
如果它在一段时间后仍在前台运行,您可以按 CTRL+C 返回到 shell;然后 wotaskd 将在后台继续运行。
在添加应用程序之前,最后一步是启动 JavaMonitor,看看它是否有效
$NEXT_ROOT/Library/WebObjects/JavaApplications/JavaMonitor.woa/JavaMonitor -WOPort 56789
启动 JavaMonitor 后,您会看到类似以下内容的行
您的应用程序 URL 是
http://yourhost.yourdomain.com:56789/
在 Web 浏览器中打开此 URL。
还记得您在步骤 1 中创建的那些安装文件夹吗?现在您可以安全地删除它们,除非您想再次安装
rm -rf /opt/install/apache rm -rf /opt/install/java rm -rf /opt/install/woupdate
重要:请确保您正确输入了路径名;rm -rf 不会放过任何东西...
问:当我尝试编译适配器源代码时,出现了以下错误,编译停止:In file included from ../Adaptor/appcfg.c:64
/usr/include/unistd.h:734: conflicting types for `gethostname' ../Adaptor/appcfg.c:57: previous declaration of `gethostname' make[1]: *** [appcfg.o] Error 1 make: *** [CGI] Error 2
这是什么意思?
答:您忘记导出 OS 变量。在编译之前执行 export OS=LINUX。
问:当我尝试编译适配器源代码时,出现了以下错误,编译停止
Makefile:79: *** missing separator. Stop. make: *** [Apache] Error 2
答:在错误消息指定的行(本例中为 79 行)开头添加一个 TAB 字符。仅添加几个“空格”字符不起作用。TAB 字符(ASCII 字符编号 9)可以通过以下方式输入
- 按住键盘上的左 ALT 键
- 按下数字键盘上的“9”键;“Numlock”必须打开。
- 释放 ALT 键。
问:在编译过程中,显示了许多警告。我需要担心吗?
答:显示了两种不同的内容
mod_WebObjects.c:242: warning: `setOption3' defined but not used
您可能可以在 Linux 下编译时注释掉此方法,但我不知道您是否需要在 Solaris 或 OSX 上使用它。我的目标是使源代码在每个平台上都兼容。
cc: <filename>.o: linker input file unused since linking not done
可能是 Linux 下的链接方式不同,或者根本不需要。如果您知道要调整 makefile 中的哪一行,请将更改发送给我,我会更新本操作指南。
问:当我从命令行运行应用程序(即,不是通过 Monitor)时,无法连接到应用程序,我该怎么办?
答:在启动应用程序时,只需添加 -WODirectConnectEnabled YES 作为参数,然后通过 http://host:port 连接。
- 到目前为止,还没有遇到其他需要解决的问题,期待新的问题出现。:-(
1.5:2003-03-02 - 添加了对 WebObjects 5.2 安装的支持 - 更新了 Apache 和 Java SDK 版本号以及超链接
1.4:2002-08-01 - 隐藏了大多数“mailto:”链接,以更难被垃圾邮件发送者利用(应该从一开始就这样做)
1.3: 2002-06-30 - 在故障排除部分添加了两个问题 - 添加了关于 Apache 安全漏洞的警告,并更新了 Apache 1.3.26 的操作指南 - 在步骤 2 的末尾添加了安全警告 - 在故障排除部分添加了“如何在键盘上创建标签”。
1.2: 2002-06-18 - 在 appcfg.c 中添加了更改,以避免编译器警告。
1.1: 2002-06-14 - 添加了一些故障排除内容 - 更新了操作指南的相关部分,以使用 WebObjects 的更新 3 而不是更新 2。
1.0: 2002-06-09 - 第一个(工作)版本。
0.9: 2002-06-08 - 第一个版本,正在等待通过自检。