标签:文件 span mime UI 多个 地址 count 字节 实验
由于 Tomcat 基于 Java,实际上在各种 Linux 发行版里的配置方法都大同小异,只是我看见在 Arch Linux 环境里搭建 Tomcat 的文章比较少,所以在 Arch Linux 实践一遍然后得出此文。此文假设你对 Tomcat 并不十分了解,主要笔墨将会在 Tomcat 的配置之上。
在 Arch Linux 的 extra 源里有 jdk7-openjdk 和 openjdk6,可以直接使用 pacman 安装,至于选用哪一个可以视具体情况而定。我安装的是 OpenJDK 7:
$ sudo pacman -S jdk7-openjdk
同样地,extra 源里已有 tomcat 版本5、6、7,可以根据具体情况而定,我这里安装的是tomcat 6。
$ sudo pacman -S tomcat6
默认情况 tomcat 6 安装路径为 /usr/share/tomcat6,这里罗列一下主要目录的作用(箭头表示目录链接的实际位置):
现在可以尝试启动 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 猫即说明服务已经安装妥当并且能正常运行了。
这个目录位于 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 应用程序都有如下的目录结构:
当然也不是所有都是必须的,你甚至可以创建一个目录,比如“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 文件并不是一定要解压出来才能运行的,这点将会在下一节的配置里会讲到。
这个文件位于 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 组成的四层结构,从里层向外层分别是:
一个 Connector 即一个对外界开放的端口,简单理解就是大部分网络服务程序都会遇到的 IpAddress:Port 的组合,比如 192.168.0.10:8080 就是一个端口,当然在 Connector 里可以定义的内容要丰富得多,即 Connector 这个 XML 节点里可以加上许多属性。下面列举一下常用的:
一个简单的 Connector 定义如下:
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="60000" redirectPort="443" />
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 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 6、修改主配置文件、搭建多站点、添加 SSL 证书以及使用高性能的 NIO 和 APR 连接器的方法和步骤。
标签:文件 span mime UI 多个 地址 count 字节 实验
原文地址:http://www.cnblogs.com/tdskee/p/7908307.html