不积跬步,无以至千里

博客园 首页 新随笔 联系 订阅 管理

由于 Tomcat 基于 Java,实际上在各种 Linux 发行版里的配置方法都大同小异,只是我看见在 Arch Linux 环境里搭建 Tomcat 的文章比较少,所以在 Arch Linux 实践一遍然后得出此文。此文假设你对 Tomcat 并不十分了解,主要笔墨将会在 Tomcat 的配置之上。

1、安装 Java JDK

在 Arch Linux 的 extra 源里有 jdk7-openjdk 和 openjdk6,可以直接使用 pacman 安装,至于选用哪一个可以视具体情况而定。我安装的是 OpenJDK 7:

$ sudo pacman -S jdk7-openjdk

2、安装 Tomcat

同样地,extra 源里已有 tomcat 版本5、6、7,可以根据具体情况而定,我这里安装的是tomcat 6。

$ sudo pacman -S tomcat6

默认情况 tomcat 6 安装路径为 /usr/share/tomcat6,这里罗列一下主要目录的作用(箭头表示目录链接的实际位置):

1./usr/share/tomcat6: 程序主目录,也是变量 $CATALINA_HOME 所指向的位置,在单 tomcat 实例的情况下,也是变量 $CATALINA_BASE 所指向的位置。

2.conf -> /etc/tomcat6: 配置文件目录。

3.lib -> /usr/share/java/tomcat6: 共享jar包目录,这些包既给 tomcat 所使用,也能给 web 应用程序所引用。

4.logs -> /var/log/tomcat6: 日志目录,对于查找错误以及查看访问记录很有帮助。

5.webapps -> /var/lib/tomcat6/webapps: 默认的 web 应用程序目录,tomcat 6 自带了几个示例程序,下面会介绍。

现在可以尝试启动 tomcat 服务:

$ sudo /etc/rc.d/tomcat start

根据安装的 Java 运行时的不同,启动时可能有错误,检查启动脚本的配置文件 /etc/conf.d/tomcat6 里面的 TOMCAT_JAVA_HOME 变量的值,在我的安装中 Java 运行时应该在 /opt/java 里(用 $ which java 就可以看到了),因此将:

TOMCAT_JAVA_HOME=/usr/lib/jvm/java-7-openjdk 更改为如下即可: TOMCAT_JAVA_HOME=/opt/java

重启 tomcat 服务:

$ sudo /etc/rc.d/tomcat6 restart

一般应该没有问题,打开任意浏览器并在地址栏里输入 “http://localhost:8080″,如果看到 tomcat 猫即说明服务已经安装妥当并且能正常运行了。

3、认识 webapps 目录

这个目录位于 tomcat6 的安装目录之下,实际内容位于 /var/lib/tomcat6/webapps。 webapps 目录里每一个目录对应一个web应用程序,比如 docs 目录的访问地址是 http://localhost:8080/docs,同理 manager 目录的访问地址是 http://localhost:8080/manager,其中比较特殊的是 ROOT 目录,它对应的访问地址恰好是网站的根目录,即 http://localhost:8080/。

Tomcat 附带的示例程序可以逐个访问体验一下,其中 manager 和 host-manager 这两个应用程序设置了需要登录验证才能访问,增加登录用户的方法是编辑 Tomcat 安装目录下的配置文件 conf/tomcat-users.xml (实际上也是文件 /etc/tomcat6/tomcat-users.xml),添加如下几行:

<role rolename="manager-gui"/>
<role rolename="admin-script"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-script,admin-gui"/>

然后重启 Tomcat 服务,即可以通过用户名 tomcat 和密码 tomcat 登录并访问 manager 和 host-manager 两个应用程序。

每个 Java Web 应用程序都有如下的目录结构

  • /index.html 访客直接访问的资源,比如静态图片和CSS样式表。

  • /WEB-INF/ 访客不能直接访问的资源。

  • /WEB-INF/classes 应用程序的 Java 源码编译后的class文件。

  • /WEB-INF/web.xml 应用程序的配置文件。

  • /WEB-INF/lib 应用程序所引用的包。

当然也不是所有都是必须的,你甚至可以创建一个目录,比如“hello”,然后在里面只创建一个 index.html 文件(内容随便),即可以通过 http://localhost:8080/hello/index.html 访问了。(当然这样的不是Web应用程序,此方法仅用于测试用)

下面使用 Apache Maven 创建一个最简单的 Web 应用程序,在用户目录里执行如下命令创建 Web 应用程序的骨架:

$ mvn archetype:generate

在交互界面中,

Choose a number or apply filter: 输入 174,即创建 maven-archetype-webapp 类型项目。 Choose version: 输入5,即版本 1.0。 Define value for property ‘groupId’: 输入 org.test。 Define value for property ‘artifactId’: 输入 demo。 Define value for property ‘version’: 输入 1.0。 Define value for property ‘package’: 输入 org.test.demo Confirm properties configuration: 直接回车

上面涉及 Maven 知识不在此文的讨论范围,如果不熟悉的话可以参阅免费的中文电子图书《Maven in action》,顺带提一下,Maven 是Java项目构建和管理的最常用工具之一。

现在应该看到一个名为 demo 的目录,进入后可以使用 Maven 打包项目:

$ cd demo
 
$ mvn package

打包的结果是文件 ./target/demo.war,把这个文件复制到 webapps 目录:

$ sudo cp target/demo.war /var/lib/tomcat6/webapps/

由于 Tomcat 默认创建的站点会自动部署应用程序,所以刚才复制到 webapps 目录的文件 demo.war 会被自动解压缩,检视 webapps 目录应该会发现多出一个名字为 demo 的目录,现在可以在浏览器里尝试访问 http://localhost:8080/demo,应该看到 “Hello World!”字样,这就是刚才用 Maven 创建的 Web 应用程序运行的结果。

需要说明的是,java web 应用程序打包之后所形成的 war 文件并不是一定要解压出来才能运行的,这点将会在下一节的配置里会讲到。

4、认识 Tomcat 的主配置文件 server.xml

这个文件位于 tomcat 6 安装目录之下的 conf 目录之内,实际内容位于 /etc/tomcat6/server.xml。

正如该文件的扩展名所示,这是一个 xml 格式的文件,打开之后将会看到如下的结构:

<Server port="8005" shutdown="SHUTDOWN">
    <Service name="Catalina">
        <Executor ...... />
        <Connector ...... />
        <Connector ...... />
        <Engine name="Catalina" ... >
            <Host name="localhost" ... >
                <Context ... />
            </Host>
        </Engine>
    </Service>
</Server>

即一个由 Server->Service->Engine->Host->Context 组成的四层结构,从里层向外层分别是:

1.Context: 即 Web 应用程序,一个 Context 即对于一个 Web 应用程序。

2.Host:即虚拟主机,比如 www.dog.com 对应一个虚拟主机,api.dog.com 对于另一个虚拟主机。一个 Host 用于定义一个虚拟主机。(所谓的”一个虚拟主机”可简单理解为”一个网站”)

3.Engine:一组虚拟主机的集合。比如www.dog.com 和 api.dog.com 可以组成一组虚拟主机集合。

4.Service:一组 Engine 的集合,包括线程池 Executor 和连接器 Connector 的定义。

CONNECTOR 的配置

一个 Connector 即一个对外界开放的端口,简单理解就是大部分网络服务程序都会遇到的 IpAddress:Port 的组合,比如 192.168.0.10:8080 就是一个端口,当然在 Connector 里可以定义的内容要丰富得多,即 Connector 这个 XML 节点里可以加上许多属性。下面列举一下常用的:

enableLookups:(default=true) 是否允许反向解析访客的IP地址,当你的应用程序使用 request.getRemoteHost() 时如果只需要IP地址,建议禁用此项,这样能节省反向域名解析的时间。

maxPostSize:(default=2097152 即2MB) 最大允许 POST 上传的数据大小(单位为:字节),对于一般网站来说,比如有写评论写文章的网站,默认的2MB已经足够,不过如果网站带有图片甚至文件上传功能,则需要根据具体情况来定。

protocol:连接器的类型,tomcat 6 有如下几种选择

1.org.apache.coyote.http11.Http11Protocol:简写为 “HTTP/1.1″,这是默认的连接器,一个访客网络连接需要一个线程,并发性能比较低。

2.org.apache.coyote.http11.Http11NioProtocol:NIO连接器,一个由非阻塞的socket工作模式构成的连接器,并发性能良好,纯Java实现。

3.org.apache.coyote.http11.Http11AprProtocol:APR连接器,所谓 APR 就是网络上最多服务器使用的 Web 服务程序 Apache Http Server 所使用的库,Tomcat 建议在生产环境使用,具体方法下面会介绍。

SSLEnabled:(default=false),设置当前连接器是否使用安全SSL传输,如果设置为”true”,则应该同时设置下面两个属性: scheme=”https” (default=http) 可以设置为 http 或者 https。 secure=”true” (default=false)。

redirectPort:当用户访问非https的资源而该资源又需要https方式访问时,tomcat会自动重定向到https端口,一般https使用 TCP 443端口,所以一般取值”443″。

adress:连接器所绑定的IP地址,当一台服务器存在多个ip地址时可以指定其中的需要绑定的一个,默认不设置该属性的值表示绑定当前服务器的所有ip地址。

compressableMimeType:(default=”text/html,text/xml,text/plain”) 指定需要GZIP压缩的资源的类型。

compression:(default=off) 是否启用GZIP压缩,可以取值 on/off/force,设置为on之后会对 compressableMimeType 属性指定的资源类型启用GZIP压缩。

connectionTimeout:(default=”60000″) 当访客网络连接后,服务器等待第一行Request头出现的时间。单位是毫秒。

executor:指定当前连接器使用的线程池的名称,如果指定,则忽略其他针对线程数量的设置,比如 maxThreads。

maxThreads:(default=200) 最多可创建线程的数量。

port=”80″:绑定端口

keepAliveTimeout:(default=connectionTimeout),访客完成一次请求后维持网络连接的时间。

一个简单的 Connector 定义如下:

<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="60000"
           redirectPort="443" />

EXECUTOR 的配置

Executor 用于定义共享的线程池。默认情况下每个 Connector 都会产生自己的一个线程池,如果你想多个 Connector 共享一个线程池,则可以先定义一个线程池,如:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>

然后修改上述的 Connector 配置,增加 executor 属性,修改后的配置如下:

<Connector executor="tomcatThreadPool"
               port="80" protocol="HTTP/1.1"
               connectionTimeout="60000"
               redirectPort="443" />

HOST 的配置

一个 Host 配置即为一个虚拟主机,例如下面是一个简单的 Host 配置:

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Alias>dog.com</Alias>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
</Host>

Host 配置节点各个属性的作用:

1.name:设置虚拟主机的域名,比如 localhost 表示本机名称,实际应用时应该填写具体域名,比如 www.dog.com 或者 dog.com,当然如果该虚拟主机是给内部人员访问的,也可以直接填写服务器的 ip 地址,比如 192.168.1.10。

2.autoDeploy:是否允许自动部署,默认值是 true,即表示 Tomcat 会自动检测 appBase 目录下面的文件变化从而自动应用到正在运行的 Web 应用程序。

3.unpackWARs:设置是否自动展开 war 压缩包再运行 Web 应用程序,默认值是 true。

4.appBase:设置 Web 应用程序组的路径。前面说过一个虚拟主机可以由多个 Web 应用程序构成,所以这里的 appBase 所指向的目录应该是准备用于存放这一组 Web 应用程序的目录,而不是具体某个 Web 应用程序的目录本身(即使该虚拟主机只由一个 Web 应用程序组成)。appBase 属性的值可以是相对于 Tomcat 安装目录的相对路径,也可以是绝对路径,需要注意的是该路径必须是 Tomcat 有权限访问的,通过 Arch Linux 源安装的 Tomcat 是通过 tomcat 用户运行的,因此创建一个新的 appBase 目录之后可以使用 chown 命令更改目录的所有者。

下面举例说明如何创建一个新的虚拟主机 www.dog.com:

在目录 /var/lib/tomcat6 下面可以看到安装 Tomcat 时默认创建的 webapps 目录,为了方便管理我们即将创建的虚拟主机的文档也在 /var/lib/tomcat6 里创建:

$ sudo mkdir dog

然后在 dog 目录里面创建目录 ROOT,再在 ROOT 里面创建文件 index.html(内容随便)。

现在将目录的所有者和所有组都更改为 tomcat:

$ sudo chown -R tomcat:tomcat dog

然后在 server.xml 的 Host 节点下增加如下 Host 节点:

<Host name="www.dog.com"  appBase="/var/lib/tomcat6/dog">
</Host>

重启 Tomcat 服务就可以在浏览器里通过地址 http://www.dog.com 访问这个新创建的虚拟主机了,当然你必须要先在 /etc/hosts 文件里增加 www.dog.com 到 127.0.0.1 的解析记录,如下:

127.0.0.1    www.dog.com

有时一个虚拟主机可能会同时绑定多个域名,比如 www.dog.com 和 dog.com,这时可以通过在 Host 配置节点里增加 Alias 实现,比如:

<Alias>dog.com</Alias>

另外上面示例当中的 <Valve className=… /> 配置了访客的访问日志的储存位置以及文件名。

ENGINE 的配置

默认的 Engine 节点如下:

<Engine name="Catalina" defaultHost="localhost">
</Engine>

这个应该不用展开叙述了,其中 defaultHost 用于指定访客在没有相应的虚拟主机时,Tomcat 默认选择的虚拟主机的名称。考虑如下的情形:

假如有3个域名都 DNS 解析到你的服务器,比如 dog.com, www.dog.com, api.dog.com,当前你只配置了虚拟主机 dog.com 和 www.dog.com,那么当有个访客通过 api.dog.com 访问你的服务器时,Tomcat 就会依据 defaultHost 的设置返回其中一个虚拟主机运行的结果。实际应用中 defaultHost 应该设置为你的主力域名,比如 www.dog.com。

5、多站点的配置:设置多个HOST节点

有时我们需要在一台服务器上跑多个站点,通过 Tomcat 很容易实现这点,下面假设我们要搭建 www.dog.com 和 www.cat.com 这两个站点。

首先要确定你的两个域名的 DNS 已经能正确解析到你的服务器,因为这里我们是做实验,所以可以在本机添加域名解析。修改 /etc/hosts 文件,加入如下两行:

127.0.0.1    www.cat.com
127.0.0.1    www.dog.com

然后在 /var/lib/tomcat6 目录里分别创建名字为 cat 和 dog 的两个目录,然后在每个目录里都创建名字为 ROOT 的目录,并在 ROOT 里面创建名字为 index.html 文件(内容随便)。然后将目录 cat 和 dog 的所有者和所有组都更改为 tomcat,方法参考上一节,这里不再赘述。

现在编辑 Tomcat 的主配置文件 server.xml,在默认的 Host 节点下面再加入如下两个新的 Host 节点:

<Host name="www.dog.com" appBase="/var/lib/tomcat6/dog" autoDeploy="true" unpackWARs="true">
</Host>
<Host name="www.cat.com" appBase="/var/lib/tomcat6/cat" autoDeploy="true" unpackWARs="true">
</Host>

在 Host 节点里面可以根据上一节的说明加入自己需要的属性或者 Alias 和 Value 子节点。重启 Tomcat 服务,现在应该可以在浏览器里分别通过 http://www.dog.com 和 http://www.cat.com 浏览这两个站点了。

6、使用 NIO 连接器

默认的连接器并发性能不太好,如果网站的并发访问量不大则无所谓,或者在公司内部网这点可能体会不出来(因为在内部网可能每个请求在1秒钟之内就完成了),当环境换成 Internet 之后,可能每个客户请求在网络会几秒甚至几十秒的延时才传输完成,这样则会导致“许多访客同时连接”的现象,当 Tomcat 的连接器所有线程都被占用的情况下,后来者(访客)就会被卡在门外。因此我们最好在实际环境中把默认的连接器改成 NIO 连接器(non blocking Java connector)。方法很简单,只要把 Connector 节点的 protocol 属性值更改为 “org.apache.coyote.http11.Http11NioProtocol” 即可,例如原先的是这样:

<Connector port="80" protocol="HTTP/1.1"
           redirectPort="443" />

修改为:

<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol"
           redirectPort="443" />

然后重启 Tomcat 服务器即可。

7、为网站添加 SSL 证书

有时网站可能涉及重要的业务数据,在互联网上传输这些页面最好以 https 方式传输,这样可以防止重要信息被中间环节窃取。

详细的方法可以参考我之前的一篇文章《添加 GoDaddy SSL 证书到你的网站》,文章介绍如何申请签名的 SSL 证书以及如何修改 Tomcat 的配置。如果你现在只是想试验一下为网站添加 https 功能,或者只是在公司的内部网站使用上 https,则可以使用一个简单的方法实现:使用自签名 SSL 证书。所谓自签名的 SSL 证书就是自己产生的证书,这种证书没有通过第三方证书商签名认证,所以在浏览这种网站时浏览器会提示证书错误,不过访客是完全可以继续浏览网站内容。

下面假设我们要为上一节的 www.dog.com 添加SSL证书。首先使用 Java 自带的 keytool 工具产生一个 keystore 文件(一种用于存放证书的文件格式),在自家目录执行如下命令:

$ keytool -keysize 2048 -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore

然后它会提示你设置一个密码以及输入DN信息:

Enter keystore password:  设置一个用于保护你keystore文件的密码,例如123456
Re-enter new password: 重复上面的密码
What is your first and last name?
  [Unknown]:  www.dog.com (就是域名啦)
What is the name of your organizational unit?
  [Unknown]:  Networking 组织单位名称(随便)
What is the name of your organization?
  [Unknown]:  dog.com 组织名称(随便)
What is the name of your City or Locality?
  [Unknown]:  Shenzhen 所在城市(随便)
What is the name of your State or Province?
  [Unknown]:  Guangdong 所在省份(随便)
What is the two-letter country code for this unit?
  [Unknown]:  CN 所在国家的两位代号(随便)
Is CN=www.dog.com, OU=Networking, O=dog.com, L=Shenzhen, ST=Guangdong, C=CN correct?
  [no]:  yes 以上信息正确则输入yes

Enter key password for
    (RETURN if same as keystore password): 这一步直接敲回车

完成后会在当前目录产生一个 tomcat.keystore 文件。把这个文件复制到 dog 网站应用程序的根目录(即 /var/lib/tomcat6/dog):

$ sudo cp tomcat.keystore /var/lib/tomcat6/dog

然后修改 Tomcat 的主配置文件 server.xml,在默认的 Connector 节点之下添加如下的新 Connector 节点:

<Connector port="443" protocol="HTTP/1.1″
    SSLEnabled="true"
    scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    keystoreFile="/var/lib/tomcat6/dog/tomcat.keystore"
    keystorePass="123456" />

假如你使用的是 NIO 连接器,则应该这样把 protocol 属性值换成 Http11NioProtocol,即:

<Connector port="443" protocol="Http11NioProtocol″
    SSLEnabled="true"
    scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    keystoreFile="/var/lib/tomcat6/dog/tomcat.keystore"
    keystorePass="123456" />

重启 Tomcat 服务,用浏览器访问 https://www.dog.com,这时浏览器可能会提示证书错误,忽略它(对于 Firefox 浏览器还需要点击 “添加例外” 按钮才能忽略)即可以看到已经是 https 方式在浏览网页了。

8、使用 APR 高性能连接器

APR 即 Apache Portable Runtime,提供了 Apache Http 的高性能特性,下面普通连接器、NIO和APR的特性简单比较(摘自这里):

                  Java Blocking Connector       Java Nio Blocking Connector       APR Connector
    Classname         Http11Protocol                  Http11NioProtocol         Http11AprProtocol
    Tomcat Version   3.x 4.x 5.x 6.x                       6.x                     5.5.x 6.x
    Support Polling         NO                             YES                        YES
    Polling Size           N/A                   Unlimited - Restricted by mem        Unlimited - Configurable
    Read HTTP Request     Blocking                     Non Blocking                   Blocking
    Read HTTP Body        Blocking                     Sim Blocking                   Blocking
    Write HTTP Response   Blocking                     Sim Blocking                   Blocking
    SSL Support           Java SSL                     Java SSL                       OpenSSL
    SSL Handshake         Blocking                     Non blocking                   Blocking
    Max Connections       maxThreads                   See polling size               See polling size

Tomcat 文档在 NIO 和 APR 之间比较推荐后者,由于我没有实际环境(即大量从 internet 过来的访问)详细测试和比较,所以我也不太清楚两者相差多少。下面介绍使用 APR 的方法:

先安装 APR for Tomcat 的本地库和 OpenSSL(假如需要使用 SSL 证书并且系统还没安装的话),Arch Linux 的 local 源里面已经存在这两者,所以安装方法很简单:

$ sudo pacman -S tomcat-native
$ sudo pacman -S openssl

然后修改 Tomcat 的主配置文件 server.xml,把 Connector 的 protocol 属性值修改为“org.apache.coyote.http11.Http11AprProtocol”,修改后的配置大致如下:

<Connector port="80" protocol="org.apache.coyote.http11.Http11AprProtocol"
           redirectPort="443" />

(注:保留 protocol=”HTTP/1.1″ 属性值也是可以的)

然后重启 Tomcat 服务即可,如何知道是否用上 APR 连接器呢?只要翻查 Tomcat 的日志文件就知道了,默认的日志文件为:/var/log/tomcat6/catalina.err:

$ sudo tail /var/log/tomcat6/catalina.err

如果在重启 Tomcat 服务后看到日志末尾处有出现下面红色字的内容,则表示已经成功用上 APR连接器了。

Feb 19, 2012 9:44:05 AM org.apache.coyote.http11.Http11AprProtocol start INFO: Starting Coyote HTTP/1.1 on http-80 Feb 19, 2012 9:44:05 AM org.apache.coyote.http11.Http11AprProtocol start INFO: Starting Coyote HTTP/1.1 on http-443 Feb 19, 2012 9:44:05 AM org.apache.catalina.startup.Catalina start INFO: Server startup in 1281 ms

如果你使用了 APR 连接器同时又需要添加 SSL 证书(即需要 https 访问功能),则需要使用 OpenSSL 的方法产生加密私钥并且修改一下相应的 Connector 的配置,仍然以上面第7节的例子,即为 www.dog.com 站点添加 SSL 证书来讲解。

先用 OpenSSL 产生私钥以及自签名,在自家目录下执行下面命令:

# Generate private key
$ openssl genrsa -out ca.key 1024 
 
# Generate CSR
$ openssl req -new -key ca.key -out ca.csr
 
# Generate Self Signed Key
$ openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

同上面第7节类似,中途也会要求你输入 DN 信息,完成后把 ca.crt 和 ca.key 文件复制到 dog 站点应用程序的根目录:

$ sudo cp ca.crt /var/lib/tomcat6/dog
$ sudo cp ca.key /var/lib/tomcat6/dog

然后修改 Connector 节点为如下:

<Connector port="443" SSLEnabled="true"
           scheme="https" secure="true"
           SSLCertificateFile="/var/lib/tomcat6/dog/ca.crt"
           SSLCertificateKeyFile="/var/lib/tomcat6/dog/ca.key"/>

重启 Tomcat 服务之后生效。

最后

此文简单讲述在 Arch Linux 环境下安装 Tomcat 6、修改主配置文件、搭建多站点、添加 SSL 证书以及使用高性能的 NIO 和 APR 连接器的方法和步骤。

posted on 2018-01-09 16:56  Zeroassetsor  阅读(1191)  评论(0编辑  收藏  举报