这个文件位于 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
一个 Connector 即一个对外界开放的端口,简单理解就是大部分网络服务程序都会遇到的 IpAddress:Port 的组合,好比 192.168.0.10:8080 就是一个端口,固然在 Connector 里能够定义的内容要丰富得多,即 Connector 这个 XML 节点里能够加上许多属性。下面列举一下经常使用的:api
一个简单的 Connector 定义以下:浏览器
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="60000" redirectPort="443" />
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 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 配置节点各个属性的做用:网络
下面举例说明如何建立一个新的虚拟主机 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 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。
有时咱们须要在一台服务器上跑多个站点,经过 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 浏览这两个站点了。
默认的链接器并发性能不太好,若是网站的并发访问量不大则无所谓,或者在公司内部网这点可能体会不出来(由于在内部网可能每一个请求在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 服务器便可。
有时网站可能涉及重要的业务数据,在互联网上传输这些页面最好以 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 即 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 链接器的方法和步骤。