Tomcat

把Tomcat控制台日志输出到文件:
修改startup.bat文件,把原来 call “%EXECUTABLE%” start %CMD_LINE_ARGS%
替换成 call “%EXECUTABLE%” run %CMD_LINE_ARGS% > D:\Tomcat\logs\console.log

Tomcat背景
自从JSP发布之后,推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet, 这样Tomcat就诞生了。Tomcat是jakarta项目中的一个重要的子项目,其被JavaWorld杂志的编辑选为2001年度最具创新的java产品,同时它又是sun公司官方推荐的servlet和jsp容器,因此其越来越多的受到软件公司和开发人员的喜爱。servlet和jsp的最新规范都可以在tomcat的新版本中得到实现。其次,Tomcat是完全免费的软件,任何人都可以从互联网上自由地下载。Tomcat与Apache的组合相当完美。

Tomcat目录
tomcat  
|---bin Tomcat:存放启动和关闭tomcat脚本;
|---conf Tomcat:存放不同的配置文件(server.xml和web.xml);
|---doc:存放Tomcat文档;
|---lib/japser/common:存放Tomcat运行需要的库文件(JARS);
|---logs:存放Tomcat执行时的LOG文件;
|---src:存放Tomcat的源代码;
|---webapps:Tomcat的主要Web发布目录(包括应用程序示例);
|---work:存放jsp编译后产生的class文件;

Tomcat类加载
Bootstrap($JAVA_HOME/jre/lib/ext/*.jar) 
System($CLASSPATH/*.class和指定的jar) 
Common($CATALINA_HOME/common 下的classes,lib,endores三个子目录) 
Catalina ($CATALINA_HOME/server/下的classes和lib目录仅对Tomcat可见)  
&Shared($CATALINA_HOME/shared/下的classes和lib目录以及$CATALINA_HOME/lib目录)仅对Web应用程序可见,对Tomcat不可见
WebApp($WEBAPP/Web-INF/*仅对该WEB应用可见classes/*.class lib/*.jar)
加载类和资源的顺序为:
1、/Web-INF/classes  
2、/Web-INF/lib/*.jar  
3、Bootstrap  
4、System   
5、$CATALINA_HOME/common/classes
6、$CATALINA_HOME/common/endores/*.jar 
7、$CATALINA_HOME/common/lib/*.jar 
8、$CATALINA_HOME/shared/classes 
9、$CATALINA_HOME/shared/lib/*.jar 

Tomcat配置

<Server>元素它代表整个容器,是Tomcat实例的顶层元素.
org.apache.catalina.Server接口来定义.它包含一个<Service>元素.并且它不能做为任何元素的子元素.
< Server port ="8005" shutdown ="SHUTDOWN" debug ="0" > 
1>className指定实现org.apache.catalina.Server接口的类.默认为org.apache.catalina.core.StandardServer
2>port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.
3>shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置.

<Service>元素
该元素由org.apache.catalina.Service接口定义,它包含一个<Engine>元素,以及一个或多个<Connector>,
这些Connector元素共享用同一个Engine元素
<Service name ="Catalina"> 
<Service name ="Apache"> 
第一个<Service>处理所有直接由Tomcat服务器接收的web客户请求.
第二个<Service>处理所有由Apahce服务器转发过来的Web客户请求
1>className 指定实现org.apahce.catalina.Service接口的类.默认为org.apahce.catalina.core.StandardService
2>name定义Service的名字

<Engine>元素
每个Service元素只能有一个Engine元素.表示指定service中的请求处理机,接收和处理来自Connector的请求.
由org.apahce.catalina.Engine接口定义.
<Engine name ="Catalina" defaultHost ="localhost" debug ="0"> 
1>className指定实现Engine接口的类,默认值为StandardEngine.
2>defaultHost指定处理客户的默认主机名,在<Engine>中的<Host>子元素中必须定义这一主机.
3>name定义Engine的名字.
在<Engine>可以包含如下元素<Logger>, <Realm>, <Value>, <Host>.
<Host>元素.
它由Host接口定义.一个Engine元素可以包含多个<Host>元素.每个<Host>的元素定义了一个虚拟主机.它包含了一个或多个Web应用.
<Host name ="localhost" debug ="0" appBase ="webapps" unpackWARs ="true" autoDeploy ="true"> .
1>className指定实现Host接口的类.默认值为StandardHost.
2>appBase指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于<CATALINA_HOME>的相对目录.
如果没有此项,默认<CATALINA_HOME>/webapps
3>autoDeploy如果此项设为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,
如果有新有web应用加入进来,会自运发布这个WEB应用.
4>unpackWARs如果此项设置为true,表示把WEB应用的WAR文件先展开为开放目录结构后再运行.如果设为false将直接运行为WAR文件.
5>alias指定主机别名,可以指定多个别名.
6>deployOnStartup如果此项设为true,表示Tomcat服务器启动时会自动发布appBase目录下所有的Web应用.
如果Web应用中的server.xml没有相应的<Context>元素,将采用Tomcat默认的Context.
7>name定义虚拟主机的名字在<Host>元素中可以包含如下子元素
<Logger>, <Realm>, <Value>, <Context>

<Context>元素
它由Context接口定义.是使用最频繁的元素.每个<Context元素代表了运行在虚拟主机上的单个Web应用.
一个<Host>可以包含多个<Context>元素.
每个web应用有唯一的一个相对应的Context代表web应用自身.
servlet容器为第一个web应用创建一个ServletContext对象.
<Context path ="/sample" docBase ="sample" debug ="0" reloadbale ="true">
1>className指定实现Context的类,默认为StandardContext类.
2>path指定访问Web应用的URL入口.
3>reloadable如果这个属性设为true, Tomcat服务器在运行状态下会监视在WEB-INF/classes和Web-INF/lib目录CLASS文件的变化.
如果监视到有class文件被更新,服务器自重新加载Web应用.
3>cookies指定是否通过Cookies来支持Session,默认值为true.
4>useNaming指定是否支持JNDI,默认值为了true在<Context>元素中可以包含如下元素
<Logger>, <Realm>, <Resource>, <ResourceParams>
Logger 表示日志,调试和错误信息
className   指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口
prefix  指定log文件的前缀
suffix  指定log文件的后缀
timestamp   如果为true,则log文件名中要加入时间,如下例:localhost_log.2001-10-04.txt

Realm 表示存放用户名,密码及role的数据库
className   指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口

Valve 功能与Logger差不多,其prefix和suffix属性解释和Logger中的一样
className   指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息
directory   指定log文件存放的位置
pattern 有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。
combined方式比common方式记录的值更多.

<Connector>元素
由Connector接口定义.<Connector>元素代表与客户程序实际交互的给件,它负责接收客户请求,以及向客户返回响应结果.
<Connector port ="8080" maxThread ="50" minSpareThreads ="25" maxSpareThread ="75" enableLookups ="false" 
redirectPort="8443" acceptCount ="100" debug ="0" connectionTimeout ="20000" disableUploadTimeout ="true" /> 
<Connection port ="8009" enableLookups ="false" redirectPort="8443" debug ="0" protocol ="AJP/1.3" /> 
第一个Connector元素定义了一个HTTP Connector,它通过8080端口接收HTTP请求.
第二个Connector元素定义了一个JD Connector,它通过8009端口接收由其它服务器转发过来的请求.

**Connector元素共用属性**
1>className指定实现Connector接口的类.
2>enableLookups如果设为true,表示支持域名解析,可以把IP地址解析为主机名.
WEB应用中调用request.getRemoteHost方法返回客户机主机名.默认值为true.
3>redirectPort指定转发端口.如果当前端口只支持non-SSL请求,
在需要安全通信的场命,将把客户请求转发至SSL的redirectPort端口.

**HttpConnector元素的属性**
1>className实现Connector的类.
2>port设定Tcp/IP端口,默认值为8080,如果把8080改成80,则只要输入http://localhost 即可因为TCP/IP的默认端口是80.
3>address如果服务器有二个以上ip地址,此属性可以设定端口监听的ip地址.默认情况下,端口会监听服务器上所有的ip地址.
4>bufferSize设定由端口创建的输入流的缓存大小.默认值为2048byte
5>protocol设定Http协议,默认值为HTTP/1.1.
6>maxThreads设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目.默认值为200.
7>acceptCount设定在监听端口队列的最大客户请求数量,默认值为10.如果队列已满,客户必须等待.
8>connectionTimeout定义建立客户连接超时的时间.如果为-1,表示不限制建立客户连接的时间.

JkConnector的属性
1>className实现Connector的类
2>port设定AJP端口号
3>protocol必须设定为AJP/1.3

Tomcat配置数据源

修改Tomcat_Home/conf/server.xml,在GlobalNamingResources中加入  
<Resource name="jdbc/DataSource" auth="Container"  
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"  url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"  
username="user" password="password" 
maxActive="20" maxIdle="10"  maxWait="-1"/>     

再在Context中加入引用:
<ResourceLink name="jdbc/DataSource" global="jdbc/DataSource"  type="javax.sql.DataSource"/>  
如果不加,则在使用的时候会出现
Cannot create JDBC driver of class '' for connect URL 'null' 错误 

在web.xml定义:Xml代码   
<resource-ref>        
<description>popuserDataSource</description>        
<res-ref-name>jdbc/DataSource</res-ref-name>        
<res-type>javax.sql.DataSource</res-type>        
<res-auth>Container</res-auth>    
</resource-ref> 

在Spring中引用:    
<bean id="DataSource" class="org.springframework.jndi.JndiObjectFactoryBean">          
<property name="jndiName" value="java:comp/env/jdbc/DataSource"/>            
<property name="expectedType" value="javax.sql.DataSource"/>    
</bean> 

Tomcat配置数据库连接池

**1.所有的tomcat项目共用一个连接池配置**

context.xml添加:
<Context> 
  <Resource  name="jdbc/pool"  auth="Container"  
   type="javax.sql.DataSource"  maxActive="20"  
   maxIdel="10"maxWait="1000"  username="root"  password=""  
   driverClassName="com.mysql.jdbc.Driver"  
   url="jdbc:mysql://127.0.0.1:3306/test">  
</Resource>  
</Context> 

web.xml添加:
<resource-ref> 
      <res-ref-name>jdbc/mengshan </res-ref-name> 
      <res-type>javax.sql.DataSource </res-type> 
      <res-auth>Container</res-auth> 
</resource-ref> 

将JDBC驱动包导入到tomcat的lib里。

**2.每个Web项目独立用自己连接池配置**:把xml内容放入一个具体的项目下

在该项目目录的META-INF下创建context.xml
<?xml version="1.0" encoding="UTF-8"?>  
<Context path="/">  
    <Resource  name="pool"  type="javax.sql.DataSource"  
      driverClassName="oracle.jdbc.driver.OracleDriver"  
      url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"  
      maxIdle="2"  maxWait="5000"  username="test"   
      password="pwd"  maxActive="4"/>  
<!--maxIdle:连接池处于空闲状态的数据库连接的最大数目,取0表示不受限制-->  
<!--maxWait:连接池中数据库连接处于空闲状态的最长时间(以毫秒为单位),取0表示无限制等待时间-->  
<!--maxActive:连接池处于活动状态的数据库连接的最大数目,去0表示不受限制-->  
</Context>  

在该项目web.xml加入
<resource-ref>
  <res-ref-name>jdbc/pool</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

将JDBC驱动包导入到项目的lib里。

Tomcat启动

Tomcat的启动分为startupo.bat启动和注册为windows服务的启动.
**1.startup.bat启动**
在tomcat_home/bin目录下找到catalina.bat
set JAVA_OPTS= -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxNewSize=256M -XX:MaxPermSize=256M
-Xms1024M:初始化堆内存大小(注意,不加M的话单位是KB-Xmx1029M:最大堆内存大小
-XX:PermSize=256M:初始化类加载内存池大小
-XX:MaxPermSize=256M:最大类加载内存池大小
-XX:MaxNewSize=256M:
server:启动jvm时以服务器方式启动,比客户端启动慢,但性能较好。

**2.windows服务启动**
如果你的tomcat是注册为windows服务并且是以服务方式启动的,那么上面的方法就无效了,
因为这时tomcat启动是读取注册表的参数,而不是读取批处理文件的参数,这时我们有两种方法来设置jvm参数。

第一种比较简单,tomcat为我们提供了一个设置启动参数的窗体,双击tomcat_home/bin目录下的tomcat6w.exe,
下方的Initial memory pool就是初始化堆内存大小,Maximun memory pool是最大堆内存大小。
而要设置Perm Gen池的大小就要在Java Option里面加参数了,在里面加上:
-Dcatalina.base=%tomcat_home%
-Dcatalina.home=%tomcat_home%
-Djava.endorsed.dirs=%tomcat_home%\endorsed
-Djava.io.tmpdir=%tomcat_home%\temp
-XX:PermSize=256M
-XX:MaxPermSize=256M
-XX:ReservedCodeCacheSize=48M
-Duser.timezone=GMT+08

第二种方法是打开注册表->HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat6\Parameters\Java
修改Options的值,把刚才上面那些参数加进去就OK了。

Tomcat 调优

**测试环境:**
OS: Ubuntu14.04 64位 (运行在Docker1.9)
CPU: Intel i3 双核四线程
Mem: 8G
Tomcat版本: Tomcat8.5
Java SDK版本: JDK 8
测试软件: Apache JMeter 2.8
**测试代码**
public class Test extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
        StringBuffer ret = new StringBuffer();
        for(int i=0;i < 10000; i++) {
           ret.append(String.valueOf(i) + " test\n");
        }
        PrintWriter printWriter = response.getWriter();
        printWriter.println(ret);
    }
}
测试用例:采用JMeter模拟5000个(用户),在10s内对该接口不断发起Get请求,并循环10次。
调优方式一(启动时优化) : 修改…/bin/catalina.sh,Windows下为catalina.bat。
添加参数:
export JAVA_OPTS=-server”  
tomcat默认以java –client方式运行, 添加”server”参数将tomcat切换为生产模式,使得tomcat能支持更高的并发数和吞吐量.
export JAVA_OPTS=-server -Xms256M -Xmx256M”
总结:
最大并发数和吞吐量有明显的提升.
export JAVA_OPTS=-server -Xms256M -Xmx256M”
Xms参数表示初始堆的大小,也是堆大小的最小值,默认值是总共的物理内存1/64, 且小于1G, Xmx参数表示堆的最大值.在本机中这个参数的值大约为128m.
export JAVA_OPTS=-server -Xms512M -Xmx512M -XX:+AggressiveOpts”
-XX:+AggressiveOpts表示每当JDK版本升级时,你的JVM都会使用最新加入的优化技术.
export JAVA_OPTS=-server -Xms512M -Xmx512M -XX:+AggressiveOpts -XX:+UseBiasedLocking”
启用一个优化的线程锁.对于tomcat来说,每个http请求都会启用线程,启动该线程锁可以让tomcat对线程进行最优调配.
总结:除了吞吐率其他都降得很厉害.个人猜测因为本次测试代码并不复杂,如果是执行复杂的业务逻辑可能优化效果会比较明显,尤其是设计到当业务的计算量相差较大时.
export JAVA_OPTS=-server -Xms512M -Xmx512M -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC”
禁止显示调用System.gc().若在代码中显示调用System.gc()让JVM进行垃圾回收,会极大降低系统响应时间.
调优方式二(容器内优化): 更改…/conf/server.xml 
添加参数:
URIEncoding=”UTF-8//使得tomcat可以解析含有中文名的文件的url
protocol=”org.apache.coyote.http11.Http11Nio2Protocol”
若tomcat为8可改为上面的参数,若为tomcat6建议改为”org.apache.coyote.http11.Http11NioProtocol”
enableLookups=false”  
调用request、getRemoteHost()执行DNS查询,以返回远程主机的主机名,如果设置为false,则直接返回IP地址。
acceptCount=1000” 
指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置 100.
maxThreads=5000”
最大并发数,默认设置 200,这里设置为JMeter中的模拟请求数5000  

参考配置

catalina.sh
export JAVA_OPTS=”-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true “
server.xml
Connectorport="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443"
enableLookups="false"
acceptCount="100"
maxThreads="200"
minSpareThreads="10"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
URIEncoding="utf-8"

JVM调优

**堆大小设置**
JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。
**回收器选择**
JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行判断。
**辅助信息**
-XX:+PrintGC
输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs]
[Full GC 121376K->10414K(130112K), 0.0650971 secs]
-XX:+PrintGCDetails
输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs][GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
-XX:+PrintGCTimeStamps -XX:+PrintGCPrintGCTimeStamps可与上面两个混合使用
输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
-XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用
输出形式:Application time: 0.5291524 seconds
-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。可与上面混合使用
输出形式:Total time for which application threads were stopped: 0.0468229 seconds
-XX:PrintHeapAtGC:打印GC前后的详细堆栈信息,略
**常见配置汇总**
堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值。如:3,表示年轻代与年老代比值为13,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示EdenSurvivor=32,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
**调优总结**
1.年轻代大小选择
响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。
2.年老代大小选择
响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:
并发垃圾收集信息、持久代并发收集次数、传统GC信息、花在年轻代和年老代回收上的时间比例、减少年轻代和年老代花费的时间,一般会提高应用的效率。
吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。
3.较小堆引起的碎片问题
因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:
-XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
-XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩。

与apache集成
虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来。

安装mod_jk connector
这个是链接apache和tomcat的桥。是Apache接受到jsp或servlet时能将请求转发到tomcat。
把mod_jk.so 拷贝到Apache安装目录下的modules里。

tomcat的conf目录新建workers.properties
workers.tomcat_home=Tomcat的安装路径
workers.java_home=jre的安装路径
#指定文件路径分割符
ps=\
#模块版本,名字要和httpd.conf的一致。
worker.list=ajp13
#工作端口,tomcat的jk监听端口,可以查看Server.xml中有port="8009" 
worker.ajp13.port=8009 
#Tomcat所在机器,如果安装在与apache不同的机器则需要设置IP
worker.ajp13.host=localhost
#通讯协议类型
worker.ajp13.type=ajp13 
#负载平衡因子
worker.ajp13.lbfactor=1

修改tomcat的server.xml文件(修改其默认的目录)
<Context path="" docBase="E:\wwwroot" reloadable="true" crossContext="true"/>

Apache的httpd.conf配置
#此处mod_jk的文件为你下载的文件
LoadModule jk_module modules/mod_jk.so
#指定tomcat监听配置文件地址
JkWorkersFile "D:\tools\apache-tomcat-6.0.32\conf\workers.properties"
#指定日志存放位置;以及日志级别
JkLogFile "D:\tools\apache-tomcat-6.0.32\logs\mod_jk2.log" 
JkLogLevel info

#让Apache支持对servlet传送,用以Tomcat解析
JkMount /servlet/* ajp13 
#让Apache支持对jsp传送,用以Tomcat解析
JkMount /*.jsp ajp13 
#让Apache支持对.do传送,用以Tomcat解析
JkMount /*.do ajp13 

ServerName localhost
DocumentRoot "E:/wwwroot"
<Directory "E:/wwwroot">
DirectoryIndex index.html index.htm index.jsp

管理

在进行具体Tomcat管理之前,先给tomcat添加一个用户,使这个用户有权限来进行管理。打开conf目录下的tomcat-users.xml文件,在相应的位置添加下面一行:
<user name="user" password="user" roles="standard,manager"/> 
然后重起tomcat,在浏览器中输入http://localhost:8080/manager/,会弹出对话框,输入上面的用户名和密码即可。

1、WAR有两种组织方式,一种是按一定的目录结构组织文件,一种是一个后缀为WAR的压缩包,因此它的部署方式也有两种:
(1):在浏览器中输入:http://localhost:8080/manager/install?path=/examples&war=file:/c:examples 
就会将按目录结构组织的部署
(2):如果输入:http://localhost:8080/manager/install?path=/examples&war=jar:file:/c:examples.war!/     
就会将按压缩包组织的WAR部署,注意此url后半部分一定要有!/号。
部署后就可以用http://localhost:8080/examples访问了。
在浏览器中输入:http://localhost:8080/manager/remove?path=/examples   就会撤销刚才部署的应用程序。

2、应用程序列表在浏览器中输入http://localhost:8080/manager/list,浏览器将会显示如下的信息:
OK - Listed applications for virtual host localhost 
/ex:running:1 
/examples:running:1 
/webdav:running:0 
/tomcat-docs:running:0 
/manager:running:0 
/:running:0 

3、重新装载应用程序在浏览器中输入http://localhost:8080/manager/reload?path=/examples,浏览器显示如下:
OK - Reloaded application at context path /examples 
这表示example应用程序装载成功,如果我们将server.xml的Context元素的reloadable属性设为true,则没必要利用这种方式重新装载应用程序,因为tomcat会自动装载。

4、显示session信息在浏览器中输入http://localhost:8080/manager/sessions?path=/examples,浏览器显示如下:
OK - Session information for application at context path /examples Default maximum session inactive interval 30 minutes

5、启动和关闭应用程序
在浏览器中输入http://localhost:8080/manager/start?path=/examples和http://localhost:8080/manager/stop?path=/examples
分别启动和关闭examples应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值