使用独立框架部署 Tomcat 7

使用独立框架部署 Tomcat 7

    精彩文章,何不与朋友分享

[译注]本文翻译自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

你可能感兴趣的:(使用独立框架部署 Tomcat 7)