共计 32808 个字符,预计需要花费 83 分钟才能阅读完成。
下载安装 JDK(Tomcat 在启动前必须安装 JDK 及 Java 的运行与开发环境,因为 Tomcat 本身就是有 Java 编写的,JDK 中有 Java 的 API,JVM 等 Java 运行和开发的最小环境)
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
[root@node1 tool]# tar -zxf jdk-8u111-linux-x64.tar.gz -C /usr/local/java/
输出相关的环境变量
[root@node1 jdk1.8.0_111]# vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_111
export JRE_HOME=/usr/local/java/jdk1.8.0_111/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
source(读)以下这个文件
[root@node1 java]# source /etc/profile
可以看到 JDK1.8 已经安装
[root@node1 java]# java -version
java version “1.8.0_111”
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
下载安装 Tomcat
http://tomcat.apache.org/download-90.cgi
[root@node1 tool]# tar -zxf apache-tomcat-7.0.73.tar.gz -C /usr/local/
[root@node1 tool]# cd /usr/local/
drwxr-xr-x. 2 mysql mysql 4096 Sep 23 2011 src
[root@node1 local]# ln -sv apache-tomcat-7.0.73/ tomcat
[root@node1 local]# cd tomcat/
root@node1 tomcat]# ls bin/
bootstrap.jar commons-daemon-native.tar.gz digest.sh startup.battool-wrapper.s catalina.bat configtest.bat setclasspath.bat startup.sh version.bat
catalina.sh configtest.sh setclasspath.sh tomcat-juli.jar version.sh
# 里面全部是一些.sh 的脚本和.jar 的 Java 归档文件;Tomcat 就是 用 Java 写的所以启动时会调用一些 Java 库,.bat 为 Windows 的批处理脚本, 用于 windows 启动时调用,其中 catalina.sh 为核心脚本
[root@node1 tomcat]# ls conf
Catalina catalina.properties logging.properties tomcat-users.xml
catalina.policy context.xml server.xml web.xml
#其中 server.xml 为主配置文件;
#tomcat-users.xml 为用户认证文件,Tomcat 启动后会将这个文件读进内存中完成账号和密码的检测认证,所以这个文件的安全性很重要;#web.xml 为 Tomcat 默认的应用程序部署描述符,一个 web 应用程序所谓的部署就是将它放在 Tomcat 某一个 context 某一个 host 能够访问到的路 径下,及将 web 应用程序所依赖的类装载进 JVM 的过程;
#context.html 默认为上下文提供的配置文件
#catalina.pro[erties 用来定义应用程序自身属性的(启动 JVM 要定义许多属性),如所使用的内存大小,所使用的字符串缓冲池的大小,你的 server loader 加载器是什么,等等
#Catalina.policy 用来定义 Tomcat 自身的安全和资源授权策略,如定义通过互联网访问时,哪些资源用户可以访问哪些资源用户不能访问;哪些资源能被装载,哪些资源不能被装载等等
#logging.pro[erties 用来定义你的日志级别,日志文件的路径等等
一般来说如果你不定义服务器自身的属性的话,只需修改.xml 的文件
[root@node1 conf]# vim server.xml
<?xml version=’1.0′ encoding=’utf-8′?>
<Server port=”8005″ shutdown=”SHUTDOWN”>
#在 Telnet 的 8005 端口发一个 shutdown 就可以把 Tomcat 停掉,建议关掉(危险)
Listener className=”org.apache.catalina.startup.VersionLoggerListener” />
<!– Security listener. Documentation at /docs/config/listeners.html
<Listener className=”org.apache.catalina.security.SecurityListener” />
–>
<!–APR library loader. Documentation at /docs/apr.html –>
<Listener className=”org.apache.catalina.core.AprLifecycleListener” SSLEngine=”on” />
<!–Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html –>
<Listener className=”org.apache.catalina.core.JasperListener” />
<!– Prevent memory leaks due to use of particular java/javax APIs–>
<Listener className=”org.apache.catalina.core.JreMemoryLeakPreventionListener” />
<Listener className=”org.apache.catalina.mbeans.GlobalResourcesLifecycleListener” />
<Listener className=”org.apache.catalina.core.ThreadLocalLeakPreventionListener” />
#listener 为一大堆的侦听器,是程序员或者应用程序在调试时关闭或者启动某个容器时用的组件
<GlobalNamingResources>
<!– Editable user database that can also be used by
UserDatabaseRealm to authenticate users
–>
<Resource name=”UserDatabase” auth=”Container”
type=”org.apache.catalina.UserDatabase”
description=”User database that can be updated and saved”
factory=”org.apache.catalina.users.MemoryUserDatabaseFactory”
pathname=”conf/tomcat-users.xml” />
</GlobalNamingResources>
# 全局命名资源,这里定义了一个全局命名资源,用来实现用户的认证
<Service name=”Catalina”>
<Connector port=”8080″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />
<Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″ />
<Engine name=”Catalina” defaultHost=”localhost”>
#service 定义服务,这里定义的第一个服务就是 Catalina,这个服务中定义了一个连接器,其端口为 8080,所以他可以从 8080 端口接受用户的请求,其协议为 HTTP/1.1
# 而 Catalina 服务中的另一个连接器的端口为 8009,所以也可以从 8009 端口接受用户的请求,但其协议为 AJP/1.3(这是一种以二进制格式从前端 Apache 传输用户请求至 8009 端口的协议,比用 http 协议效率要高)
————————————– 分割线 ————————————–
更多 Tomcat 相关教程见以下内容:
CentOS 6.6 下安装配置 Tomcat 环境 http://www.linuxidc.com/Linux/2015-08/122234.htm
RedHat Linux 5.5 安装 JDK+Tomcat 并部署 Java 项目 http://www.linuxidc.com/Linux/2015-02/113528.htm
Tomcat 权威指南(第二版)(中英高清 PDF 版 + 带书签) http://www.linuxidc.com/Linux/2015-02/113062.htm
Tomcat 安全配置与性能优化 http://www.linuxidc.com/Linux/2015-02/113060.htm
Linux 下使用 Xshell 查看 Tomcat 实时日志中文乱码解决方案 http://www.linuxidc.com/Linux/2015-01/112395.htm
CentOS 64-bit 下安装 JDK 和 Tomcat 并设置 Tomcat 开机启动操作步骤 http://www.linuxidc.com/Linux/2015-01/111485.htm
CentOS 6.5 下安装 Tomcat http://www.linuxidc.com/Linux/2015-01/111415.htm
Tomcat 中 session 的管理机制 http://www.linuxidc.com/Linux/2016-09/135072.htm
————————————– 分割线 ————————————–
<Engine name=”Catalina” defaultHost=”localhost”>
# 定义了一个叫做 Catalina 的引擎,其默认主机为本机
<Realm className=”org.apache.catalina.realm.LockOutRealm”>
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>
</Realm>
<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”>
# 定义了一个 Realm(领域)用于用户的认证和授权,但默认为允许所有用户访问
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log.” suffix=”.txt”
pattern=”%h %l %u %t "%r" %s %b” />
# 定义了有个 Value(阀门),用来记录客户端请求、客户端 IP 地址和服务器等信息,说明日志放在 logs 目录下(安装目录),其中每个日志都以 localhost_access_log. 开头中间为日期,以.txt 结尾,pattern 定义了日志的格式
</Host>
</Engine>
</Service>
</Server>
输出环境变量,明确说明 Catalina���什么位置(即 Tomcat 实例运行所在的目录),用来定义你的 Catalina 工作的路径。需要注意的是在同一个物理服务器上可以同时启用多个 Tomcat 实例(但需要使用不同的端口)
[root@node1 tomcat]# vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
source(读)一下这个文件
[root@node1 tomcat]# . /etc/profile.d/tomcat.sh
测试一下,为 Catalina 传递一个参数 version,其实就是执行了 /usr/locar/tomcat/bin/version.sh 脚本
[root@node1 tomcat]# catalina.sh version
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java/jdk1.8.0_111/jre #你安装的 jre 目录(jdk 装后生成的)
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.73
Server built: Nov 7 2016 21:27:23 UTC
Server number: 7.0.73.0
OS Name: Linux
OS Version: 2.6.32-573.el6.x86_64 #Linux 内核版本
Architecture: amd64
JVM Version: 1.8.0_111-b14 #JVM 的版本
JVM Vendor: Oracle Corporation
启动 Tomcat
[root@node1 tomcat]# catalina.sh start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java/jdk1.8.0_111/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@node1 tomcat]# jps
2118 Jps
1927 Bootstrap
其中 8080 端口为 http,8009 为 ajp
[root@node1 ~]# netstat -tnlp |grep java
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1927/java
tcp 0 0 :::8009 :::* LISTEN 1927/java
tcp 0 0 :::8080 :::* LISTEN 1927/java
tomcat 的库文件,有一大堆的 jar 文件。如 jasper.jar、servlet-api.jar、jsp-api.jar 等。是 Tomcat 实现许多重要功能必须依赖的类库
[root@node1 tomcat]# ls lib/
annotations-api.jar ecj-4.4.2.jar servlet-api.jar tomcat-i18n-es.jar
catalina-ant.jar el-api.jar tomcat7-websocket.jar tomcat-i18n-fr.jar
catalina-ha.jar jasper-el.jar tomcat-api.jar tomcat-i18n-ja.jar
catalina.jar jasper.jar tomcat-coyote.jar tomcat-jdbc.jar
catalina-tribes.jar jsp-api.jar tomcat-dbcp.jar tomcat-util.jar
[root@node1 tomcat]# ll logs/
1 23:32 catalina.2017-01-01.log
2 11:16 catalina.out #启动时 Catalina 自己输出的日志
1 23:25 host-manager.2017-01-01.log #主机管理日志
1 23:32 localhost.2017-01-01.log #主机的日志文件
1 23:25 localhost_access_log.2017-01-01.txt #主机的访问日志文件
2 11:15 localhost_access_log.2017-01-02.txt #一般日志每天滚动一次
1 23:25 manager.2017-01-01.log
[root@node1 tomcat]# ll
1 23:23 temp #临时文件的目录
2 11:54 webapps #应用程序目录如:docs、examples、ROOT 等
1 23:25 work #工作目录,在这个目录下每一个 Engine 都有自己的独立目录;而在 Engine 下,#每一个 Host 也有自己的独立目录,而在 Host 下每一个应用程序也有自己的独立 #目录
[root@node1 tomcat]# ls work/
Catalina #Engine
[root@node1 tomcat]# ls work/Catalina/
localhost #Host
[root@node1 tomcat]# ls work/Catalina/localhost/
_ docs examples host-manager manager #应用程序
[root@node1 tomcat]# cd work/Catalina/localhost/
[root@node1 localhost]# cd _
[root@node1 _]# ll #可以看到什么都没有
total 0
浏览器访问一下 192.168.139.2:8080
对应 /usr/local/apache-tomcat-7.0.73/webapps/ROOT/ 目录下的应用程序,如图
[root@node1 _]# ll
total 4
drwxr-xr-x. 3 root root 4096 Jan 2 13:29 org
# 多了一个 org 文件。。可以看到你访问了一个应用程序后,会将 index.jsp 在这里转换为 index_jsp.java 再转换为 index_jsp.class。所以第一个用户访问 JSP 资源时会很慢,但第二个用户来访问相同资源时(只要资源未修改),会直接使用编译好的.class,所以第二个用户访问会比第一个快的多,这也是 JSP 编译的页面访问快的原因,只要你的资源未修改 JSP 就是快
[root@node1 _]# ls org/apache/jsp/
index_jsp.class index_jsp.java
# 可以看到有一堆的静态页面(.png 图片)只有主页 index.jsp 为动态的
[root@node1 tomcat]# ls webapps/ROOT/
asf-logo.png bg-middle.png bg-upper.png index.jsp tomcat.gif tomcat.svg
asf-logo-wide.gif bg-nav-item.png build.xml RELEASE-NOTES.txt tomcat.png
bg-button.png bg-nav.png favicon.ico tomcat.css
WEB-INF
注:需要注意的是每个应用程序都有 WEB-INF 路径,有时还有 META-INF 文件,这两个路径下用来放私有资源,是用户通过 Web 访问 URL 不能访问到的,除了这两个路径下的资源都可以用 web 访问 URL 访问到
为 Tomcat 提供 init 脚本
[root@node1 java]# vim /etc/rc.d/init.d/tomcat
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
export JAVA_OPTS=’-Xms64m -Xmx128m’ # 定义启动时堆内存最小 64M, 最大 128M
JAVA_HOME=/usr/local/java/jdk1.8.0_111 #Java 的路径
CATALINA_HOME=/usr/local/apache-tomcat-7.0.73 #Tomcat 的路径
export JAVA_HOME CATALINA_HOME #将 Java 和 tomcat 的路径输出为环境变量
exec $CATALINA_HOME/bin/catalina.sh $* #执行这个脚本
[root@node1 java]# chkconfig –add tomcat #加执行权限
[root@node1 java]# chkconfig –list tomcat #加入系统服务列表
tomcat 0:off1:off2:on3:on4:on5:on6:off
[root@node1 java]# service tomcat stop
Using CATALINA_BASE: /usr/local/apache-tomcat-7.0.73
Using CATALINA_HOME: /usr/local/apache-tomcat-7.0.73
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.73/temp
Using JRE_HOME: /usr/local/java/jdk1.8.0_111
Using CLASSPATH: /usr/local/apache-tomcat-7.0.73/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.73/bin/tomcat-juli.jar
[root@node1 java]# service tomcat start
Using CATALINA_BASE: /usr/local/apache-tomcat-7.0.73
Using CATALINA_HOME: /usr/local/apache-tomcat-7.0.73
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.73/temp
Using JRE_HOME: /usr/local/java/jdk1.8.0_111
Using CLASSPATH: /usr/local/apache-tomcat-7.0.73/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.73/bin/tomcat-juli.jar
Tomcat started.
注:这个脚本不支持 restart,但还支持以下许多参数(就是执行了 catalina.sh 脚本)
[root@node1 java]# service tomcat -help
debug Start Catalina in a debugger
debug -security Debug Catalina with a security manager
jpda start Start Catalina under JPDA debugger
run Start Catalina in the current window
run -security Start in the current window with security manager
start Start Catalina in a separate window
start -security Start in a separate window with security manager
stop Stop Catalina, waiting up to 5 seconds for the process to end
stop n Stop Catalina, waiting up to n seconds for the process to end
stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running
stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running
configtest Run a basic syntax check on server.xml – check exit code for result
version What version of tomcat are you running?
下一篇中将详细介绍 Tomcat 的核心配置文件 server.xml 中各个组件的配置
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-02/140688p2.htm
server.xml 文件时 Tomcat 的核心配置文件,包括 Service,Engine,Realm,Value,Host 等组件的相关配置信息。
[root@node1 local]# vim tomcat/conf/server.xml
<?xml version=’1.0′ encoding=’utf-8′?>
<Server port=”8005″ shutdown=”SHUTDOWN”>
<Listener className=”org.apache.catalina.startup.VersionLoggerListener” />
<Listener className=”org.apache.catalina.core.AprLifecycleListener” SSLEngine=”on” />
<Listener className=”org.apache.catalina.core.JasperListener” />
<Listener className=”org.apache.catalina.core.JreMemoryLeakPreventionListener” />
<Listener className=”org.apache.catalina.mbeans.GlobalResourcesLifecycleListener” />
<Listener className=”org.apache.catalina.core.ThreadLocalLeakPreventionListener” />
<GlobalNamingResources>
<Resource name=”UserDatabase” auth=”Container”
type=”org.apache.catalina.UserDatabase”
description=”User database that can be updated and saved”
factory=”org.apache.catalina.users.MemoryUserDatabaseFactory”
pathname=”conf/tomcat-users.xml” />
</GlobalNamingResources>
<Service name=”Catalina”>
<Connector port=”8080″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />
<Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″ />
<Engine name=”Catalina” defaultHost=”localhost”>
<Realm className=”org.apache.catalina.realm.LockOutRealm”>
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>
</Realm>
<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”>
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log.” suffix=”.txt”
pattern=”%h %l %u %t "%r" %s %b” />
</Host>
</Engine>
</Service>
</Server>
server.xml 文件中可定义的元素非常多,包括 Server, Service, Connector, Engine, Cluster, Host, Alias, Context, Realm, Valve, Manager, Listener, Resources, Resource, ResourceEnvRef, ResourceLink, WatchedResource, GlobalNameingResources, Store,Transaction, Channel, Membership, Transport, Member, ClusterListener 等。
下面将一个个详细介绍各个组件
1、Server 组件
如上面示例文件中定义的:
<Server port=”8005”shutdown=”SHUTDOWN”>
这会让 Tomcat 启动一个 server 实例(Tomcat 实例),通常一个 JVM 只能包含一个 Tomcat 实例;因此,一台物理服务器上可以在启动多个 JVM 的情况下在每一个 JVM 中启动一个 Tomcat 实例,每个实例分属于一个独立的管理端口,这是一个顶级组件。
如上面示例中,Tomcat 实例监听在 8005 端口以接收 shutdown 命令,各 Server 的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个 Server 实例,必须配置它们使用不同的端口。这个端口的定义用于为管理员提供一个关闭此实例的便捷途径,管理员用 telnet 连接到 8005 端口执行 shutdown 就可以把 Tomcat 关掉,为了安全建议不启用
Server 的相关属性:
className: 用于实现此 Server 容器的完全限定类的名称,默认为 org.apache.catalina.core.StandardServer;
port: 接收 shutdown 指令的端口,默认仅允许通过本机访问,默认为 8005;
shutdown:发往此 Server 用于实现关闭 tomcat 实例的命令字符串,默认为 SHUTDOWN;
2、Service 组件:
Service 主要用于关联一个引擎和与此引擎相关的连接器,每个连接器通过一个特定的端口和协议(http/ajp)接收入站请求将其转发至关联的引擎进行处理。困此,Service 要包含一个引擎(也只能包 含一个引擎)、及一个或多个连接器。
如上面示例中的定义:
<Service name=”Catalina”>
这定义了一个名为 Catalina 的 Service,此名字也会在产生相关的日志信息时记录在日志文件当中。
Service 相关的属性:
className:用于实现 service 的类名,一般默认都是 org.apache.catalina.core.StandardService。
name:此服务的名称,默认为 Catalina;
3、Connector(连接器)组件:
进入 Tomcat 的请求可以根据 Tomcat 的工作模式分为如下两类:
(1)Tomcat 作为应用程序服务器:请求来自于前端的 web 服务器转发,这可能是 Apache, IIS, Nginx 等;
(2)Tomcat 作为独立服务器:请求直接来自于 client 的 web 浏览器;
Tomcat 应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个引擎可以有一个或多个连接器,以适应多种请求方式。
定义连接器可以使用多种属性,有些属性也只适用于某特定的连接器类型。一般说来,常见于 server.xml 中的连接器类型通常有 4 种:
1) HTTP 连接器
2) SSL 连接器
3) AJP 1.3 连接器
4) proxy 连接器
如上面示例 server.xml 中定义的 HTTP 连接器:
<Connector port=”8080″ protocol=”HTTP/1.1″
maxThreads=”150″ connectionTimeout=”20000″
redirectPort=”8443″/>
定义连接器时可以配置的属性非常多,但通常定义 HTTP 连接器时必须定义的属性只有“port”,定义 AJP 连接器时必须定义的属性只有 ”protocol”,因为默认的协议为 HTTP。以下为常用属性的说明:
1) address:指定连接器监听的地址,默认为所有地址,即 0.0.0.0;
2) maxThreads:支持的最大并发连接数,默认为 200;
3) port:监听的端口,默认为 0;
4) protocol:连接器使用的协议,默认为 HTTP/1.1,定义 AJP 协议时通常为 AJP/1.3;
5) redirectPort:如果某连接器支持的协议是 HTTP,当接收客户端发来的 HTTPS 请求时,则转发至此属 性定义的端口;
6) connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为 60000,即 1 分钟;
7) enableLookups:是否通过 request.getRemoteHost()进行 DNS 查询以获取客户端的主机名;默认为 true(可以 false 掉);
8) acceptCount:设置等待队列的最大长度;通常在 tomcat 所有处理线程均处于繁忙状态时,新发来的 请求将被放置于等待队列中;
下面是一个定义了多个属性的 SSL 连接器:
<Connector port=”8443″
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” acceptCount=”100″ debug=”0″ scheme=”https” secure=”true”
clientAuth=”false” sslProtocol=”TLS” />
4、Engine 组件:
Engine 是 Servlet 处理器的一个实例,即 servlet 引擎,默认为定义在 server.xml 中的 Catalina。Engine 需要 defaultHost 属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的 host 组件(因为一个 Engine 中可以有多个虚拟主机,当用户请求了一个不存在的主机时, 这时一般要为引擎指定一个默认的虚拟主机;每一个虚拟主机都可以是一个独立的网站)。
如前面示例中定义的:
<Engine name=”Catalina” defaultHost=”localhost”>
常用的属性定义:
defaultHost:Tomcat 支持基于 FQDN(Fully Qualified Domain Name 完全合格域名 / 全称域名)的虚拟主 机,这些虚拟主机可以通过在 Engine 中定义多个不同的 Host 组件来实现;但如果此引擎的 连接器收到一个发往非明确定义虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此,在 Engine 中定义的多个虚拟主机的主机名称中,至少要有一个虚拟主机的主机名称跟 defaultHost 定义的主机名称同名;
name:Engine 组件的名称,用于日志和错误信息记录时区别不同的引擎;
Engine 容器中可以包含 Realm、Host、Listener 和 Valve 子容器。
5、Host 组件:
位于 Engine 容器中用于接收和处理请求,如前面示例中的定义:
<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
</Host>
常用属性说明:
1) appBase:此 Host 的 webapps 目录,即存放非归档的 web 应用程序的目录或归档后的 WAR 文件的目录路 径;可以使用基于 $CATALINA_HOME 的相对路径;
2) autoDeploy:在 Tomcat 处于运行状态时放置于 appBase 目录中的应用程序文件是否自动进行 deploy;默认为 true;
3) unpackWars:在启用此 webapps 时是否对 WAR 格式的归档文件先进行展开;默认为 true;
虚拟主机定义示例:
<Engine name=”Catalina” defaultHost=”localhost”>
<Host name=”localhost” appBase=”webapps”>
<Context path=”” docBase=”ROOT”/>
<Context path=”/bbs” docBase=”/web/bss”
reloadable=”true” crossContext=”true”/>
</Host>
<Host name=”mail.zxl.com” appBase=”/web/mail”>
<Context path=”” docBase=”ROOT”/>
</Host>
</Engine>
主机别名定义:
如果一个主机有两个或两个以上的主机名,额外的名称均可以以别名的形式进行定义,如下:
<Host name=”www.zxl.com” appBase=”webapps” unpackWARs=”true”>
<Alias>zxl.com</Alias>
</Host>
6、Context(上下文)组件:
Context 在某些意义上类似于 apache 中的路径别名,一个 Context 定义用于标识 tomcat 实例中的一个 Web 应用程序。
如下面的定义:
<!– Tomcat Root Context –>
<Context path=”” docBase=”/web/webapps”/>
<!– buzzin webapp –>
<Context path=”/bbs”
docBase=”/web/threads/bbs”
reloadable=”true”>
</Context>
<!– chat server –>
<Context path=”/chat” docBase=”/web/chat”/>
<!– darian web –>
<Context path=”/darian” docBase=”darian”/>
在 Tomcat 中,每一个 context 定义也可以使用一个单独的 XML 文件进行,其文件的目录为 $CATALINA_HOME/conf/<engine name>/<host name>。可以用于 Context 中的 XML 元素有 Loader,Manager,Realm,Resources 和 WatchedResource。
常用的属性定义有:
1) docBase:相应的 Web 应用程序的存放位置;也可以使用相对路径,起始路径为此 Context 所属 Host 中 appBase 定义的路径;切记,docBase 的路径名不能与相应的 Host 中 appBase 中定义的路径名有包含关系,比如,如果 appBase 为 deploy,而 docBase 绝不能为 deploy-bbs 类的名字;
2) path:相对于 Web 服务器根路径而言的 URI;如果为空“”,则表示为此 webapp 的根路径;如果 context 定义在一个单独的 xml 文件中,此属性不需要定义;
3) reloadable:是否允许重新加载此 context 相关的 Web 应用程序的类;默认为 false;
7、Realm 组件:
用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过 Realm 来实现;一个 Realm 表示一个安全上下文,它是一个授权访问某个给定 Context 的用户列表和某用户所允许切换的角色相关定义的列表。因此,Realm 就像是一个用户和组相关的数据库。
定义 Realm 时惟一必须要提供的属性是 classname,它是 Realm 的多个不同实现,用于表示此 Realm 认证的用户及角色等认证信息的存放位置。
JAASRealm:基于 Java Authintication and Authorization Service 实现用户认证;
JDBCRealm:通过 JDBC 访问某关系型数据库表实现用户认证;
JNDIRealm:基于 JNDI 使用目录服务实现认证信息的获取;
MemoryRealm:查找 tomcat-user.xml 文件实现用户信息的获取;
UserDatabaseRealm:基于 UserDatabase 文件 (通常是 tomcat-user.xml) 实现用户认证,它实现是一个完全可更新和持久有效的 MemoryRealm,因此能够跟标准的 MemoryRealm 兼容;它通过 JNDI 实现;
下面是一个常见的使用 UserDatabase 的配置:
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>
下面是一个使用 JDBC 方式获取用户认证信息的配置:
<Realm className=”org.apache.catalina.realm.JDBCRealm” debug=”99″
driverName=”org.gjt.mm.mysql.Driver”
connectionURL=”jdbc:mysql://localhost/authority”
connectionName=”test” connectionPassword=”test”
userTable=”users” userNameCol=”user_name”
userCredCol=”user_pass”
userRoleTable=”user_roles” roleNameCol=”role_name” />
8、Valve 组件:
Valve 常被用来记录客户端请求、客户端 IP 地址和服务器等信息,Valve 类似于过滤器,它可以工作于 Engine 和 Host/Context 之间、Host 和 Context 之间以及 Context 和 Web 应用程序的某资源之间。
一个容器内可以建立多个 Valve,而且 Valve 定义的次序也决定了它们生效的次序。Tomcat 中实现了多种不同的 Valve:
AccessLogValve:访问日志 Valve
ExtendedAccessValve:扩展功能的访问日志 Valve
JDBCAccessLogValve:通过 JDBC 将访问日志信息发送到数据库中;
RequestDumperValve:请求转储 Valve;
RemoteAddrValve:基于远程地址的访问控制;
RemoteHostValve:基于远程主机名称的访问控制;
SemaphoreValve:用于控制 Tomcat 主机上任何容器上的并发访问数量;
JvmRouteBinderValve:在配置多个 Tomcat 并以 Apache 通过 mod_proxy 或 mod_jk 作为前端的集群架构中,当期望停止某节点时,可以通过此 Valve 将用求请求定向至备用节点;使用此 Valve,必须使用 JvmRouteSessionIDBinderListener;
ReplicationValve:专用于 Tomcat 集群架构中,可以在某个请求的 session 信息发生更改时触发 session 数据在各节点间进行复制;
SingleSignOn:将两个或多个需要对用户进行认证 webapp 在认证用户时连接在一起,即一次认证即可访问所有连接在一起的 webapp;
ClusterSingleSingOn:对 SingleSignOn 的扩展,专用于 Tomcat 集群当中,需要结合 ClusterSingleSignOnListener 进行工作;
RemoteHostValve 和 RemoteAddrValve 可以分别用来实现基于主机名称和基于 IP 地址的访问控制,控制本身可以通过 allow 或 deny 来进行定义,这有点类似于 Apache 的访问控制功能;如下面的 Valve 则实现了仅允许本机访问 /probe:
<Context path=”/probe” docBase=”probe”>
<Valve className=”org.apache.catalina.valves.RemoteAddrValve”
allow=”127\.0\.0\.1″/>
</Context>
其中相关属性定义有:
1) className:相关的 java 实现的类名,相应于分别应该为 org.apache.catalina.valves.RemoteHostValve 或 org.apache.catalina.valves.RemoteAddrValve;
2) allow:以逗号分开的允许访问的 IP 地址列表,支持正则表达式,因此,点号“.”用于 IP 地址时需要转义;仅定义 allow 项时,非明确 allow 的地址均被 deny;
3) deny: 以逗号分开的禁止访问的 IP 地址列表,支持正则表达式;使用方式同 allow;
9、GlobalNamingResources
应用于整个服务器的 JNDI 映射,此可以避免每个 Web 应用程序都需要在各自的 web.xml 创建,这在 web 应用程序以 WAR 的形式存在时尤为有用。它通常可以包含三个子元素:
1) Environment;
2) Resource;
3) ResourceEnvRef;
下面是一些不常用的元素定义
10、WatchedResource
WatchedResource 可以用于 Context 中监视指定的 webapp 程序文件的改变,并且能够在监视到文件内容发生改变时重新装载此文件。
11、Listener
Listener 用于创建和配置 LifecycleListener 对象,而 LifecycleListener 通常被开发人员用来创建和删除容器。
12、Loader
Java 的动态装载功能是其语言功能强大表现之一,Servlet 容器使用此功能在运行时动态装载 servlet 和它们所依赖的类。Loader 可以用于 Context 中控制 java 类的加载。
13、Manager
Manger 对象用于实现 HTTP 会话管理的功能,Tomcat6 中有 5 种 Manger 的实现:
1) StandardManager
Tomcat6 的默认会话管理器,用于非集群环境中对单个处于运行状态的 Tomcat 实例会话进行管理。当 Tomcat 关闭时,这些会话相关的数据会被写入磁盘上的一个名叫 SESSION.ser 的文件,并在 Tomcat 下次启动时读取此文件。
2) PersistentManager
当一个会话长时间处于空闲状态时会被写入到 swap 会话对象,这对于内存资源比较吃紧的应用环境来说比较有用。
3)DeltaManager
用于 Tomcat 集群的会话管理器,它通过将改变了会话数据同步给集群中的其它节点实现会话复制。这种实现会将所有会话的改变同步给集群中的每一个节点,也是在集群环境中用得最多的一种实现方式。
4) BackupManager
用于 Tomcat 集群的会话管理器,与 DeltaManager 不同的是,某节点会话的改变只会同步给集群中的另一个而非所有节点。
5)SimpleTcpReplicationManager
Tomcat4 时用到的版本,过于老旧了。
14、Stores
PersistentManager 必须包含一个 Store 元素以指定将会话数据存储至何处。这通常有两种实现方式:FileStore 和 JDBCStore。
15、Resources
经常用于实现在 Context 中指定需要装载的但不在 Tomcat 本地磁盘上的应用资源,如 Java 类,HTML 页面,JSP 文件等。
16、Cluster
专用于配置 Tomcat 集群的元素,可用于 Engine 和 Host 容器中。在用于 Engine 容器中时,Engine 中的所有 Host 均支持集群功能。在 Cluster 元素中,需要直接定义一个 Manager 元素,这个 Manager 元素有一个其值为 org.apache.catalina.ha.session.DeltaManager 或 org.apache.catalina.ha.session.BackupManager 的 className 属性。同时,Cluster 中还需要分别定义一个 Channel 和 ClusterListener 元素。
(1)Channel
用于 Cluster 中给集群中同一组中的节点定义通信“信道”。Channel 中需要至少定义 Membership、Receiver 和 Sender 三个元素,此外还有一个可选元素 Interceptor。
(2)Membership
用于 Channel 中配置同一通信信道上节点集群组中的成员情况,即监控加入当前集群组中的节点并在各节点间传递心跳信息,而且可以在接收不到某成员的心跳信息时将其从集群节点中移除。Tomcat6 中 Membership 的实现是 org.apache.catalina.tribes.membership.McastService。
(3)Sender
用于 Channel 中配置“复制信息”的发送器,实现发送需要同步给其它节点的数据至集群中的其它节点。发送器不需要属性的定义,但可以在其内部定义一个 Transport 元素。
(4)Transport
用于 Sender 内部,配置数据如何发送至集群中的其它节点。Tomcat6 有两种 Transport 的实现:
1. PooledMultiSender
基于 Java 阻塞式 IO,可以将一次将多个信息并发发送至其它节点,但一次只能传送给一个节点。
2. PooledParallelSener
基于 Java 非阻塞式 IO,即 NIO,可以一次发送多个信息至一个或多个节点。
(5)Receiver
用于 Channel 定义某节点如何从其它节点的 Sender 接收复制数据,Tomcat6 中实现的接收方式有两种 BioReceiver 和 NioReceiver。
Tomcat 的详细介绍:请点这里
Tomcat 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-02/140688.htm
下载安装 JDK(Tomcat 在启动前必须安装 JDK 及 Java 的运行与开发环境,因为 Tomcat 本身就是有 Java 编写的,JDK 中有 Java 的 API,JVM 等 Java 运行和开发的最小环境)
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
[root@node1 tool]# tar -zxf jdk-8u111-linux-x64.tar.gz -C /usr/local/java/
输出相关的环境变量
[root@node1 jdk1.8.0_111]# vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_111
export JRE_HOME=/usr/local/java/jdk1.8.0_111/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
source(读)以下这个文件
[root@node1 java]# source /etc/profile
可以看到 JDK1.8 已经安装
[root@node1 java]# java -version
java version “1.8.0_111”
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
下载安装 Tomcat
http://tomcat.apache.org/download-90.cgi
[root@node1 tool]# tar -zxf apache-tomcat-7.0.73.tar.gz -C /usr/local/
[root@node1 tool]# cd /usr/local/
drwxr-xr-x. 2 mysql mysql 4096 Sep 23 2011 src
[root@node1 local]# ln -sv apache-tomcat-7.0.73/ tomcat
[root@node1 local]# cd tomcat/
root@node1 tomcat]# ls bin/
bootstrap.jar commons-daemon-native.tar.gz digest.sh startup.battool-wrapper.s catalina.bat configtest.bat setclasspath.bat startup.sh version.bat
catalina.sh configtest.sh setclasspath.sh tomcat-juli.jar version.sh
# 里面全部是一些.sh 的脚本和.jar 的 Java 归档文件;Tomcat 就是 用 Java 写的所以启动时会调用一些 Java 库,.bat 为 Windows 的批处理脚本, 用于 windows 启动时调用,其中 catalina.sh 为核心脚本
[root@node1 tomcat]# ls conf
Catalina catalina.properties logging.properties tomcat-users.xml
catalina.policy context.xml server.xml web.xml
#其中 server.xml 为主配置文件;
#tomcat-users.xml 为用户认证文件,Tomcat 启动后会将这个文件读进内存中完成账号和密码的检测认证,所以这个文件的安全性很重要;#web.xml 为 Tomcat 默认的应用程序部署描述符,一个 web 应用程序所谓的部署就是将它放在 Tomcat 某一个 context 某一个 host 能够访问到的路 径下,及将 web 应用程序所依赖的类装载进 JVM 的过程;
#context.html 默认为上下文提供的配置文件
#catalina.pro[erties 用来定义应用程序自身属性的(启动 JVM 要定义许多属性),如所使用的内存大小,所使用的字符串缓冲池的大小,你的 server loader 加载器是什么,等等
#Catalina.policy 用来定义 Tomcat 自身的安全和资源授权策略,如定义通过互联网访问时,哪些资源用户可以访问哪些资源用户不能访问;哪些资源能被装载,哪些资源不能被装载等等
#logging.pro[erties 用来定义你的日志级别,日志文件的路径等等
一般来说如果你不定义服务器自身的属性的话,只需修改.xml 的文件
[root@node1 conf]# vim server.xml
<?xml version=’1.0′ encoding=’utf-8′?>
<Server port=”8005″ shutdown=”SHUTDOWN”>
#在 Telnet 的 8005 端口发一个 shutdown 就可以把 Tomcat 停掉,建议关掉(危险)
Listener className=”org.apache.catalina.startup.VersionLoggerListener” />
<!– Security listener. Documentation at /docs/config/listeners.html
<Listener className=”org.apache.catalina.security.SecurityListener” />
–>
<!–APR library loader. Documentation at /docs/apr.html –>
<Listener className=”org.apache.catalina.core.AprLifecycleListener” SSLEngine=”on” />
<!–Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html –>
<Listener className=”org.apache.catalina.core.JasperListener” />
<!– Prevent memory leaks due to use of particular java/javax APIs–>
<Listener className=”org.apache.catalina.core.JreMemoryLeakPreventionListener” />
<Listener className=”org.apache.catalina.mbeans.GlobalResourcesLifecycleListener” />
<Listener className=”org.apache.catalina.core.ThreadLocalLeakPreventionListener” />
#listener 为一大堆的侦听器,是程序员或者应用程序在调试时关闭或者启动某个容器时用的组件
<GlobalNamingResources>
<!– Editable user database that can also be used by
UserDatabaseRealm to authenticate users
–>
<Resource name=”UserDatabase” auth=”Container”
type=”org.apache.catalina.UserDatabase”
description=”User database that can be updated and saved”
factory=”org.apache.catalina.users.MemoryUserDatabaseFactory”
pathname=”conf/tomcat-users.xml” />
</GlobalNamingResources>
# 全局命名资源,这里定义了一个全局命名资源,用来实现用户的认证
<Service name=”Catalina”>
<Connector port=”8080″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />
<Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″ />
<Engine name=”Catalina” defaultHost=”localhost”>
#service 定义服务,这里定义的第一个服务就是 Catalina,这个服务中定义了一个连接器,其端口为 8080,所以他可以从 8080 端口接受用户的请求,其协议为 HTTP/1.1
# 而 Catalina 服务中的另一个连接器的端口为 8009,所以也可以从 8009 端口接受用户的请求,但其协议为 AJP/1.3(这是一种以二进制格式从前端 Apache 传输用户请求至 8009 端口的协议,比用 http 协议效率要高)
————————————– 分割线 ————————————–
更多 Tomcat 相关教程见以下内容:
CentOS 6.6 下安装配置 Tomcat 环境 http://www.linuxidc.com/Linux/2015-08/122234.htm
RedHat Linux 5.5 安装 JDK+Tomcat 并部署 Java 项目 http://www.linuxidc.com/Linux/2015-02/113528.htm
Tomcat 权威指南(第二版)(中英高清 PDF 版 + 带书签) http://www.linuxidc.com/Linux/2015-02/113062.htm
Tomcat 安全配置与性能优化 http://www.linuxidc.com/Linux/2015-02/113060.htm
Linux 下使用 Xshell 查看 Tomcat 实时日志中文乱码解决方案 http://www.linuxidc.com/Linux/2015-01/112395.htm
CentOS 64-bit 下安装 JDK 和 Tomcat 并设置 Tomcat 开机启动操作步骤 http://www.linuxidc.com/Linux/2015-01/111485.htm
CentOS 6.5 下安装 Tomcat http://www.linuxidc.com/Linux/2015-01/111415.htm
Tomcat 中 session 的管理机制 http://www.linuxidc.com/Linux/2016-09/135072.htm
————————————– 分割线 ————————————–
<Engine name=”Catalina” defaultHost=”localhost”>
# 定义了一个叫做 Catalina 的引擎,其默认主机为本机
<Realm className=”org.apache.catalina.realm.LockOutRealm”>
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>
</Realm>
<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”>
# 定义了一个 Realm(领域)用于用户的认证和授权,但默认为允许所有用户访问
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log.” suffix=”.txt”
pattern=”%h %l %u %t "%r" %s %b” />
# 定义了有个 Value(阀门),用来记录客户端请求、客户端 IP 地址和服务器等信息,说明日志放在 logs 目录下(安装目录),其中每个日志都以 localhost_access_log. 开头中间为日期,以.txt 结尾,pattern 定义了日志的格式
</Host>
</Engine>
</Service>
</Server>
输出环境变量,明确说明 Catalina���什么位置(即 Tomcat 实例运行所在的目录),用来定义你的 Catalina 工作的路径。需要注意的是在同一个物理服务器上可以同时启用多个 Tomcat 实例(但需要使用不同的端口)
[root@node1 tomcat]# vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
source(读)一下这个文件
[root@node1 tomcat]# . /etc/profile.d/tomcat.sh
测试一下,为 Catalina 传递一个参数 version,其实就是执行了 /usr/locar/tomcat/bin/version.sh 脚本
[root@node1 tomcat]# catalina.sh version
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java/jdk1.8.0_111/jre #你安装的 jre 目录(jdk 装后生成的)
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.73
Server built: Nov 7 2016 21:27:23 UTC
Server number: 7.0.73.0
OS Name: Linux
OS Version: 2.6.32-573.el6.x86_64 #Linux 内核版本
Architecture: amd64
JVM Version: 1.8.0_111-b14 #JVM 的版本
JVM Vendor: Oracle Corporation
启动 Tomcat
[root@node1 tomcat]# catalina.sh start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java/jdk1.8.0_111/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@node1 tomcat]# jps
2118 Jps
1927 Bootstrap
其中 8080 端口为 http,8009 为 ajp
[root@node1 ~]# netstat -tnlp |grep java
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1927/java
tcp 0 0 :::8009 :::* LISTEN 1927/java
tcp 0 0 :::8080 :::* LISTEN 1927/java
tomcat 的库文件,有一大堆的 jar 文件。如 jasper.jar、servlet-api.jar、jsp-api.jar 等。是 Tomcat 实现许多重要功能必须依赖的类库
[root@node1 tomcat]# ls lib/
annotations-api.jar ecj-4.4.2.jar servlet-api.jar tomcat-i18n-es.jar
catalina-ant.jar el-api.jar tomcat7-websocket.jar tomcat-i18n-fr.jar
catalina-ha.jar jasper-el.jar tomcat-api.jar tomcat-i18n-ja.jar
catalina.jar jasper.jar tomcat-coyote.jar tomcat-jdbc.jar
catalina-tribes.jar jsp-api.jar tomcat-dbcp.jar tomcat-util.jar
[root@node1 tomcat]# ll logs/
1 23:32 catalina.2017-01-01.log
2 11:16 catalina.out #启动时 Catalina 自己输出的日志
1 23:25 host-manager.2017-01-01.log #主机管理日志
1 23:32 localhost.2017-01-01.log #主机的日志文件
1 23:25 localhost_access_log.2017-01-01.txt #主机的访问日志文件
2 11:15 localhost_access_log.2017-01-02.txt #一般日志每天滚动一次
1 23:25 manager.2017-01-01.log
[root@node1 tomcat]# ll
1 23:23 temp #临时文件的目录
2 11:54 webapps #应用程序目录如:docs、examples、ROOT 等
1 23:25 work #工作目录,在这个目录下每一个 Engine 都有自己的独立目录;而在 Engine 下,#每一个 Host 也有自己的独立目录,而在 Host 下每一个应用程序也有自己的独立 #目录
[root@node1 tomcat]# ls work/
Catalina #Engine
[root@node1 tomcat]# ls work/Catalina/
localhost #Host
[root@node1 tomcat]# ls work/Catalina/localhost/
_ docs examples host-manager manager #应用程序
[root@node1 tomcat]# cd work/Catalina/localhost/
[root@node1 localhost]# cd _
[root@node1 _]# ll #可以看到什么都没有
total 0
浏览器访问一下 192.168.139.2:8080
对应 /usr/local/apache-tomcat-7.0.73/webapps/ROOT/ 目录下的应用程序,如图
[root@node1 _]# ll
total 4
drwxr-xr-x. 3 root root 4096 Jan 2 13:29 org
# 多了一个 org 文件。。可以看到你访问了一个应用程序后,会将 index.jsp 在这里转换为 index_jsp.java 再转换为 index_jsp.class。所以第一个用户访问 JSP 资源时会很慢,但第二个用户来访问相同资源时(只要资源未修改),会直接使用编译好的.class,所以第二个用户访问会比第一个快的多,这也是 JSP 编译的页面访问快的原因,只要你的资源未修改 JSP 就是快
[root@node1 _]# ls org/apache/jsp/
index_jsp.class index_jsp.java
# 可以看到有一堆的静态页面(.png 图片)只有主页 index.jsp 为动态的
[root@node1 tomcat]# ls webapps/ROOT/
asf-logo.png bg-middle.png bg-upper.png index.jsp tomcat.gif tomcat.svg
asf-logo-wide.gif bg-nav-item.png build.xml RELEASE-NOTES.txt tomcat.png
bg-button.png bg-nav.png favicon.ico tomcat.css
WEB-INF
注:需要注意的是每个应用程序都有 WEB-INF 路径,有时还有 META-INF 文件,这两个路径下用来放私有资源,是用户通过 Web 访问 URL 不能访问到的,除了这两个路径下的资源都可以用 web 访问 URL 访问到
为 Tomcat 提供 init 脚本
[root@node1 java]# vim /etc/rc.d/init.d/tomcat
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
export JAVA_OPTS=’-Xms64m -Xmx128m’ # 定义启动时堆内存最小 64M, 最大 128M
JAVA_HOME=/usr/local/java/jdk1.8.0_111 #Java 的路径
CATALINA_HOME=/usr/local/apache-tomcat-7.0.73 #Tomcat 的路径
export JAVA_HOME CATALINA_HOME #将 Java 和 tomcat 的路径输出为环境变量
exec $CATALINA_HOME/bin/catalina.sh $* #执行这个脚本
[root@node1 java]# chkconfig –add tomcat #加执行权限
[root@node1 java]# chkconfig –list tomcat #加入系统服务列表
tomcat 0:off1:off2:on3:on4:on5:on6:off
[root@node1 java]# service tomcat stop
Using CATALINA_BASE: /usr/local/apache-tomcat-7.0.73
Using CATALINA_HOME: /usr/local/apache-tomcat-7.0.73
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.73/temp
Using JRE_HOME: /usr/local/java/jdk1.8.0_111
Using CLASSPATH: /usr/local/apache-tomcat-7.0.73/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.73/bin/tomcat-juli.jar
[root@node1 java]# service tomcat start
Using CATALINA_BASE: /usr/local/apache-tomcat-7.0.73
Using CATALINA_HOME: /usr/local/apache-tomcat-7.0.73
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.73/temp
Using JRE_HOME: /usr/local/java/jdk1.8.0_111
Using CLASSPATH: /usr/local/apache-tomcat-7.0.73/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.73/bin/tomcat-juli.jar
Tomcat started.
注:这个脚本不支持 restart,但还支持以下许多参数(就是执行了 catalina.sh 脚本)
[root@node1 java]# service tomcat -help
debug Start Catalina in a debugger
debug -security Debug Catalina with a security manager
jpda start Start Catalina under JPDA debugger
run Start Catalina in the current window
run -security Start in the current window with security manager
start Start Catalina in a separate window
start -security Start in a separate window with security manager
stop Stop Catalina, waiting up to 5 seconds for the process to end
stop n Stop Catalina, waiting up to n seconds for the process to end
stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running
stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running
configtest Run a basic syntax check on server.xml – check exit code for result
version What version of tomcat are you running?
下一篇中将详细介绍 Tomcat 的核心配置文件 server.xml 中各个组件的配置
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-02/140688p2.htm