-
精彩文章,何不与朋友分享
[译注]本文翻译自Cloud Foundry英文博客站点,原文题为“Deploying Tomcat 7 Using the Standalone Framework”,文章发表时间是 2012 年 6 月 18 日。
新提供的独立框架支持大大增加了可以在 Cloud Foundry 上运行的各种非 Web 应用程序的类型数目,包括应用程序服务器。本教程将逐一为您介绍在 Cloud Foundry 上的 Tomcat 7 容器中部署“hello world”应用程序的步骤。目前,Cloud Foundry 使用 Tomcat 6 来承载 Java Web 应用程序。虽然本团队正在致力于支持 Tomcat 7 这一一流容器,但同时利用独立应用程序支持来运行 Tomcat 7 也是十分简单的,独立应用程序支持对利用 Servlet 3.0 的应用程序而言尤为有用。基本的部署过程简要如下:将您的应用程序安装到 Tomcat 7 实例中,对配置稍作改动,然后将 Tomcat 7 及您的应用程序的全部内容作为独立应用程序推送到 Cloud Foundry。
第 1 步 – 下载 Apache Tomcat
将 Apache Tomcat 7 下载到您将使用 vmc 命令行工具的位置。如果您没有 vmc,那么请遵照这些说明来安装它。我下载的是 Apache 7.0.27,这是目前最新的 7.0 版发行版,其文件名为 apache-tomcat-7.0.27.zip。本教程自始至终的所有命令都将假定当前工作目录为 Tomcat 7 基目录。
第 2 步 – 解压缩 Tomcat 并更新权限
将 tomcat zip 文件解压缩到一个本地目录。我将对 bin/*.sh 脚本的权限更改成了拥有可执行权限。
unzip apache-tomcat-
7.0
.
27
.zip
cd apache-tomcat-
7.0
.
27
chmod +x bin/*.sh
|
Linux 和 OSX 用户在将这些脚本推送到 Cloud Foundry 基于 Ubuntu 的服务器环境前,应能够在自己的本地系统上测试这些脚本。遗憾的是,Windows 用户事先无法在本地测试 bin/startup.sh 脚本改动,不过这些修改确实非常简单。
第 3 步 – 编辑启动脚本
bin/startup.sh
Tomcat 通常是使用 bin/startup.sh 脚本启动的。为了让 Tomcat 使用调用 startup.sh 的那个 shell 而不是生成一个新 shell,请将 startup.sh 最后一行中的执行参数从“start”更改为“run”:
exec
"$PRGDIR"
/
"$EXECUTABLE"
start
"$@"
|
改为:
exec
"$PRGDIR"
/
"$EXECUTABLE"
run
"$@"
|
bin/catalina.sh
我们希望 Tomcat 7 使用的不是预定义的静态端口,而是由 Cloud Foundry 分配的端口,在部署时此端口将存储在 VCAP_APP_PORT 环境变量中。请将下面的 Bash 代码放在 catalina.sh 顶部附近的初始注释后面。这样做只是为了使我们无需修改代码也可在本地运行此端口,如果动态端口不可用作环境变量,此代码将分配一个静态端口号 8080。
# USE VCAP PORT IF IT EXISTS, OTHERWISE DEFAULT TO
8080
if
[ -z ${VCAP_APP_PORT} ]; then
export VCAP_APP_PORT=
8080
fi
export JAVA_OPTS=
"-Dport.http.nonssl=$VCAP_APP_PORT $JAVA_OPTS"
|
第 4 步 – 编辑 Tomcat 配置
conf/server.xml
将 Server 元素的 port 属性设置为 -1,这将禁用 Tomcat 关闭端口。Cloud Foundry 不使用关闭端口,因为它通过发出“kill -9 PID”命令来停止任何独立应用程序实例。我们希望避免与在同一 Droplet Execution Agent (DEA) 上运行的其他应用程序产生任何潜在的端口冲突,因此目前建议对在 Cloud Foundry 上运行的独立应用程序仅使用单个 http 端口。
<Server port=”-
1
” command=”SHUTDOWN”>
|
查看原始内容 Server.xml。此 Gist 由 GitHub 惠供。
由于 Cloud Foundry 无需使用 AJP 连接器即可为您处理负载平衡,您应通过注释掉下面显示的节来禁用 AJP 连接器,以确保我们不会遇到端口冲突。
<!-- Define an AJP
1.3
Connector on port
8009
<Connector port=
"8009"
protocol=
"AJP/1.3"
redirectPort=
"8443"
/>
-->
|
Connector 元素应使用在 JAVA_OPTS 环境变量中提供的端口,我们之前已在 catalina.sh 脚本中设置了此变量。
<Connector port=
"${port.http.nonssl}"
protocol=
"HTTP/1.1"
connectionTimeout=
"20000"
redirectPort=
"8443"
/>
|
查看原始内容 Connector.xml。此 Gist 由 GitHub 惠供。
此时,我建议在您的本地服务器上试着应用一下所做的编辑,看看 Tomcat 7 是否像预期的那样启动。为了测试采用的是否为 VCAP_APP_PORT,我建议使用一个命令 shell 指定一个示例端口,如 8082。
jbayer$ export VCAP_APP_PORT=
8082
jbayer$ bin/startup.sh
|
控制台不应该返回(当 Tomcat 运行时它应该阻塞),控制台输出中的最后几行中应有一行为:
INFO: Starting ProtocolHandler [
"http-bio-8082"
]
|
如果确实如此,那么您应该能够访问 http://localhost:8082 来看看是否出现欢迎页面。
Tomcat 7 正在本地运行
此时,您可能希望备份(压缩成 zip)包含了您到目前为止所进行的各种定制的整个 Tomcat 7 目录,以便您今后可以对其他应用程序重用该目录。
第 5 步 – 安装您的应用程序
为了体现出 Tomcat 7 功能,我使用的是 Servlet 3.0,它现已支持 Servlet 注释,如下面的这个简单 Servlet 中所示。
package
tomcat7;
import
java.io.IOException;
import
javax.servlet.ServletException;
import
javax.servlet.annotation.WebServlet;
import
javax.servlet.http.*;
@WebServlet
(
"/Servlet3"
)
public
class
Servlet3
extends
HttpServlet {
public
Servlet3() {
super
();
}
protected
void
service(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
response.getWriter().println(
"Hello from Servlet 3.0!"
);
}
} [
"http-bio-8082"
]
|
Cloud Foundry 将 ROOT Web 应用程序与 Tomcat 6 一起使用,那我们就对 Tomcat 7 也采用同样的做法。
首先,删除现有的 ROOT 应用程序。
jbayer$ rm –r webapps/ROOT
|
现在该您的 Web 应用程序上台了,请将它解压缩到 webapps/ROOT 位置。如果您有 .war 文件,那么解压缩命令大致如下:
jbayer$ unzip –d webapps/ROOT ~/dev/mytomcat7.war
|
在本地检查您的应用程序,看看它是否正确运行。
第 6 步 – 将此应用程序推送到 Cloud Foundry
从 Tomcat 7 基目录执行 vmc 命令,执行时对于很多默认选择请予以采纳。请注意,vmc 会自动检测到它是“独立应用程序”,因此您只需提供启动脚本路径并映射一个唯一 URL 即可。还请注意,如果此 URL 不是唯一的,将会出错。
jbayer$ vmc push mytomcat7
Would you like to deploy from the current directory? [Yn]:
Detected a Standalone Application, is
this
correct? [Yn]:
1
: java
2
: node
3
: node06
4
: ruby18
5
: ruby19
Select Runtime
1
:
1
Selected java
Start Command: bin/startup.sh
Application Deployed URL [None]: mytomcat7.cloudfoundry.com
Memory reservation (128M, 256M, 512M, 1G, 2G) [512M]: 256M
How many instances? [
1
]:
Bind existing services to
'mytomcat7'
? [yN]:
Create services to bind to
'mytomcat7'
? [yN]:
Would you like to save
this
configuration? [yN]: y
Manifest written to manifest.yml.
Creating Application: OK
Uploading Application:
Checking
for
available resources: OK
Processing resources: OK
Packing application: OK
Uploading (23K): OK
Push Status: OK
Staging Application
'mytomcat7'
: OK
Starting Application
'mytomcat7'
: OK
|
在推送过程结束时,您将有机会选择将此配置写入到一个清单文件中。下面是生成的 manifest.mf 文件,该文件是从我们的部署中写入到 Tomcat 7 基目录的。请注意,该文件包含启动命令 bin/startup.sh。如果根目录中存在该文件,那么下次您推送此应用程序时 vmc 将从该文件中读取内容并跳过上述交互问题。
---
applications:
.:
url: mytomcat7.cloudfoundry.com
command: bin/startup.sh
runtime: java
framework:
info:
exec:
description: Standalone Application
mem: 64M
name: standalone
name: mytomcat7
instances:
1
mem: 256M
|
总结
诸如 Jetty 等其他容器所遵循的模式与上述模式类似。大多数应用程序都应能够使用 Cloud Foundry 提供的现有框架。如需定制或引入您自己的容器,那么 Cloud Foundry 独立应用程序支持将是绝佳选择。
- Cloud Foundry 团队
的 James Bayer
敬请造访 ClouFoundry.com 免费试用 Cloud Foundry