Tomcat详解,主要是配置方面,各项属性

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

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

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

<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 组成的四层结构,从里层向外层分别是:apache

  • Context: 即 Web 应用程序,一个 Context 即对于一个 Web 应用程序。
  • Host:即虚拟主机,好比 www.dog.com 对应一个虚拟主机,api.dog.com 对于另外一个虚拟主机。一个 Host 用于定义一个虚拟主机。(所谓的”一个虚拟主机”可简单理解为”一个网站”)
  • Engine:一组虚拟主机的集合。好比www.dog.com 和 api.dog.com 能够组成一组虚拟主机集合。
  • Service:一组 Engine 的集合,包括线程池 Executor 和链接器 Connector 的定义。

CONNECTOR 的配置

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

  • enableLookups:(default=true) 是否容许反向解析访客的IP地址,当你的应用程序使用 request.getRemoteHost() 时若是只须要IP地址,建议禁用此项,这样能节省反向域名解析的时间。
  • maxPostSize:(default=2097152 即2MB) 最大容许 POST 上传的数据大小(单位为:字节),对于通常网站来讲,好比有写评论写文章的网站,默认的2MB已经足够,不过若是网站带有图片甚至文件上传功能,则须要根据具体状况来定。
  • protocol:链接器的类型,tomcat 6 有以下几种选择
    • org.apache.coyote.http11.Http11Protocol:简写为 “HTTP/1.1″,这是默认的链接器,一个访客网络链接须要一个线程,并发性能比较低。
    • org.apache.coyote.http11.Http11NioProtocol:NIO链接器,一个由非阻塞的socket工做模式构成的链接器,并发性能良好,纯Java实现。
    • org.apache.coyote.http11.Http11AprProtocol:APR链接器,所谓 APR 就是网络上最多服务器使用的 Web 服务程序 Apache Http Server 所使用的库,Tomcat 建议在生产环境使用,具体方法下面会介绍。
  • redirectPort:当用户访问非https的资源而该资源又须要https方式访问时,tomcat会自动重定向到https端口,通常https使用 TCP 443端口,因此通常取值”443″。
  • SSLEnabled:(default=false),设置当前链接器是否使用安全SSL传输,若是设置为”true”,则应该同时设置下面两个属性: scheme=”https” (default=http) 能够设置为 http 或者 https。 secure=”true” (default=false)。
  • 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 共享一个线程池,则能够先定义一个线程池,如:tomcat

<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 配置节点各个属性的做用:网络

  • name:设置虚拟主机的域名,好比 localhost 表示本机名称,实际应用时应该填写具体域名,好比 www.dog.com 或者 dog.com,固然若是该虚拟主机是给内部人员访问的,也能够直接填写服务器的 ip 地址,好比 192.168.1.10。
  • autoDeploy:是否容许自动部署,默认值是 true,即表示 Tomcat 会自动检测 appBase 目录下面的文件变化从而自动应用到正在运行的 Web 应用程序。
  • unpackWARs:设置是否自动展开 war 压缩包再运行 Web 应用程序,默认值是 true。
  • 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。

五、多站点的配置:设置多个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 浏览这两个站点了。

六、使用 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 服务器便可。

七、为网站添加 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 方式在浏览网页了。

八、使用 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 六、修改主配置文件、搭建多站点、添加 SSL 证书以及使用高性能的 NIO 和 APR 链接器的方法和步骤。

相关文章
相关标签/搜索