<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-風向逆轉 - 就要爪哇-文章分类-Web/App Server</title><link>http://www.blogjava.net/iKingQu/category/8712.html</link><description>Java菜鸟升级中...</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 11:26:03 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 11:26:03 GMT</pubDate><ttl>60</ttl><item><title>[收藏]Tomcat中的开发应用系统常见的配置 </title><link>http://www.blogjava.net/iKingQu/articles/38738.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sun, 02 Apr 2006 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/38738.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/38738.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/38738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/38738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/38738.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<div>
						<p>
								<strong>1.设置环境变量<br /></strong>Linux系统，修改catalina.sh和catalina.50.sh<br />JAVA_HOME=/usr/local/j2sdk1.4.2_06<br />JAVA_OPTS='-Xms512m -Xmx512m'<br />CATALINA_HOME=/usr/local/jakarta-tomcat-5.0.28<br />Windows系统，修改catalina.bat和catalina.50.bat<br />set JAVA_HOME=D:j2sdk1.4.2_06<br />set CATALINA_HOME=D:jakarta-tomcat-5.0.28</p>
						<p> </p>
						<p>
								<strong>2. 如何加大tomcat连接数<br /></strong>在tomcat配置文件server.xml中的&lt;Connector /&gt;配置中，和连接数相关的参数有：<br />minProcessors：最小空闲连接线程数，用于提高系统处理性能，默认值为10<br />maxProcessors：最大连接线程数，即：并发处理的最大请求数，默认值为75<br />acceptCount：允许的最大连接数，应大于等于maxProcessors，默认值为100<br />enableLookups：是否反查域名，取值为：true或false。为了提高处理能力，应设置为false<br />connectionTimeout：网络连接超时，单位：毫秒。设置为0表示永不超时，这样设置有隐患的。通常可设置为30000毫秒。<br />其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数，应同时加大这两个参数。<br />web server允许的最大连接数还受制于操作系统的内核参数设置，通常Windows是2000个左右，Linux是1000个左右。tomcat5中的配置示例：<br />    &lt;Connector port="8080"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               debug="0" connectionTimeout="20000" <br />               disableUploadTimeout="true" /&gt;<br />对于其他端口的侦听配置，以此类推。<br /></p>
						<p> </p>
						<p>
								<strong>3. tomcat中如何禁止列目录下的文件<br /></strong>在{tomcat_home}/conf/web.xml中，把listings参数设置成false即可，如下：<br />&lt;init-param&gt;<br />&lt;param-name&gt;listings&lt;/param-name&gt;<br />&lt;param-value&gt;false&lt;/param-value&gt;<br />&lt;/init-param&gt;<br /></p>
						<p> </p>
						<p>
								<strong>4.如何加大tomcat可以使用的内存<br /></strong>tomcat默认可以使用的内存为128MB，在较大型的应用项目中，这点内存是不够的，需要调大。<br />Unix下，在文件{tomcat_home}/bin/catalina.sh的前面，增加如下设置：<br />JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'<br />需要把这个两个参数值调大。例如：<br />JAVA_OPTS='-Xms256m -Xmx512m'<br />表示初始化内存为256MB，可以使用的最大内存为512MB <br /></p>
						<p> </p>
						<p>
								<strong>5. 如何添加默认访问页面<br /></strong>修改文件web.xml，在welcome-file里面加入需要的页面即可。<br />&lt;welcome-file-list&gt;<br />    &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />    &lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br />    &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />&lt;/welcome-file-list&gt;<br /></p>
						<p> </p>
						<p>
								<strong>6. 如何添加出错页面</strong>
						</p>
						<p>修改文件web.xml，在location里面加入出错页面<br /> &lt;error-page&gt;<br />  &lt;error-code&gt;404&lt;/error-code&gt;<br />  &lt;location&gt;/error.jsp&lt;/location&gt;<br /> &lt;/error-page&gt;<br /> &lt;error-page&gt;<br />  &lt;error-code&gt;500&lt;/error-code&gt;<br />  &lt;location&gt;/error.jsp&lt;/location&gt;<br /> &lt;/error-page&gt; </p>
						<p> </p>
						<p>
								<strong>7.如何配置虚拟主机 <br /></strong>为了实现基于域名（IP地址）的虚拟主机，修改文件server.xml，加入以下内容：<br />      &lt;Host appBase="C:/webapp1" name="www.test1.com" unpackWARs="true" autoDeploy="true"<br />       xmlValidation="false" xmlNamespaceAware="false"&gt;<br />      &lt;Alias&gt;www.test1.com&lt;/Alias&gt;<br />      &lt;Alias&gt;192.168.1.110&lt;/Alias&gt;<br />      &lt;/Host&gt;<br />      &lt;Host appBase="C:/webapp2" name="www.test2.com" unpackWARs="true" autoDeploy="true"<br />       xmlValidation="false" xmlNamespaceAware="false"&gt;<br />      &lt;Alias&gt;www.test2.com&lt;/Alias&gt;<br />      &lt;Alias&gt;192.168.1.120&lt;/Alias&gt;<br />      &lt;/Host&gt;<br />在confCatalina目录下建立文件夹，文件夹的名称为”www.test1.com”和“www.test2.com”，然后在这两个目录下建立文件ROOT.xml，其“www.test1.com“目录下ROOT.xml内容为：<br />&lt;?xml version='1.0' encoding='utf-8'?&gt;<br />&lt;!--<br /> Context configuration file for the test1 App<br />--&gt;<br />&lt;Context displayName=www.test1.com path="/"  docBase="" useNaming="false"&gt;<br />        debug="0" privileged="true" reloadable="true"&gt;<br />    &lt;Logger className="org.apache.catalina.logger.FileLogger"<br />                 directory="C:/webapp1/WEB-INF/logs" prefix="test1_log."<br />                 suffix=".txt" timestamp="true"/&gt;<br />    &lt;Valve className="org.apache.catalina.valves.AccessLogValve"<br />                 directory="logs"  prefix="test1_access_log." suffix=".txt"<br />                 pattern="combined" resolveHosts="false"/&gt;<br />&lt;/Context&gt;</p>
						<p> </p>
						<p>
								<strong>8. 如何配置mysql数据源<br /></strong>在本机建立数据库test，将mysql的JDBC驱动mysql-connector-java-3.0.9-stable-bin.jar拷贝到目录commonlib下，<br />修改文件web.xml，加入以下内容：<br />&lt;resource-ref&gt;<br />  &lt;description&gt;MySQL Datasource example&lt;/description&gt;<br />  &lt;res-ref-name&gt;jdbc/test&lt;/res-ref-name&gt;<br />  &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />  &lt;res-auth&gt;Container&lt;/res-auth&gt; <br /> &lt;/resource-ref&gt;<br /><br />在WEB应用的配置文件里加入以下内容：<br />&lt;Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/&gt; <br /> &lt;ResourceParams name="jdbc/test"&gt;   <br />  &lt;parameter&gt;<br />   &lt;name&gt;factory&lt;/name&gt;   <br />   &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;   <br />  &lt;/parameter&gt;   <br /> &lt;!-- Class name for mm.mysql JDBC driver --&gt;  <br />  &lt;parameter&gt;    <br />   &lt;name&gt;driverClassName&lt;/name&gt;      <br />   &lt;value&gt;org.gjt.mm.mysql.Driver&lt;/value&gt;   <br />  &lt;/parameter&gt; <br /> &lt;!-- The JDBC connection url for connecting to your MySQL dB.       <br />  The autoReconnect=true argument to the url makes sure that the mm.mysql JDBC Driver will automatically reconnect if mysqld closed the connection.  mysqld by default closes idle connections after 8 hours. --&gt;  <br />  &lt;parameter&gt;  <br />   &lt;name&gt;url&lt;/name&gt;<br />   &lt;value&gt;jdbc:mysql://localhost:3306/test?autoReconnect=true&lt;/value&gt;<br />  &lt;/parameter&gt; <br /> &lt;!-- MySQL dB username and password for dB connections  --&gt;  <br />  &lt;parameter&gt;  <br />   &lt;name&gt;username&lt;/name&gt;   <br />   &lt;value&gt;root&lt;/value&gt;   <br />  &lt;/parameter&gt;   <br />  &lt;parameter&gt;   <br />   &lt;name&gt;password&lt;/name&gt; <br />   &lt;value&gt;&lt;/value&gt;   <br />  &lt;/parameter&gt;<br /> &lt;!-- Maximum number of dB connections in pool. Make sure you configure your mysqld max_connections large enough to handle all of your db connections. Set to 0 for no limit.  --&gt;<br />  &lt;parameter&gt;    <br />   &lt;name&gt;maxActive&lt;/name&gt;   <br />   &lt;value&gt;100&lt;/value&gt;   <br />  &lt;/parameter&gt;  <br /> &lt;!-- Maximum number of idle dB connections to retain in pool. Set to 0 for no limit. --&gt;  <br />  &lt;parameter&gt;  <br />   &lt;name&gt;maxIdle&lt;/name&gt;<br />   &lt;value&gt;30&lt;/value&gt;<br />  &lt;/parameter&gt;<br /> &lt;!-- Maximum time to wait for a dB connection to become available in ms, in this example 10 seconds. An Exception is thrown if this timeout is exceeded.  Set to -1 to wait indefinitely.  --&gt;   <br />  &lt;parameter&gt;     <br />   &lt;name&gt;maxWait&lt;/name&gt;<br />   &lt;value&gt;10000&lt;/value&gt;  <br />  &lt;/parameter&gt;<br />&lt;/ResourceParams&gt;&lt;resource-ref&gt;<br />  &lt;description&gt;MySQL Datasource example&lt;/description&gt;<br />  &lt;res-ref-name&gt;jdbc/test&lt;/res-ref-name&gt;<br />  &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />  &lt;res-auth&gt;Container&lt;/res-auth&gt; <br /> &lt;/resource-ref&gt;<br /><br />在WEB应用的配置文件里加入以下内容：<br />&lt;Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/&gt; <br /> &lt;ResourceParams name="jdbc/test"&gt;   <br />  &lt;parameter&gt;<br />   &lt;name&gt;factory&lt;/name&gt;   <br />   &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;   <br />  &lt;/parameter&gt;   <br /> &lt;!-- Class name for mm.mysql JDBC driver --&gt;  <br />  &lt;parameter&gt;    <br />   &lt;name&gt;driverClassName&lt;/name&gt;      <br />   &lt;value&gt;org.gjt.mm.mysql.Driver&lt;/value&gt;   <br />  &lt;/parameter&gt; <br /> &lt;!-- The JDBC connection url for connecting to your MySQL dB.       <br />  The autoReconnect=true argument to the url makes sure that the mm.mysql JDBC Driver will automatically reconnect if mysqld closed the connection.  mysqld by default closes idle connections after 8 hours. --&gt;  <br />  &lt;parameter&gt;  <br />   &lt;name&gt;url&lt;/name&gt;<br />   &lt;value&gt;jdbc:mysql://localhost:3306/test?autoReconnect=true&lt;/value&gt;<br />  &lt;/parameter&gt; <br /> &lt;!-- MySQL dB username and password for dB connections  --&gt;  <br />  &lt;parameter&gt;  <br />   &lt;name&gt;username&lt;/name&gt;   <br />   &lt;value&gt;root&lt;/value&gt;   <br />  &lt;/parameter&gt;   <br />  &lt;parameter&gt;   <br />   &lt;name&gt;password&lt;/name&gt; <br />   &lt;value&gt;&lt;/value&gt;   <br />  &lt;/parameter&gt;<br /> &lt;!-- Maximum number of dB connections in pool. Make sure you configure your mysqld max_connections large enough to handle all of your db connections. Set to 0 for no limit.  --&gt;<br />  &lt;parameter&gt;    <br />   &lt;name&gt;maxActive&lt;/name&gt;   <br />   &lt;value&gt;100&lt;/value&gt;   <br />  &lt;/parameter&gt;  <br /> &lt;!-- Maximum number of idle dB connections to retain in pool. Set to 0 for no limit. --&gt;  <br />  &lt;parameter&gt;  <br />   &lt;name&gt;maxIdle&lt;/name&gt;<br />   &lt;value&gt;30&lt;/value&gt;<br />  &lt;/parameter&gt;<br /> &lt;!-- Maximum time to wait for a dB connection to become available in ms, in this example 10 seconds. An Exception is thrown if this timeout is exceeded.  Set to -1 to wait indefinitely.  --&gt;   <br />  &lt;parameter&gt;     <br />   &lt;name&gt;maxWait&lt;/name&gt;<br />   &lt;value&gt;10000&lt;/value&gt;  <br />  &lt;/parameter&gt;<br />&lt;/ResourceParams&gt; </p>
						<p> </p>
						<p>
								<strong>9. </strong>
								<strong>tomcat连接池的配置</strong>
						</p>
						<p>&lt;Resource name="jdbc/testDB" auth="Container"<br />               type="javax.sql.DataSource"/&gt; <br />&lt;ResourceParams name="jdbc/testDB"&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;factory&lt;/name&gt;<br />     &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;driverClassName&lt;/name&gt;<br />     &lt;value&gt;com.microsoft.jdbc.sqlserver.SQLServerDriver&lt;/value&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;url&lt;/name&gt;<br />     </p>
						<p>&lt;value&gt;jdbc:microsoft:sqlserver://218.246.85.65:1433;DatabaseName=ZCMIS&lt;/v</p>
						<p>alue&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;username&lt;/name&gt;<br />     &lt;value&gt;sa&lt;/value&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;password&lt;/name&gt;<br />     &lt;value&gt;sa&lt;/value&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;maxActive&lt;/name&gt;<br />     &lt;value&gt;30&lt;/value&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;maxIdle&lt;/name&gt;<br />     &lt;value&gt;10&lt;/value&gt;<br />   &lt;/parameter&gt;<br />   &lt;parameter&gt;<br />     &lt;name&gt;maxWait&lt;/name&gt;<br />     &lt;value&gt;1000&lt;/value&gt;<br />   &lt;/parameter&gt;<br />&lt;/ResourceParams&gt;</p>
						<p>
								<br />把下面的东西加到web.xml中<br />   &lt;resource-ref&gt;<br />      &lt;description&gt;DB Connection&lt;/description&gt;<br />      &lt;res-ref-name&gt;jdbc/testDB&lt;/res-ref-name&gt;<br />      &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />      &lt;res-auth&gt;Container&lt;/res-auth&gt;<br />  &lt;/resource-ref&gt;<br />类的内部实现</p>
						<p> try{<br />                      <br />          Context initCtx = new InitialContext();<br />          Context ctx = (Context) initCtx.lookup("java:comp/env");<br />                //获取连接池对象<br />          Object obj = (Object) ctx.lookup("jdbc/testDB");    <br />          javax.sql.DataSource ds = (javax.sql.DataSource)obj;<br />          Connection conn = ds.getConnection();</p>
						<p>    }<br /> catch(Exception e)<br /> {  <br />   System.out.print(e.toString());<br /> }</p>
				</div>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=646544</p>
		</div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/38738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-02 15:32 <a href="http://www.blogjava.net/iKingQu/articles/38738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat性能调整 </title><link>http://www.blogjava.net/iKingQu/articles/38737.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sun, 02 Apr 2006 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/38737.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/38737.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/38737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/38737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/38737.html</trackback:ping><description><![CDATA[
		<div class="postText">外部环境调整 <br /><br />　　调整非Tomcat组件，例如Tomcat运行的操作系统和运行Tomcat的java虚拟机。<br /><br />　　自身调整 <br /><br />　　修改Tomcat自身的参数，调整Tomcat配置文件中的参数。<br /><br />　　下面我们将详细讲解外部环境调整的有关内容，Tomcat自身调整的内容将在第2部分中阐述。<br /><br />　　<strong>1</strong>.JAVA虚拟机性能优化<br /><br />　　Tomcat本身不能直接在计算机上运行，需要依赖于硬件基础之上的操作系统和一个java虚拟机。您可以选择自己的需要选择不同的操作系统和对应的JDK的版本（只要是符合Sun发布的Java规范的），但我们推荐您使用Sun公司发布的JDK。确保您所使用的版本是最新的，因为Sun公司和其它一些公司一直在为提高性能而对java虚拟机做一些升级改进。一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%。<br /><br />　　可以给Java虚拟机设置使用的内存，但是如果你的选择不对的话，虚拟机不会补偿。可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。<br /><table style="WIDTH: 342px; HEIGHT: 73px" cellspacing="1" cellpadding="1" width="342" border="1"><tbody><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span style="FONT-FAMILY: 宋体">参数</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span style="FONT-FAMILY: 宋体">描述</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">-Xms&lt;size&gt;</font></span></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span lang="EN-US" style="FONT-FAMILY: Arial">JVM</span><span style="FONT-FAMILY: 宋体">初始化堆的大小</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr><tr><td align="middle"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">-Xmx&lt;size&gt;</font></span></p></font></span></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span lang="EN-US" style="FONT-FAMILY: Arial">JVM</span><span style="FONT-FAMILY: 宋体">堆的最大值</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr></tbody></table><br /><br />　　这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言，这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存，此时这个参数就是显得非常重要，如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化，虚拟机就必须重复地增加内存来满足使用。由于这种原因，我们一般把-Xms和-Xmx设为一样大，而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象，内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出，并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。<br /><br />　　Tomcat默认可以使用的内存为128MB，在较大型的应用项目中，这点内存是不够的，需要调大。<br /><br />　　Windows下，在文件{tomcat_home}/bin/catalina.bat，Unix下，在文件{tomcat_home}/bin/catalina.sh的前面，增加如下设置：<br /><br />　　JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'<br /><br />　　需要把这个两个参数值调大。例如：<br /><br />　　JAVA_OPTS='-Xms256m -Xmx512m'<br /><br />　　表示初始化内存为256MB，可以使用的最大内存为512MB。<br /><br />　　另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关，应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大，那么完全垃圾收集就会很慢，但是频度会降低。如果你把堆的大小和内存的需要一致，完全收集就很快，但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间，以在特定的时间内最大化处理客户的请求。在基准测试的时候，为保证最好的性能，要把堆的大小设大，保证垃圾收集不在整个基准测试的过程中出现。<br /><br />　　如果系统花费很多的时间收集垃圾，请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈，那么需要指定代的大小，检查垃圾收集的详细输出，研究 垃圾收集参数对性能的影响。一般说来，你应该使用物理内存的 80% 作为堆大小。当增加处理器时，记得增加内存，因为分配可以并行进行，而垃圾收集不是并行的。<br />　<strong>2、操作系统</strong>性能优化<br /><br />　　这里说的操作系统是指运行web服务器的系统软件，当然，不同的操作系统是为不同的目的而设计的。比如OpenBSD是面向安全的，因此在它的内核中有许多的限制来防止不同形式的服务攻击（OpenBSD的一句座右铭是“默认是最安全的”）。这些限制或许更多地用来运行活跃的web服务器。<br /><br />　　而我们常用的Linux操作系统的目标是易用使用，因此它有着更高的限制。使用BSD内核的系统都带有一个名为“Generic”的内核，表明所有的驱动器都静态地与之相连。这样就使系统易于使用，但是如果你要创建一个自定义的内核来加强其中某些限制，那就需要排除不需要的设备。Linux内核中的许多驱动都是动态地加载的。但是换而言之，内存现在变得越来越便宜，所以因为加载额外的设备驱动就显得不是很重要的。重要的是要有更多的内存，并且在服务器上腾出更多的可用内存。<br /><br />　　<u>小提示</u>：虽然现在内存已经相当的便宜，但还是尽量不要购买便宜的内存。那些有牌子的内存虽然是贵一点，但是从可靠性上来说，性价比会更高一些。<br /><br />　　如果是在Windows操作系统上使用Tomcat，那么最好选择服务器版本。因为在非服务器版本上，最终用户授权数或者操作系统本身所能承受的用户数、可用的网络连接数或其它方面的一些方面都是有限制的。并且基于安全性的考虑，必须经常给操作系统打上最新的补丁。<br /><br />　　<strong>3</strong>.Tomcat与其它web服务器整合使用<br /><br />　　虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来，将html与jsp的功能部分进行明确分工，让tomcat只处理jsp部分，其它的由apache,IIS等这些web服务器处理，由此大大节省了tomcat有限的工作“线程”。<br /><br />　　<strong>4</strong>.负载均衡<br /><br />　　在负载均衡的思路下，多台服务器为对称方式，每台服务器都具有同等的地位，可以单独对外提供服务而无须其他服务器的辅助。通过负载分担技术，将外部发送来的请求按一定规则分配到对称结构中的某一台服务器上，而接收到请求的服务器都独立回应客户机的请求。<br /><br />　　提供服务的一组服务器组成了一个应用服务器集群(cluster)，并对外提供一个统一的地址。当一个服务请求被发至该集群时，根据一定规则选择一台服务器，并将服务转定向给该服务器承担，即将负载进行均衡分摊。<br /><br />　　通过应用负载均衡技术，使应用服务超过了一台服务器只能为有限用户提供服务的限制，可以利用多台服务器同时为大量用户提供服务。当某台服务器出现故障时，负载均衡服务器会自动进行检测并停止将服务请求分发至该服务器，而由其他工作正常的服务器继续提供服务，从而保证了服务的可靠性。<br /><br />　　负载均衡实现的方式大概有四种：第一是通过DNS，但只能实现简单的轮流分配，不能处理故障，第二如果是基于MS IIS，Windows 2003 server本身就带了负载均衡服务，第三是硬件方式，通过交换机的功能或专门的负载均衡设备可以实现，第四种是软件方式，通过一台负载均衡服务器进行，上面安装软件。使用Apache Httpd Server做负载平衡器，Tomcat集群节点使用Tomcat就可以做到以上第四种方式。这种方式比较灵活，成本相对也较低。另外一个很大的优点就是可以根据应用的情况和服务器的情况采取一些策略。 
<div><strong>自身调整<br /><br /></strong>　　本节将向您详细介绍一些加速可使Tomcat实例加速运行的技巧和方法，无论是在什么<a href="http://tech.163.com/special/O/000915A0/OS.html"><font color="#0066cc">操作系统</font></a>或者何种Java虚拟机上。在有些情况下，您可能没有控制部署环境上的操作系统或者Java虚拟机。在这种情况下，您就需要逐行了解以下的的一些建议，然而你应该在修改后使之生效。我认为以下方法是Tomcat性能自身调整的最佳方式。<br /><br />　　<strong>1</strong>.禁用DNS查询<br /><br />　　当web应用程序向要记录客户端的信息时，它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络，并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程，这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询，方式是修改server.xml文件中的enableLookups参数值：<br /><p>Tomcat4<br /><br />&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" /&gt;<br /><br />Tomcat5<br /><br />&lt;Connector port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/&gt;</p><br />　　除非你需要连接到站点的每个HTTP客户端的机器名，否则我们建议在生产环境上关闭DNS查询功能。可以通过Tomcat以外的方式来获取机器名。这样不仅节省了网络带宽、查询时间和内存，而且更小的流量会使日志数据也会变得更少，显而易见也节省了硬盘空间。对流量较小的站点来说禁用DNS查询可能没有大流量站点的效果明显，但是此举仍不失为一良策。谁又见到一个低流量的网站一夜之间就流量大增呢？<br /><br />　　<strong>2</strong>.调整线程数<br /><br />　　另外一个可通过应用程序的连接器（Connector）进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径，是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序，使空闲时间保持最低，从而接受更多的请求。<br /><br />　　Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。这些值在安装后就已经设定为默认值并且是足够使用的，但是随着站点的扩容而改大这些值。minProcessors服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是说，如果一天内每秒仅发生5次单击事件，并且每个请求任务处理需要1秒钟，那么预先设置线程数为5就足够了。但在你的站点访问量较大时就需要设置更大的线程数，指定为参数maxProcessors的值。maxProcessors的值也是有上限的，应防止流量不可控制（或者恶意的服务攻击），从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数，应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置，通常Windows是2000个左右，Linux是1000个左右。<br /><br />　　在Tomcat5对这些参数进行了调整，请看下表：<br /><table style="WIDTH: 525px; HEIGHT: 219px" cellspacing="1" cellpadding="1" width="525" border="1"><tbody><tr><td align="middle"><p style="TEXT-ALIGN: center" align="center"><font size="3"><strong><span style="FONT-FAMILY: 宋体">属性名</span></strong><strong><span lang="EN-US" style="FONT-FAMILY: Arial"></span></strong></font></p></td><td align="middle"><p style="TEXT-ALIGN: center" align="center"><font size="3"><strong><span style="FONT-FAMILY: 宋体">描述</span></strong><strong><span lang="EN-US" style="FONT-FAMILY: Arial"></span></strong></font></p></td></tr><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">maxThreads</font></span></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span lang="EN-US" style="FONT-FAMILY: Arial">Tomcat</span><span style="FONT-FAMILY: 宋体">使用线程来处理接收的每个请求。这个值表示</span><span lang="EN-US" style="FONT-FAMILY: Arial">Tomcat</span><span style="FONT-FAMILY: 宋体">可创建的最大的线程数。</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">acceptCount </font></span></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span style="FONT-FAMILY: 宋体">指定当所有可以使用的处理请求的线程数都被使用时，可以放到处理队列中的请求数，超过这个数的请求将不予处理。</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">connnectionTimeout </font></span></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span style="FONT-FAMILY: 宋体">网络连接超时，单位：毫秒。设置为</span><span lang="EN-US" style="FONT-FAMILY: Arial">0</span><span style="FONT-FAMILY: 宋体">表示永不超时，这样设置有隐患的。通常可设置为</span><span lang="EN-US" style="FONT-FAMILY: Arial">30000</span><span style="FONT-FAMILY: 宋体">毫秒。</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">minSpareThreads </font></span></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span lang="EN-US" style="FONT-FAMILY: Arial">Tomcat</span><span style="FONT-FAMILY: 宋体">初始化时创建的线程数。</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr><tr><td align="middle"><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">maxSpareThreads </font></span></p></td><td align="middle"><p style="TEXT-ALIGN: left" align="left"><font size="3"><span style="FONT-FAMILY: 宋体">一旦创建的线程超过这个值，</span><span lang="EN-US" style="FONT-FAMILY: Arial">Tomcat</span><span style="FONT-FAMILY: 宋体">就会关闭不再需要的</span><span lang="EN-US" style="FONT-FAMILY: Arial">socket</span><span style="FONT-FAMILY: 宋体">线程。</span><span lang="EN-US" style="FONT-FAMILY: Arial"></span></font></p></td></tr></tbody></table><br /><br />　　最好的方式是多设置几次并且进行测试，观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同，而且并不是所有人的web站点的流量都是一样的，因此没有一刀切的方案来确定线程数的值。<br /></div>　　<strong>3</strong>.加速JSP编译速度<br /><br />　　当第一次访问一个JSP文件时，它会被转换为Java serverlet源码，接着被编译成Java字节码。你可以控制使用哪个编译器，默认情况下，Tomcat使用使用命令行javac进行使用的编译器。也可以使用更快的编译器，但是这里我们将介绍如何优化它们。<br /><br />　　另外一种方法是不要把所有的实现都使用JSP页面，而是使用一些不同的java模板引擎变量。显然这是一个跨越很大的决定，但是事实证明至少这种方法是只得研究的。如果你想了解更多有关在Tomcat可使用的模板语言，你可以参考Jason Hunter和William Crawford合著的《Java Servlet Programming 》一书（O'Reilly公司出版）。<br /><br />　　在Tomcat 4.0中可以使用流行而且免费的Jikes编译器。Jikes编译器的速度要由于Sun的Java编译器。首先要安装Jikes（可访问http://oss.software.ibm.com/pub/jikes 获得更多的信息），接着需要在环境变量中设置JIKESPATH包含系统运行时所需的JAR文件。装好Jikes以后还需要设置让JSP编译servlet使用Jikes，需要修改web.xml文件中jspCompilerPlugin的值：<br /><p>&lt;servlet&gt;<br />&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;<br />org.apache.jasper.servlet.JspServlet<br />&lt;/servlet-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;<br />&lt;param-value&gt;WARNING&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;jspCompilerPlugin&lt;/param-name&gt;<br />&lt;param-value&gt;<br />org.apache.jasper.compiler.JikesJavaCompiler<br />&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;!-- &lt;param-name&gt;<br />org.apache.catalina.jsp_classpath<br />&lt;/param-name&gt; --&gt;<br />&lt;param-name&gt;classpath&lt;/param-name&gt;<br />&lt;param-value&gt;<br />/usr/local/jdk1.3.1-linux/jre/lib/rt.jar:<br />/usr/local/lib/java/servletapi/servlet.ja<br />r&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br />&lt;/servlet&gt;</p><br />　　在Tomcat 4.1（或更高版本），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的，因为你只需要在 元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下：<br /><p>&lt;servlet&gt;<br />&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;<br />org.apache.jasper.servlet.JspServlet<br />&lt;/servlet-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;<br />&lt;param-value&gt;WARNING&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;compiler&lt;/param-name&gt;<br />&lt;param-value&gt;jikes&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br />&lt;/servlet&gt;</p><br /><br />Ant可用的编译器<br /><table style="WIDTH: 485px; HEIGHT: 269px" cellspacing="1" cellpadding="1" width="485" border="1"><tbody><tr><td><p style="TEXT-ALIGN: center" align="center"><font size="3"><strong><span style="FONT-FAMILY: 宋体">名称</span></strong><strong><span lang="EN-US" style="FONT-FAMILY: Arial"></span></strong></font></p></td><td><p style="TEXT-ALIGN: center" align="center"><font size="3"><strong><span style="FONT-FAMILY: 宋体">别名</span></strong><strong><span lang="EN-US" style="FONT-FAMILY: Arial"></span></strong></font></p></td><td><p style="TEXT-ALIGN: center" align="center"><font size="3"><strong><span style="FONT-FAMILY: 宋体">调用的编译器</span></strong><strong><span lang="EN-US" style="FONT-FAMILY: Arial"></span></strong></font></p></td></tr><tr><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">classic </font></span></p></td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">javac1.1, javac1.2 </font></span></p></td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">Standard JDK 1.1/1.2 compiler </font></span></p></td></tr><tr><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">modern </font></span></p></td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">javac1.3, javac1.4 </font></span></p></td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">Standard JDK 1.3/1.4 compiler </font></span></p></td></tr><tr><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">jikes </font></span></p></td><td>　　</td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">The Jikes compiler </font></span></p></td></tr><tr><td>JVC</td><td><p style="TEXT-INDENT: 8.2pt; TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3"><a href="http://tech.163.com/special/2/000915N4/20050630microsoft.html"><font color="#0066cc">Microsoft</font></a></font></span></p></td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">Microsoft command-line compiler from the Microsoft SDK for Java/Visual J++ </font></span></p></td></tr><tr><td>KJC</td><td>　　</td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">The kopi compiler </font></span></p></td></tr><tr><td>GCJ</td><td>　　</td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">The gcj compiler (included as part of gcc) </font></span></p></td></tr><tr><td>SJ</td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">Symantec </font></span></p></td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">Symantec's Java compiler </font></span></p></td></tr><tr><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">extJavac</font></span></p></td><td>　　</td><td><p style="TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: Arial"><font size="3">Runs either the modern or classic compiler in a JVM of its own </font></span></p></td></tr></tbody></table><p><br /><br />　　由于JSP页面在第一次使用时已经被编译，那么你可能希望在更新新的jsp页面后马上对它进行编译。实际上，这个过程完全可以自动化，因为可以确认的是新的JSP页面在生产服务器和在测试服务器上的运行效果是一样的。 </p><p>　在Tomcat4的bin目录下有一个名为jspc的脚本。它仅仅是运行翻译阶段，而不是编译阶段，使用它可以在当前目录生成Java源文件。它是调试JSP页面的一种有力的手段。<br /><br />　　可以通过浏览器访问再确认一下编译的结果。这样就确保了文件被转换成serverlet，被编译了可直接执行。这样也准确地模仿了真实用户访问JSP页面，可以看到给用户提供的功能。也抓紧这最后一刻修改出现的bug并且修改它J<br /><br />　　Tomcat提供了一种通过请求来编译JSP页面的功能。例如，你可以在浏览器地址栏中输入<a href="http://localhost:8080/examples/jsp/dates/date.jsp?jsp_precompile=true"><font color="#0066cc">http://localhost:8080/examples/jsp/dates/date.jsp?jsp_precompile=true</font></a>，这样Tomcat就会编译data.jsp而不是执行它。此举唾手可得，不失为一种检验页面正确性的捷径。<br /><br />　　<strong>4</strong>. 其它<br /><br />　　前面我们提到过<a href="http://tech.163.com/special/O/000915A0/OS.html"><font color="#0066cc">操作系统</font></a>通过一些限制手段来防止恶意的服务攻击，同样Tomcat也提供了防止恶意攻击或禁止某些机器访问的设置。<br /><br />　　Tomcat提供了两个参数供你配置：RemoteHostValve 和RemoteAddrValve。 <br /><br />　　通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。 <br /><br />　　例如你可以把Admin Web application设置成只允许本地访问，设置如下：<br /></p><p>&lt;Context path="/path/to/secret_files" ...&gt; <br />&lt;Valve className="org.apache.catalina.valves.RemoteAddrValve" <br /><br />allow="127.0.0.1" deny=""/&gt; <br />&lt;/Context&gt;</p><p><br />　　如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。<br /></p><p> </p><p> Tomcat容量计划<br /><br />　　以下介绍针对Tomcat做容量计划的步骤：<br /><br />　　1） 量化负载。如果站点已经建立并运行，可以使用前面介绍的工具模仿用户访问，确定资源的需求量。<br /><br />　　2） 针对测试结果或测试过程中进行分析。需要知道那些请求造成了负载过重或者使用过多的资源，并与其它请求做比较，这样就确定了系统的瓶颈所在。例如：如果servlet在查询数据库的步骤上耗用较长的时间，那么就需要考虑使用缓冲池来降低响应时间。<br /><br />　　3） 确定性能最低标准。例如，你不想让用户花20秒来等待结果页面的返回，也就是说甚至在达到访问量的极限时，用户等待的时间也不能超过20秒种（从点击链接到看到返第一条返回数据）。这个时间中包含了数据库查询时间和文件访问时间。同类<a href="http://tech.163.com/production/"><font color="#0066cc">产品</font></a>性能在不同的公司可能有不同的标准，一般最好采取同行中的最低标准或对这个标准做出评估。<br /><br />　　4） 确定如何合理使用底层资源，并逐一进行测试。底层资源包括CPU、内存、存储器、带宽、<a href="http://tech.163.com/special/O/000915A0/OS.html"><font color="#0066cc">操作系统</font></a>、JVM等等。在各种生产环境上都按顺序进行部署和测试，观察是否符合需求。在测试Tomcat时尽量多采用几种JVM，并且调整JVM使用内存和Tomcat线程池的大小进行测试。同时为了达到资源充分合理稳定地使用的效果，还需针对测试过程中出现的硬件系统瓶颈进行处理确定合理的资源配置。这个过程最为复杂，而且一般由于没有可参考的值所以只能靠理论推断和经验总结。<br /><br />　　5） 如果通过第4步的反复测试如果达到了最优的组合，就可以在相同的生产环境上部署产品了。<br /><br />　　此外应牢记一定要文档化你的测试过程和结果，因为此后可能还会进行测试，这样就可以拿以前的测试结果做为参考。另外测试过程要反复多次进行，每次的条件可能都不一样，因此只有记录下来才能进行结果比较和最佳条件的选择。<br /><br />　　这样我们通过测试找到了最好的组合方式，各种资源得到了合理的配置，系统的性能得到了极大的提升。<br /><br /><br /><strong> 附加资料</strong><br /><br />　　很显然本文也很难全面而详尽地阐述性能优化过程。如果你进行更多研究的话可能会把性能调优做的更好，比如Java程序的性能调整、操作系统的调整、各种复杂环境与应用系统和其它所有与应用程序相关的东西。在这里提供一些文中提到的一些资源、文中提到的相关内容的链接以及本文的一些参考资料。<br /><br />　　<strong>1</strong>. Web性能测试资料及工具<br /><br />　　1） Jmeter Wiki首页，Jmeter为一个开源的100%Java开发的性能测试工具<br />　　<a href="http://wiki.apache.org/jakarta-jmeter/"><font color="#0066cc">http://wiki.apache.org/jakarta-jmeter/</font></a><br /><br />　　2） Apache Benchmark使用说明<br />　　<a href="http://httpd.apache.org/docs-2.0/programs/ab.html"><font color="#0066cc">http://httpd.apache.org/docs-2.0/programs/ab.html</font></a><br /><br />　　3） 一些Java相关测试工具的介绍，包含可以与Tomcat集成进行测试的工具<br />　　<a href="http://blog.csdn.net/wyingquan/"><font color="#0066cc">http://blog.csdn.net/wyingquan/</font></a><br /><br />　　4） LoadRunner® 是一种预测系统行为和性能的工业标准级负载测试工具。它通过模拟数据以千万计用户来实施并发负载来对整个企业架构进行测试，来帮助您更快的查找和发现问题。<br />　　<a href="http://www.mercury.com/us/products/performance-center/loadrunner/"><font color="#0066cc">http://www.mercury.com/us/products/performance-center/loadrunner/</font></a><br /><br /><br />　　<strong>2</strong>. 文中介绍的相关内容的介绍<br /><br />　　1） Apache 2.x + Tomcat 4.x做负载均衡，描述了如何利用jk配置集群的负载均衡。<br />　　<a href="http://raibledesigns.com/tomcat/index.html"><font color="#0066cc">http://raibledesigns.com/tomcat/index.html</font></a><br /><br />　　2） 容量计划的制定，收集了许多有关制定web站点容量计划的例子：<br />　　<a href="http://www.capacityplanning.com/"><font color="#0066cc">http://www.capacityplanning.com/</font></a><br /><br />　　3） 评测Tomcat5负载平衡与集群，<br />　　<a href="http://www.javaresearch.org/article/showarticle.jsp?column=556&amp;thread=19777"><font color="#0066cc">http://www.javaresearch.org/article/showarticle.jsp?column=556&amp;thread=19777</font></a><br /><br />　　4） Apache与Tomcat的安装与整合之整合篇<br />　　<a href="http://www.javaresearch.org/article/showarticle.jsp?column=23&amp;thread=18139"><font color="#0066cc">http://www.javaresearch.org/article/showarticle.jsp?column=23&amp;thread=18139</font></a><br /><br />　　5） 性能测试工具之研究，介绍了性能测试工具的原理与思路<br />　　<a href="http://www.51testing.com/emagzine/No2_2.htm"><font color="#0066cc">http://www.51testing.com/emagzine/No2_2.htm</font></a><br /><br />　　6） Java的内存泄漏<br />　　<a href="http://www.matrix.org.cn/resource/article/409.html"><font color="#0066cc">http://www.matrix.org.cn/resource/article/409.html</font></a><br /><br />　　7） Web服务器和应用程序服务器有什么区别？<br />　　<a href="http://www.matrix.org.cn/resource/article/1429.html"><font color="#0066cc">http://www.matrix.org.cn/resource/article/1429.html</font></a><br /><br />　　8） 详细讲解性能中数据库集群的问题<br />　　<a href="http://www.theserverside.com/articles/article.tss?l=DB_Break"><font color="#0066cc">http://www.theserverside.com/articles/article.tss?l=DB_Break</font></a><br clear="all" /></p><br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=646524</p></div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/38737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-02 15:31 <a href="http://www.blogjava.net/iKingQu/articles/38737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat的server.xml（中文版）</title><link>http://www.blogjava.net/iKingQu/articles/37488.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sun, 26 Mar 2006 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/37488.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/37488.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/37488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/37488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/37488.html</trackback:ping><description><![CDATA[
		<div class="postcontent">&lt;!-- Example Server Configuration File --&gt;<br />&lt;!-- Tomcat服务器配置示例文件 --&gt;<br /><br />&lt;!-- Note that component elements are nested corresponding to their<br />     parent-child relationships with each other --&gt;<br />&lt;!-- 注意，这些组件的构成是根据相互之间的父子关系进行嵌套的。--&gt;<br /><br />&lt;!-- A "Server" is a singleton element that represents the entire JVM,<br />     which may contain one or more "Service" instances. The Server<br />     listens for a shutdown command on the indicated port.<br /><br />     Note: A "Server" is not itself a "Container", so you may not<br />     define subcomponents such as "Valves" or "Loggers" at this level.<br /> --&gt;<br />&lt;!-- 一个“Server”是一个提供完整的JVM的独立组件，它可以包含一个或多个<br />     “Service”实例。服务器在指定的端口上监听shutdown命令。<br />     <br />     注意：一个“Server”自身不是一个“Container”（容器），因此在这里你<br />     不可以定义诸如“Valves”或者“Loggers”子组件<br />--&gt;<br /><br />&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;<br /><br /><br />  &lt;!-- Comment these entries out to disable JMX MBeans support --&gt;<br />  &lt;!-- 这些指令组件关闭JMX MBeans支持 --&gt;<br />  <br />  &lt;!-- You may also configure custom components (e.g. Valves/Realms) by<br />       including your own mbean-descriptor file(s), and setting the<br />       "descriptors" attribute to point to a ';' seperated list of paths<br />       (in the ClassLoader sense) of files to add to the default list.<br />       e.g. descriptors="/com/myfirm/mypackage/mbean-descriptor.xml"<br />  --&gt;<br />  &lt;!-- 你也可以通过包含你自己的mbean描述文件配置自定义的组件，然后设置<br />       “descriptors”属性为以“；”为分隔的文件名列表严将它添加到默认列表<br />       中，例如：descriptors="/com/myfirm/mypackage/mbean-descriptor.xml"。<br /> --&gt;<br />       <br />  &lt;Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"<br />            debug="0"/&gt;<br />  &lt;Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"<br />            debug="0"/&gt;<br /><br />  &lt;!-- Global JNDI resources --&gt;<br />  &lt;!-- 全局JNDI资源 --&gt;<br />  &lt;GlobalNamingResources&gt;<br /><br />    &lt;!-- Test entry for demonstration purposes --&gt;<br />    &lt;!-- 出于示例目的的测试入口 --&gt;<br />    &lt;Environment name="simpleValue" type="java.lang.Integer" value="30"/&gt;<br /><br />    &lt;!-- Editable user database that can also be used by<br />         UserDatabaseRealm to authenticate users --&gt;<br />    &lt;!-- 可编辑的，用来通过UserDatabaseRealm认证用户的用户数据库 --&gt;<br />    <br />    &lt;Resource name="UserDatabase" auth="Container"<br />              type="org.apache.catalina.UserDatabase"<br />       description="User database that can be updated and saved"&gt;<br />    &lt;/Resource&gt;<br />    &lt;ResourceParams name="UserDatabase"&gt;<br />      &lt;parameter&gt;<br />        &lt;name&gt;factory&lt;/name&gt;<br />        &lt;value&gt;org.apache.catalina.users.MemoryUserDatabaseFactory&lt;/value&gt;<br />      &lt;/parameter&gt;<br />      &lt;parameter&gt;<br />        &lt;name&gt;pathname&lt;/name&gt;<br />        &lt;value&gt;conf/tomcat-users.xml&lt;/value&gt;<br />      &lt;/parameter&gt;<br />    &lt;/ResourceParams&gt;<br /><br />  &lt;/GlobalNamingResources&gt;<br /><br />  &lt;!-- A "Service" is a collection of one or more "Connectors" that share<br />       a single "Container" (and therefore the web applications visible<br />       within that Container). Normally, that Container is an "Engine",<br />       but this is not required.<br /><br />       Note: A "Service" is not itself a "Container", so you may not<br />       define subcomponents such as "Valves" or "Loggers" at this level.<br />   --&gt;<br />  &lt;!-- 一个“Service”是一个或多个共用一个单独“Container”(容器)的“Connectors”<br />       组合（因此，应用程序在容器中可见）。通常，这个容器是一个“Engine”<br />       （引擎），但这不是必须的。<br />       <br />       注意：一个“Service”自身不是一个容器，因此，在这个级别上你不可定义<br />       诸如“Valves”或“Loggers”子组件。<br />  --&gt;<br /><br />  &lt;!-- Define the Tomcat Stand-Alone Service --&gt;<br />  &lt;!-- 定义Tomcat的标准独立服务 --&gt;<br />  &lt;Service name="Catalina"&gt;<br /><br />    &lt;!-- A "Connector" represents an endpoint by which requests are received<br />         and responses are returned. Each Connector passes requests on to the<br />         associated "Container" (normally an Engine) for processing.<br /><br />         By default, a non-SSL HTTP/1.1 Connector is established on port 8080.<br />         You can also enable an SSL HTTP/1.1 Connector on port 8443 by<br />         following the instructions below and uncommenting the second Connector<br />         entry. SSL support requires the following steps (see the SSL Config<br />         HOWTO in the Tomcat 5 documentation bundle for more detailed<br />         instructions):<br />         * If your JDK version 1.3 or prior, download and install JSSE 1.0.2 or<br />           later, and put the JAR files into "$JAVA_HOME/jre/lib/ext".<br />         * Execute:<br />             %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)<br />             $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA (Unix)<br />           with a password value of "changeit" for both the certificate and<br />           the keystore itself.<br /><br />         By default, DNS lookups are enabled when a web application calls<br />         request.getRemoteHost(). This can have an adverse impact on<br />         performance, so you can disable it by setting the<br />         "enableLookups" attribute to "false". When DNS lookups are disabled,<br />         request.getRemoteHost() will return the String version of the<br />         IP address of the remote client.<br />    --&gt;<br />    &lt;!-- 一个“Connector”（连接器）代表一个请求被接收和应答所需要的端点。每个连<br />         接器通过相关的“Container”（容器）处理请求。<br />         <br />         默认情况下，一个非SSL的HTTP/1.1的连接器被绑定在端口8080。你也可以通过<br />         根据后面的使用说明并取消第二个连接器入口的注释，在端口8443上建立一个<br />         SSL HTTP/1.1的连接器。开放SSL支持需要下面几步（参见Tomcat 5文档中怎样<br />         配置SSL的说明以取得更多的详细信息）：<br />         * 如果你的JDK是1.3或1.3以前的版本，下载安装JSSE 1.0.2或以后版本，并放<br />           置JAR文件到“$JAVA_HOME/jre/lib/ext”目录下。<br />         * 带一个“changeit”的口令值执行：<br />             %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)<br />             $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA (UNIX)<br />           来生成它自己的证书私钥。<br />           <br />         默认情况下，当一个web应用程序调用请求时，DNS查询是可行的。这将对性能造<br />         成一些不利的影响，因此，你可以将“enableLookups”设置为“false”来关闭DNS<br />         查询。当DNS查询被关闭时，request.getRemoteHost()将返回包含远程客户IP地<br />         址的字符串。<br />  --&gt;<br /><br />    &lt;!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --&gt;<br />    &lt;!-- 在8080端口上定义一个非SSL的HTTP/1.1连接器 --&gt;<br />    &lt;Connector port="8080"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               debug="0" connectionTimeout="20000"<br />               disableUploadTimeout="true" /&gt;<br />    &lt;!-- Note : To disable connection timeouts, set connectionTimeout value<br />     to 0 --&gt;<br />    &lt;!-- 注意，要关闭连接超时，将connectionTimeout设置为0 --&gt;<br /><br />&lt;!-- Note : To use gzip compression you could set the following properties :<br /><br />compression="on"<br />compressionMinSize="2048"<br />noCompressionUserAgents="gozilla, traviata"<br />compressableMimeType="text/html,text/xml"<br />--&gt;<br />&lt;!-- 注意：要使用gzip压缩需要设置如下属性：<br /><br />compression="on"<br />compressionMinSize="2048"<br />noCompressionUserAgents="gozilla,traviata"<br />compressableMimeType="text/html,text/xml"<br />--&gt;<br /><br />    &lt;!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 --&gt;<br />    &lt;!-- 在端口8443上定义一个SSL的HTTP/1.1的连接器 --&gt;<br />    &lt;!--<br />    &lt;Connector port="8443"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" disableUploadTimeout="true"<br />               acceptCount="100" debug="0" scheme="https" secure="true"<br />               clientAuth="false" sslProtocol="TLS" /&gt;<br />    --&gt;<br /><br />    &lt;!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 --&gt;<br />    &lt;!-- 在端口8009上定义一个Coyote/JK2 AJP 1.3连接器 --&gt;<br />    &lt;Connector port="8009"<br />               enableLookups="false" redirectPort="8443" debug="0"<br />               protocol="AJP/1.3" /&gt;<br /><br />    &lt;!-- Define a Proxied HTTP/1.1 Connector on port 8082 --&gt;<br />    &lt;!-- 在8082端口上定义一个代理HTTP/1.1连接器 --&gt;<br />    &lt;!-- See proxy documentation for more information about using this. --&gt;<br />    &lt;!-- 参见代理文档以取得这里使用属性的更多的信息。 --&gt;<br />    &lt;!--<br />    &lt;Connector port="8082"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false"<br />               acceptCount="100" debug="0" connectionTimeout="20000"<br />               proxyPort="80" disableUploadTimeout="true" /&gt;<br />    --&gt;<br /><br />    &lt;!-- An Engine represents the entry point (within Catalina) that processes<br />         every request. The Engine implementation for Tomcat stand alone<br />         analyzes the HTTP headers included with the request, and passes them<br />         on to the appropriate Host (virtual host). --&gt;<br />    &lt;!-- 一个“Engine”（引擎）代表处理每个请求的入口点（在Catalina内）。这个Tomcat<br />         的标准独立引擎实现分析包含在请求中的HTTP头信息，并将请求传送到适当的主机<br />         或虚拟主机上。--&gt;<br /><br />    &lt;!-- You should set jvmRoute to support load-balancing via JK/JK2 ie :<br />    &lt;Engine name="Standalone" defaultHost="localhost" debug="0" jvmRoute="jvm1"&gt;<br />    --&gt;<br />    &lt;!-- 你应该这样设置jvmRoute以便在JK/JK2通道上支持负载平衡：<br />    &lt;Engine name="Standalone" defaultHost="localhost" debug="0" jvmRoute="jvm1"&gt;<br />    --&gt;<br />         <br />    &lt;!-- Define the top level container in our container hierarchy --&gt;<br />    &lt;!-- 在我们的容器体系中定义最高级别的容器 --&gt;<br />    &lt;Engine name="Catalina" defaultHost="localhost" debug="0"&gt;<br /><br />      &lt;!-- The request dumper valve dumps useful debugging information about<br />           the request headers and cookies that were received, and the response<br />           headers and cookies that were sent, for all requests received by<br />           this instance of Tomcat. If you care only about requests to a<br />           particular virtual host, or a particular application, nest this<br />           element inside the corresponding &lt;Host&gt; or &lt;Context&gt; entry instead.<br /><br />           For a similar mechanism that is portable to all Servlet 2.4<br />           containers, check out the "RequestDumperFilter" Filter in the<br />           example application (the source for this filter may be found in<br />           "$CATALINA_HOME/webapps/examples/WEB-INF/classes/filters").<br /><br />           Request dumping is disabled by default. Uncomment the following<br />           element to enable it. --&gt;<br />      &lt;!-- 请求转储器值转储非常有用的通过Tomcat这个实例接收到的所有请求的，关于<br />           接收到的请求头和cookies，以及发送出的回应头和cookies的调试信息。如果<br />           你只在意一个特定的虚拟主机或者一个特定应用程序的请求，在对应的&lt;Host&gt;<br />           或&lt;Context&gt;入口中套用这个元素。<br />           <br />           对于所有的Servlet（小服务程序）2.4来所，在示例程序中检验<br />           “RequestDumperFilter”过滤是非常容易的（这个过滤器源代码可以在<br />           “$CATALINA_HOME/webapps/examples/WEB-INF/classes/filters”下找到。<br />           <br />           请求转储默认情况下是关闭的，如果要使用它，取消下面行的注释符。--&gt;<br />      &lt;!--<br />      &lt;Valve className="org.apache.catalina.valves.RequestDumperValve"/&gt;<br />      --&gt;<br /><br />      &lt;!-- Global logger unless overridden at lower levels --&gt;<br />      &lt;!-- 全局日志设置，除非在更低的级别上覆盖它的设置 --&gt;<br />      &lt;Logger className="org.apache.catalina.logger.FileLogger"<br />              prefix="catalina_log." suffix=".txt"<br />              timestamp="true"/&gt;<br /><br />      &lt;!-- Because this Realm is here, an instance will be shared globally --&gt;<br />      &lt;!-- 因为这个Realm（区域）在这儿，因此这个实例将被全局共享。 --&gt;<br /><br />      &lt;!-- This Realm uses the UserDatabase configured in the global JNDI<br />           resources under the key "UserDatabase". Any edits<br />           that are performed against this UserDatabase are immediately<br />           available for use by the Realm. --&gt;<br />      &lt;!-- 这个Realm（区域）使用在全局JNDI资源下，由“UserDatabase”配置的用户<br />           数据库。通过使用Realm将使对于这个用户数据库的任何编辑都将会立即可用<br />      &lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm"<br />                 debug="0" resourceName="UserDatabase"/&gt;<br /><br />      &lt;!-- Comment out the old realm but leave here for now in case we<br />           need to go back quickly --&gt;<br />      &lt;!-- 注释掉旧有的Realm以便我们能很快速的恢复旧有配置。 --&gt;<br />      &lt;!--<br />      &lt;Realm className="org.apache.catalina.realm.MemoryRealm" /&gt;<br />      --&gt;<br /><br />      &lt;!-- Replace the above Realm with one of the following to get a Realm<br />           stored in a database and accessed via JDBC --&gt;<br />      &lt;!-- 下面的属性用于从储存在数据库或从JDBC通道中得到的Realm以取代上面的<br />           Realm配置。--&gt;<br /><br />      &lt;!--<br />      &lt;Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"<br />             driverName="org.gjt.mm.mysql.Driver"<br />          connectionURL="jdbc:mysql://localhost/authority"<br />         connectionName="test" connectionPassword="test"<br />              userTable="users" userNameCol="user_name" userCredCol="user_pass"<br />          userRoleTable="user_roles" roleNameCol="role_name" /&gt;<br />      --&gt;<br /><br />      &lt;!--<br />      &lt;Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"<br />             driverName="oracle.jdbc.driver.OracleDriver"<br />          connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL"<br />         connectionName="scott" connectionPassword="tiger"<br />              userTable="users" userNameCol="user_name" userCredCol="user_pass"<br />          userRoleTable="user_roles" roleNameCol="role_name" /&gt;<br />      --&gt;<br /><br />      &lt;!--<br />      &lt;Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"<br />             driverName="sun.jdbc.odbc.JdbcOdbcDriver"<br />          connectionURL="jdbc:odbc:CATALINA"<br />              userTable="users" userNameCol="user_name" userCredCol="user_pass"<br />          userRoleTable="user_roles" roleNameCol="role_name" /&gt;<br />      --&gt;<br /><br />      &lt;!-- Define the default virtual host<br />           Note: XML Schema validation will not work with Xerces 2.2.<br />       --&gt;<br />      &lt;!-- 定义默认的虚拟主机<br />           注意：XML模式确认将不能与Xerces 2.2同工作。<br />      --&gt;<br />      &lt;Host name="localhost" debug="0" appBase="webapps"<br />       unpackWARs="true" autoDeploy="true"<br />       xmlValidation="false" xmlNamespaceAware="false"&gt;<br /><br />        &lt;!-- Defines a cluster for this node,<br />             By defining this element, means that every manager will be changed.<br />             So when running a cluster, only make sure that you have webapps in there<br />             that need to be clustered and remove the other ones.<br />             A cluster has the following parameters:<br />             为这个结点定义一个群集，通过定义这个元素，意味着每个管理员都将被改变。<br />             因此，当运行一个群集时，只有确认在必须被聚集和移除其他的地方有你的<br />             web软件。<br />             一个群集有下面这些参数：<br /><br />             className = the fully qualified name of the cluster class<br />             className = 这个群集类的全限定名<br /><br />             name = a descriptive name for your cluster, can be anything<br />             name = 你的群集的描述名，可以是任何描述<br /><br />             debug = the debug level, higher means more output<br />             debug = 调试级别，更高意味着更多的输出<br /><br />             mcastAddr = the multicast address, has to be the same for all the nodes<br />             mcastAddr = 多播地址，所有的节点都必须有同样的多播地址<br /><br />             mcastPort = the multicast port, has to be the same for all the nodes<br />             mcastPort = 多播端口，对所有的节点都必须有同样的多播端口<br />             <br />             mcastBindAddr = bind the multicast socket to a specific address<br />             mcastBindAddr = 绑定多播套接字到一个指定的地址<br />             <br />             mcastTTL = the multicast TTL if you want to limit your broadcast<br />             mcastTTL = 多播生存期，如果你想要限制你的广播的话<br />             <br />             mcastSoTimeout = the multicast readtimeout<br />             mcastSoTimeout = 多播读取超时<br /><br />             mcastFrequency = the number of milliseconds in between sending a "I'm alive" heartbeat<br />             mcastFrequency = 发送“I'm alive”（我还活着）信息的间隔毫秒数<br /><br />             mcastDropTime = the number a milliseconds before a node is considered "dead" if no heartbeat is received<br />             mcastDropTime = 多长时间没有收到“I'm alive”就将这个节点标识为死节点（单位：毫秒）<br /><br />             tcpThreadCount = the number of threads to handle incoming replication requests, optimal would be the same amount of threads as nodes<br />             tcpThreadCount = 用于处理重复引入请求的线程数，最好是每个节点都有相同的线程数<br /><br />             tcpListenAddress = the listen address (bind address) for TCP cluster request on this host,<br />                                in case of multiple ethernet cards.<br />                                auto means that address becomes<br />                                InetAddress.getLocalHost().getHostAddress()<br />             tcpListenAddress = 在有多块以太网卡的主机上的监听TCP群集请求的地址（绑定地址），<br />                                auto意味着地址由InetAddress.getLocalHost().getHostAddress()取得。<br /><br />             tcpListenPort = the tcp listen port<br />             tcpListenPort = tcp监听端口<br /><br />             tcpSelectorTimeout = the timeout (ms) for the Selector.select() method in case the OS<br />                                  has a wakup bug in java.nio. Set to 0 for no timeout<br />             tcpSelectorTimeout = 在操作系统中有java.nio唤醒错的情况下，使用Selector.select()的超时<br />                                  毫秒数。设为0则没有超时限制<br /><br />             printToScreen = true means that managers will also print to std.out<br />             printToScreen = true意味着管理员的相关信息也将打印输出到std.out<br /><br />             expireSessionsOnShutdown = true means that<br />             expireSessionsOnShutdown = true 意味着?????<br /><br />             useDirtyFlag = true means that we only replicate a session after setAttribute,removeAttribute has been called.<br />                            false means to replicate the session after each request.<br />                            false means that replication would work for the following piece of code:<br />                            &lt;%<br />                            HashMap map = (HashMap)session.getAttribute("map");<br />                            map.put("key","value");<br />                            %&gt;<br />             useDirtyFlag = true意味着我们只能在调用setAttribute，removeAttribute后才能复制一个会话；<br />                            false意味着在每个请求后复制会话。<br />                            false意味着复制将以下列代码方式工作：<br />                            &lt;%<br />                            HashMap map = (HashMap)session.getAttribute("map");<br />                            map.put("key","value");<br />                            %&gt;<br />                            <br />             replicationMode = can be either 'pooled', 'synchronous' or 'asynchronous'.<br />                               * Pooled means that the replication happens using several sockets in a synchronous way. Ie, the data gets replicated, then the request return. This is the same as the 'synchronous' setting except it uses a pool of sockets, hence it is multithreaded. This is the fastest and safest configuration. To use this, also increase the nr of tcp threads that you have dealing with replication.<br />                               * Synchronous means that the thread that executes the request, is also the<br />                               thread the replicates the data to the other nodes, and will not return until all<br />                               nodes have received the information.<br />                               * Asynchronous means that there is a specific 'sender' thread for each cluster node,<br />                               so the request thread will queue the replication request into a "smart" queue,<br />                               and then return to the client.<br />                               The "smart" queue is a queue where when a session is added to the queue, and the same session<br />                               already exists in the queue from a previous request, that session will be replaced<br />                               in the queue instead of replicating two requests. This almost never happens, unless there is a<br />                               large network delay.<br />             replicationMode = 可以是“pooled”、“synchronous”或者“asynchronous”<br />                               * Pooled意味着在多个套接字上同步进行复制。例如，先复制数据，然后请求返回。<br />                               这与“synchronous”相同，除了它使用一个套接字池，因此，它是多线程的。它是<br />                               最快和最高级的设置，使用这个配置也增加了处理复制的tcp线程的域。<br />                               * Synchronous指执行请求的线程，它也是向其他节点复制数据的线程，并且直到<br />                               所有的节点都己经收到信息后才返回。<br />                               * Asynchronous，对每个群集节点而言，这是一个特别的“sender”（发送者）线程，<br />                               因此请求线程将复制请求排队到一个小队列中，然后，返回给用户。<br />                               这个小队列是一个当会话被添加到队列中，而从先前的请求中，同一个会话己经存在<br />                               ，这个会话将被放置在队列中以代替重复的两个请求。这几乎从不会发生，除非存在<br />                               较大的网络延迟。<br />        --&gt;<br />        &lt;!--<br />            When configuring for clustering, you also add in a valve to catch all the requests<br />            coming in, at the end of the request, the session may or may not be replicated.<br />            A session is replicated if and only if all the conditions are met:<br />            1. useDirtyFlag is true or setAttribute or removeAttribute has been called AND<br />            2. a session exists (has been created)<br />            3. the request is not trapped by the "filter" attribute<br /><br />            The filter attribute is to filter out requests that could not modify the session,<br />            hence we don't replicate the session after the end of this request.<br />            The filter is negative, ie, anything you put in the filter, you mean to filter out,<br />            ie, no replication will be done on requests that match one of the filters.<br />            The filter attribute is delimited by ;, so you can't escape out ; even if you wanted to.<br /><br />            filter=".*\.gif;.*\.js;" means that we will not replicate the session after requests with the URI<br />            ending with .gif and .js are intercepted.<br />        --&gt;<br />        &lt;!-- 当配置群集时，你也添加一个值来捕获所有传入的请求，在请求结束时，这个会话可能被子复制，<br />             也可能不被复制。一个会话是否复制取决于下列条件是否发生：<br />             1. useDirtyFlag为真，或者setAttribute或者removeAttribute己经被调用。<br />             2. 会话己经存在（己经被创建了）。<br />             3. 请求没有被“filter”属性所捕获。<br />             <br />             这个filter（过滤器）属性用于过滤那些不能修改会话的请求，因此，我们在这个请求结束后不复制<br />             会主。这个过滤器是消极的，例如，你向过滤器发送了一些东西，然后被过滤出去，在那个匹配的过<br />             滤器上不会发生复制。<br />             过滤器属性以分号为分隔，因此你不能换行，即使你想这么做。<br />             <br />             filter=".*\.gif;.*\.js;"意味着在进行以.gif和.js结束的URI请求后不复制会话。<br />        <br />        &lt;!--<br />        &lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"<br />                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"<br />                 expireSessionsOnShutdown="false"<br />                 useDirtyFlag="true"&gt;<br /><br />            &lt;Membership<br />                className="org.apache.catalina.cluster.mcast.McastService"<br />                mcastAddr="228.0.0.4"<br />                mcastPort="45564"<br />                mcastFrequency="500"<br />                mcastDropTime="3000"/&gt;<br /><br />            &lt;Receiver<br />                className="org.apache.catalina.cluster.tcp.ReplicationListener"<br />                tcpListenAddress="auto"<br />                tcpListenPort="4001"<br />                tcpSelectorTimeout="100"<br />                tcpThreadCount="6"/&gt;<br /><br />            &lt;Sender<br />                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"<br />                replicationMode="pooled"/&gt;<br /><br />            &lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"<br />                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/&gt;<br />        &lt;/Cluster&gt;<br />        --&gt;<br /><br /><br /><br />        &lt;!-- Normally, users must authenticate themselves to each web app<br />             individually. Uncomment the following entry if you would like<br />             a user to be authenticated the first time they encounter a<br />             resource protected by a security constraint, and then have that<br />             user identity maintained across *all* web applications contained<br />             in this virtual host. --&gt;<br />        &lt;!-- 通常，对每一个应用程序，用户必须逐个的认证他们自己。当他们遇到被<br />             某种安全约束所保护的资源时，如果你想让用户只在第一次被认证，那么，<br />             取消下面入口行的注释，然后在这个虚拟主机中包含这个用户的，横跨所有<br />             web应用程序的用户身份识别。--&gt;<br />             <br />        &lt;!--<br />        &lt;Valve className="org.apache.catalina.authenticator.SingleSignOn"<br />                   debug="0"/&gt;<br />        --&gt;<br /><br />        &lt;!-- Access log processes all requests for this virtual host. By<br />             default, log files are created in the "logs" directory relative to<br />             $CATALINA_HOME. If you wish, you can specify a different<br />             directory with the "directory" attribute. Specify either a relative<br />             (to $CATALINA_HOME) or absolute path to the desired directory.<br />        --&gt;<br />        &lt;!-- 这个虚拟主机的所有请求的访问日志过程。默认情况下，日志文件被创建在相对<br />             于$CATALINA_HOME目录下的logs目录下。通过directory属性，你也可以指定一个<br />             不同的目录，如果你想的话。可以使用相对路径（相对于$CATALINA_HOME），也<br />             可以使用绝对路径。--&gt;<br />        &lt;!--<br />        &lt;Valve className="org.apache.catalina.valves.AccessLogValve"<br />                 directory="logs" prefix="localhost_access_log." suffix=".txt"<br />                 pattern="common" resolveHosts="false"/&gt;<br />        --&gt;<br /><br />        &lt;!-- Logger shared by all Contexts related to this virtual host. By<br />             default (when using FileLogger), log files are created in the "logs"<br />             directory relative to $CATALINA_HOME. If you wish, you can specify<br />             a different directory with the "directory" attribute. Specify either a<br />             relative (to $CATALINA_HOME) or absolute path to the desired<br />             directory.--&gt;<br />        &lt;!-- 与这个虚拟主机有关系所有上下文所共享的日志。默认情况下（使用FileLogger时），<br />             日志文件被创建在相对于$CATALINA_HOME目录下的logs目录下。如果你希望，你也可<br />             以给directory指定一个不同的路径。可以使用相对于$CATALINA_HOME的相对路径，也<br />             可以使用绝对路径。<br />        &lt;Logger className="org.apache.catalina.logger.FileLogger"<br />                 directory="logs" prefix="localhost_log." suffix=".txt"<br />            timestamp="true"/&gt;<br /><br />      &lt;/Host&gt;<br /><br />    &lt;/Engine&gt;<br /><br />  &lt;/Service&gt;<br /><br />&lt;/Server&gt; </div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/37488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-26 18:20 <a href="http://www.blogjava.net/iKingQu/articles/37488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]在Tomcat下JSP、Servlet和JavaBean环境的配置</title><link>http://www.blogjava.net/iKingQu/articles/36754.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 21 Mar 2006 19:19:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36754.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36754.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36754.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<font face="Verdana">
						<span class="Title">
								<font face="Verdana">在Tomcat下JSP、Servlet和JavaBean环境的配置</font>
						</span>
				</font>
				<p>
						<font face="verdana, arial, helvetica">
								<span class="javascript" id="text2366143">
										<font size="2">创建时间: 2004-11-30<br />文章提交: 孤独<br />经常看到jsp的初学者问tomcat下如何配置jsp、servlet和bean的问题，于是总结了一下如何tomcat下配置jsp、servlet和ben，希望对那些初学者有所帮助。 <br /><br />第一步：下载j2sdk和tomcat：到sun官方站点（</font>
										<a href="http://java.sun.com/j2se/1.4.2/download.html" target="_blank">
												<font size="2">http://java.sun.com/j2se/1.4.2/download.html</font>
										</a>
										<font size="2">）下载j2sdk，注意下载版本为Windows Offline Installation的SDK，同时最好下载J2SE 1.4.2 Documentation，然后到tomcat官方站点（</font>
										<a href="http://www.apache.org/dist/jakarta/tomcat-4/" target="_blank">
												<font size="2">http://www.apache.org/dist/jakarta/tomcat-4/</font>
										</a>
										<font size="2">）下载tomcat（下载最新4.1.x版本的tomcat）； <br /><br />第二步：安装和配置你的j2sdk和tomcat：执行j2sdk和tomcat的安装程序，然后按默认设置进行安装即可。 <br />1.安装j2sdk以后，需要配置一下环境变量，在我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量(假定你的j2sdk安装在c:\j2sdk1.4.2）： <br />JAVA_HOME=c:\j2sdk1.4.2 <br />classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;（.;一定不能少，因为它代表当前路径) <br />path=%JAVA_HOME%\bin <br />接着可以写一个简单的java程序来测试J2SDK是否已安装成功： <br />public class Test{ <br />public static void main(String args[]){ <br />System.out.println("This is a test program."); <br />} <br />} <br />将上面的这段程序保存为文件名为Test.java的文件。 <br />然后打开命令提示符窗口，cd到你的Test.java所在目录，然后键入下面的命令 <br />javac Test.java <br />java Test <br />此时如果看到打印出来This is a test program.的话说明安装成功了，如果没有打印出这句话，你需要仔细检查一下你的配置情况。 <br /><br />2.安装Tomcat后，在我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量(假定你的tomcat安装在c:\tomcat）： <br />CATALINA_HOME=c:\tomcat; <br />CATALINA_BASE=c:\tomcat; <br />然后修改环境变量中的classpath，把tomat安装目录下的common\lib下的servlet.jar追加到classpath中去，修改后的classpath如下： <br />classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar; <br />接着可以启动tomcat，在IE中访问</font>
										<a href="http://localhost:8080/" target="_blank">
												<font size="2">http://localhost:8080</font>
										</a>
										<font size="2">
												<br />如果看到tomcat的欢迎页面的话说明安装成功了。<br /><br />第三步：建立自己的jsp app目录 <br />1.到Tomcat的安装目录的webapps目录，可以看到ROOT，examples, tomcat-docs之类Tomcat自带的的目录； <br />2.在webapps目录下新建一个目录，起名叫myapp； <br />3.myapp下新建一个目录WEB-INF，注意，目录名称是区分大小写的； <br />4.WEB-INF下新建一个文件web.xml，内容如下： <br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; <br /><br />&lt;!DOCTYPE web-app <br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" <br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt; <br /><br />&lt;web-app&gt; <br />&lt;display-name&gt;My Web Application&lt;/display-name&gt; <br />&lt;description&gt; <br />A application for test. <br />&lt;/description&gt; <br />&lt;/web-app&gt; <br />5.在myapp下新建一个测试的jsp页面，文件名为index.jsp，文件内容如下： <br />&lt;html&gt;&lt;body&gt;&lt;center&gt; <br />Now time is: &lt;%=new java.util.Date()%&gt; <br />&lt;/center&gt;&lt;/body&gt;&lt;/html&gt; <br />6.重启Tomcat <br />7.打开浏览器，输入</font>
										<a href="http://localhost:8080/myapp/index.jsp" target="_blank">
												<font size="2">http://localhost:8080/myapp/index.jsp</font>
										</a>
										<font size="2">看到当前时间的话说明就成功了。 <br /><br />第四步：建立自己的Servlet： <br />1.用你最熟悉的编辑器（建议使用有语法检查的java ide）新建一个servlet程序，文件名为Test.java，文件内容如下： <br />package test; <br />import java.io.IOException; <br />import java.io.PrintWriter; <br />import javax.servlet.ServletException; <br />import javax.servlet.http.HttpServlet; <br />import javax.servlet.http.HttpServletRequest; <br />import javax.servlet.http.HttpServletResponse; <br />public class Test extends HttpServlet { <br />protected void doGet(HttpServletRequest request, HttpServletResponse response) <br />throws ServletException, IOException { <br />PrintWriter out=response.getWriter(); <br />out.println("&lt;html&gt;&lt;body&gt;&lt;h1&gt;This is a servlet test.&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;"); <br />out.flush(); <br />} <br />} <br />2 .编译 <br />将Test.java放在c:\test下，使用如下命令编译： <br />C:\Test&gt;javac Test.java <br />然后在c:\Test下会产生一个编译后的servlet文件：Test.class <br />3 .将结构test\Test.class剪切到%CATALINA_HOME%\webapps\myapp\WEB-INF\classes下，也就是剪切那个test目录到classes目录下，如果classes目录不存在，就新建一个。 现在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目录结构 <br />4 .修改webapps\myapp\WEB-INF\web.xml，添加servlet和servlet-mapping <br />编辑后的web.xml如下所示，红色为添加的内容: <br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; <br /><br />&lt;!DOCTYPE web-app <br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" <br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt; <br /><br />&lt;web-app&gt; <br />&lt;display-name&gt;My Web Application&lt;/display-name&gt; <br />&lt;description&gt; <br />A application for test. <br />&lt;/description&gt; <br />&lt;servlet&gt; <br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt; <br />&lt;display-name&gt;Test&lt;/display-name&gt; <br />&lt;description&gt;A test Servlet&lt;/description&gt; <br />&lt;servlet-class&gt;test.Test&lt;/servlet-class&gt; <br />&lt;/servlet&gt; <br />&lt;servlet-mapping&gt; <br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt; <br />&lt;url-pattern&gt;/Test&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt; <br />&lt;/web-app&gt; <br />这段话中的servlet这一段声明了你要调用的Servlet，而servlet-mapping则是将声明的servlet“映射”到地址/Test上 <br />5 .好了，启动Tomcat，启动浏览器，输入</font>
										<a href="http://localhost:8080/myapp/Test" target="_blank">
												<font size="2">http://localhost:8080/myapp/Test</font>
										</a>
										<font size="2">如果看到输出This is a servlet test.就说明编写的servlet成功了。 <br />注意：修改了web.xml以及新加了class，都要重启Tomcat <br /><br />第四步：建立自己的Bean： <br />1.用你最熟悉的编辑器（建议使用有语法检查的java ide）新建一个java程序，文件名为TestBean.java，文件内容如下： <br />package test; <br />public class TestBean{ <br />private String name = null; <br />public TestBean(String strName_p){ <br />this.name=strName_p; <br />} <br />public void setName(String strName_p){ <br />this.name=strName_p; <br />} <br />public String getName(){ <br />return this.name; <br />} <br />} <br />2 .编译 <br />将TestBean.java放在c:\test下，使用如下命令编译： <br />C:\Test&gt;javac TestBean.java <br />然后在c:\Test下会产生一个编译后的bean文件：TestBean.class <br />3 .将TestBean.class文件剪切到 %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下， <br />4 .新建一个TestBean.jsp文件，文件内容为： <br />&lt;%@ page import="test.TestBean" %&gt; <br />&lt;html&gt;&lt;body&gt;&lt;center&gt; <br />&lt;% <br />TestBean testBean=new TestBean("This is a test java bean."); <br />%&gt; <br />Java bean name is: &lt;%=testBean.getName()%&gt; <br />&lt;/center&gt;&lt;/body&gt;&lt;/html&gt; <br />5 .好了，重启Tomcat，启动浏览器，输入</font>
										<a href="http://localhost:8080/myapp/TestBean.jsp" target="_blank">
												<font size="2">http://localhost:8080/myapp/TestBean.jsp</font>
										</a>
										<font size="2">如果看到输出Java bean name is: This is a test java bean.就说明编写的Bean成功了。 <br /><br />这样就完成了整个Tomcat下的jsp、servlet和javabean的配置。接下来需要做的事情就是多看书、多读别人的好代码，自己多动手写代码以增强自己在这方面开发的能力了。</font>
								</span>
						</font>
				</p>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=625190</p>
		</div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-22 03:19 <a href="http://www.blogjava.net/iKingQu/articles/36754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat启动分析</title><link>http://www.blogjava.net/iKingQu/articles/36503.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:54:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36503.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36503.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36503.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<h3>1 - Tomcat Server的组成部分 </h3>
				<p>
						<strong>1.1 - Server </strong>
				</p>
				<p>A Server element represents the entire Catalina servlet container. (Singleton) </p>
				<p>
						<strong>1.2 - Service </strong>
				</p>
				<p>A Service element represents the combination of o­ne or more Connector components that share a single Engine<br />Service是这样一个集合：它由一个或者多个Connector组成，以及一个Engine，负责处理所有Connector所获得的客户请求<br /></p>
				<p>
						<strong>1.3 - Connector </strong>
				</p>
				<p>一个Connector将在某个指定端口上侦听客户请求，并将获得的请求交给Engine来处理，从Engine处获得回应并返回客户<br />TOMCAT有两个典型的Connector，一个直接侦听来自browser的http请求，一个侦听来自其它WebServer的请求<br />Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求<br />Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求<br /></p>
				<p>
						<strong>1.4 - Engine </strong>
				</p>
				<p>The Engine element represents the entire request processing machinery associated with a particular Service<br />It receives and processes all requests from o­ne or more Connectors<br />and returns the completed response to the Connector for ultimate transmission back to the client<br />Engine下可以配置多个虚拟主机Virtual Host，每个虚拟主机都有一个域名<br />当Engine获得一个请求时，它把该请求匹配到某个Host上，然后把该请求交给该Host来处理<br />Engine有一个默认虚拟主机，当请求无法匹配到任何一个Host上的时候，将交给该默认Host来处理<br /></p>
				<p>
						<strong>1.5 - Host </strong>
				</p>
				<p> </p>
				<p>代表一个Virtual Host，虚拟主机，每个虚拟主机和某个网络域名Domain Name相匹配<br />每个虚拟主机下都可以部署(deploy)一个或者多个Web App，每个Web App对应于一个Context，有一个Context path<br />当Host获得一个请求时，将把该请求匹配到某个Context上，然后把该请求交给该Context来处理<br />匹配的方法是“最长匹配”，所以一个path==""的Context将成为该Host的默认Context<br />所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配<br /></p>
				<p>
						<strong>1.6 - Context </strong>
				</p>
				<p>一个Context对应于一个Web Application，一个Web Application由一个或者多个Servlet组成<br />Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类<br />当Context获得请求时，将在自己的映射表(mapping table)中寻找相匹配的Servlet类<br />如果找到，则执行该类，获得请求的回应，并返回<br /></p>
				<h3>2 - Tomcat Server的结构图 </h3>
				<p>
						<img alt="" src="http://www.huihoo.com/apache/tomcat/heavyz/01-startup.gif" tppabs="http://zooo.51.net/heavyz/cs/tomcat/notes/01-startup.gif" />
				</p>
				<h3>3 - 配置文件$CATALINA_HOME/conf/server.xml的说明 </h3>
				<p>该文件描述了如何启动Tomcat Server </p>
				<p>
						<tt>
						</tt>
				</p>
				<h3>4 - Context的部署配置文件web.xml的说明 </h3>
				<p>一个Context对应于一个Web App，每个Web App是由一个或者多个servlet组成的<br />当一个Web App被初始化的时候，它将用自己的ClassLoader对象载入“部署配置文件web.xml”中定义的每个servlet类<br />它首先载入在$CATALINA_HOME/conf/web.xml中部署的servlet类<br />然后载入在自己的Web App根目录下的WEB-INF/web.xml中部署的servlet类<br />web.xml文件有两部分：servlet类定义和servlet映射定义<br />每个被载入的servlet类都有一个名字，且被填入该Context的映射表(mapping table)中，和某种URL PATTERN对应<br />当该Context获得请求时，将查询mapping table，找到被请求的servlet，并执行以获得请求回应<br /></p>
				<p>分析一下所有的Context共享的web.xml文件，在其中定义的servlet被所有的Web App载入<br /></p>
				<p>
						<tt>
						</tt>
				</p>
				<h3>5 - Tomcat Server处理一个http请求的过程 </h3>
				<p>假设来自客户的请求为：<br />http://localhost:8080/wsota/wsota_index.jsp<br /></p>
				<p>1) 请求被发送到本机端口8080，被在那里侦听的Coyote HTTP/1.1 Connector获得<br />2) Connector把该请求交给它所在的Service的Engine来处理，并等待来自Engine的回应<br />3) Engine获得请求localhost/wsota/wsota_index.jsp，匹配它所拥有的所有虚拟主机Host<br />4) Engine匹配到名为localhost的Host（即使匹配不到也把请求交给该Host处理，因为该Host被定义为该Engine的默认主机）<br />5) localhost Host获得请求/wsota/wsota_index.jsp，匹配它所拥有的所有Context<br />6) Host匹配到路径为/wsota的Context（如果匹配不到就把该请求交给路径名为""的Context去处理）<br />7) path="/wsota"的Context获得请求/wsota_index.jsp，在它的mapping table中寻找对应的servlet<br />8) Context匹配到URL PATTERN为*.jsp的servlet，对应于JspServlet类<br />9) 构造HttpServletRequest对象和HttpServletResponse对象，作为参数调用JspServlet的doGet或doPost方法<br />10)Context把执行完了之后的HttpServletResponse对象返回给Host<br />11)Host把HttpServletResponse对象返回给Engine<br />12)Engine把HttpServletResponse对象返回给Connector<br />13)Connector把HttpServletResponse对象返回给客户browser</p>
				<p> </p>
				<pre>
						<font color="#008000">&lt;!------------------------------------------------&gt; </font>
				</pre>
				<pre>&lt;web-app&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- 概述：        <br />该文件是所有的WEB APP共用的部署配置文件，        <br />每当一个WEB APP被DEPLOY，该文件都将先被处理，然后才是WEB APP自己的/WEB-INF/web.xml--&gt; </font>
						<font color="#008000">
						</font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  +-------------------------+  --&gt;   </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  |    servlet类定义部分    |  --&gt;   </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  +-------------------------+  --&gt; </font>
						<font color="#008000">
						</font>
				</pre>
				<pre>
						<font color="#008000">&lt;!-- DefaultServlet 当用户的HTTP请求无法匹配任何一个servlet的时候，该servlet被执行        <br />URL PATTERN MAPPING : /        --&gt; </font>
				</pre>
				<pre>&lt;servlet&gt;</pre>
				<pre>&lt;servlet-name&gt;default&lt;/servlet-name&gt;         </pre>
				<pre>&lt;servlet-class&gt;org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class&gt;</pre>
				<pre>&lt;init-param&gt;</pre>
				<pre>&lt;param-name&gt;debug&lt;/param-name&gt;</pre>
				<pre>&lt;param-value&gt;0&lt;/param-value&gt;</pre>
				<pre>&lt;/init-param&gt;</pre>
				<pre>&lt;init-param&gt;</pre>
				<pre>&lt;param-name&gt;listings&lt;/param-name&gt;</pre>
				<pre>&lt;param-value&gt;true&lt;/param-value&gt;</pre>
				<pre>&lt;/init-param&gt;</pre>
				<pre>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;</pre>
				<pre>&lt;/servlet&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- InvokerServlet 处理一个WEB APP中的匿名servlet <br />当一个servlet被编写并编译放入/WEB-INF/classes/中，却没有在/WEB-INF/web.xml中定义的时候<br />该servlet被调用，把匿名servlet映射成/servlet/ClassName的形式<br />URL PATTERN MAPPING : /servlet/*        --&gt; </font>
				</pre>
				<pre>&lt;servlet&gt;         </pre>
				<pre>&lt;servlet-name&gt;invoker&lt;/servlet-name&gt;         </pre>
				<pre>&lt;servlet-class&gt;org.apache.catalina.servlets.InvokerServlet&lt;/servlet-class&gt;</pre>
				<pre>&lt;init-param&gt;</pre>
				<pre>&lt;param-name&gt;debug&lt;/param-name&gt;             </pre>
				<pre>&lt;param-value&gt;0&lt;/param-value&gt;         </pre>
				<pre>&lt;/init-param&gt;        </pre>
				<pre>&lt;load-on-startup&gt;2&lt;/load-on-startup&gt;     </pre>
				<pre>&lt;/servlet&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- JspServlet  当请求的是一个JSP页面的时候（*.jsp）该servlet被调用        <br />它是一个JSP编译器，将请求的JSP页面编译成为servlet再执行        <br />URL PATTERN MAPPING : *.jsp        --&gt; </font>
				</pre>
				<pre>&lt;servlet&gt;         </pre>
				<pre>&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;         </pre>
				<pre>&lt;servlet-class&gt;org.apache.jasper.servlet.JspServlet&lt;/servlet-class&gt;         </pre>
				<pre>&lt;init-param&gt;             </pre>
				<pre>&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;             </pre>
				<pre>&lt;param-value&gt;WARNING&lt;/param-value&gt;         </pre>
				<pre>&lt;/init-param&gt;         </pre>
				<pre>&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;     </pre>
				<pre>&lt;/servlet&gt;   <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!--  +---------------------------+  --&gt;   </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  |    servlet映射定义部分    |  --&gt;   </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  +---------------------------+  --&gt; </font>
				</pre>
				<pre>&lt;servlet-mapping&gt;         </pre>
				<pre>&lt;servlet-name&gt;default&lt;/servlet-name&gt;         </pre>
				<pre>&lt;url-pattern&gt;/&lt;/url-pattern&gt;     </pre>
				<pre>&lt;/servlet-mapping&gt;      </pre>
				<pre>&lt;servlet-mapping&gt;         </pre>
				<pre>&lt;servlet-name&gt;invoker&lt;/servlet-name&gt;         </pre>
				<pre>&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;     </pre>
				<pre>&lt;/servlet-mapping&gt;      </pre>
				<pre>&lt;servlet-mapping&gt;         </pre>
				<pre>&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;         </pre>
				<pre>&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;     </pre>
				<pre>&lt;/servlet-mapping&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!--  +------------------------+  --&gt;   </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  |    其它部分，略去先    |  --&gt;   </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!--  +------------------------+  --&gt; </font>
				</pre>
				<pre>... ... ... ...  </pre>
				<pre>&lt;/web-app&gt;  </pre>
				<pre>
						<font color="#008000">&lt;!-----------------------------------&gt; </font>
				</pre>
				<p> </p>
				<pre>
						<font color="#008000">&lt;!-------------------------------------------------------------------------&gt; </font>
				</pre>
				<pre>
						<font color="#008000">&lt;!-- 启动Server 在端口8005处等待关闭命令  如果接受到"SHUTDOWN"字符串则关闭服务器      --&gt; </font>
				</pre>
				<pre>&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Listener ???        目前没有看到这里        --&gt; </font>
				</pre>
				<pre>&lt;Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/&gt;   </pre>
				<pre>&lt;Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Global JNDI resources ???        目前没有看到这里，先略去        --&gt; </font>
				</pre>
				<pre>&lt;GlobalNamingResources&gt;     ... ... ... ...   &lt;/GlobalNamingResources&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Tomcat的Standalone Service Service是一组Connector的集合 <br />它们共用一个Engine来处理所有Connector收到的请求--&gt; </font>
				</pre>
				<pre>&lt;Service name="Tomcat-Standalone"&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Coyote HTTP/1.1 Connector  className: 该Connector的实现类是<br />org.apache.coyote.tomcat4.CoyoteConnector <br />port : 在端口号8080处侦听来自客户browser的HTTP1.1请求          <br />minProcessors : 该Connector先创建5个线程等待客户请求，每个请求由一个线程负责          <br />maxProcessors : 当现有的线程不够服务客户请求时，若线程总数不足75个，则创建新线程来处理请求          <br />acceptCount : 当现有线程已经达到最大数75时，为客户请求排队 当队列中请求数超过100时，后来的请求返回Connection refused错误          <br />redirectport : 当客户请求是https时，把该请求转发到端口8443去 其它属性略          --&gt; </font>
				</pre>
				<pre>&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector" <br />port="8080"                 <br />minProcessors="5" maxProcessors="75" acceptCount="100"                 <br />enableLookups="true"                 redirectPort="8443"                 <br />debug="0"                 connectionTimeout="20000"                 <br />useURIValidationHack="false"                 disableUploadTimeout="true" /&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Engine用来处理Connector收到的Http请求 <br />它将匹配请求和自己的虚拟主机，并把请求转交给对应的Host来处理          <br />默认虚拟主机是localhost          --&gt; </font>
				</pre>
				<pre>&lt;Engine name="Standalone" defaultHost="localhost" debug="0"&gt;      <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- 日志类，目前没有看到，略去先 --&gt; </font>
				</pre>
				<pre>&lt;Logger className="org.apache.catalina.logger.FileLogger" .../&gt; <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Realm，目前没有看到，略去先 --&gt; </font>
				</pre>
				<pre>&lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../&gt;  <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- 虚拟主机localhost  appBase : 该虚拟主机的根目录是webapps/  <br />它将匹配请求和自己的Context的路径，并把请求转交给对应的Context来处理            --&gt; </font>
				</pre>
				<pre>&lt;Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true"&gt;</pre>
				<pre>
						<font color="#008000">&lt;!-- 日志类，目前没有看到，略去先 --&gt; </font>
				</pre>
				<pre>&lt;Logger className="org.apache.catalina.logger.FileLogger" .../&gt;        <font color="#008000"></font></pre>
				<pre>
						<font color="#008000">&lt;!-- Context，对应于一个Web App   <br />path : 该Context的路径名是""，故该Context是该Host的默认Context              <br />docBase : 该Context的根目录是webapps/mycontext/              --&gt;</font>
				</pre>
				<pre>&lt;Context path="" docBase="mycontext" debug="0"/&gt;</pre>
				<pre>
						<font color="#008000">&lt;!-- 另外一个Context，路径名是/wsota --&gt;</font>
				</pre>
				<pre>&lt;Context path="/wsota" docBase="wsotaProject" debug="0"/&gt;</pre>
				<pre>&lt;/Host&gt;</pre>
				<pre>&lt;/Engine&gt;</pre>
				<pre>&lt;/Service&gt;</pre>
				<pre>&lt;/Server&gt;  </pre>
				<pre>
						<font color="#008000">&lt;!---------------------------------------------------------------&gt; </font>
				</pre>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=615080</p>
		</div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-20 23:54 <a href="http://www.blogjava.net/iKingQu/articles/36503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Tomcat配置技巧</title><link>http://www.blogjava.net/iKingQu/articles/36502.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Mon, 20 Mar 2006 15:50:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36502.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36502.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36502.html</trackback:ping><description><![CDATA[作者：Jason Brittain &amp; Ian F. Darwin <br />出处：<a href="http://www.orielly.com/"><font color="#000080">http://www.orielly.com/</font></a> <br />译者：陈光 <br /><br />编者按：现在开发Java Web应用，建立和部署Web内容是一件很简单的工作。使用Jakarta Tomcat作为Servlet和JSP容器的人已经遍及全世界。Tomcat具有免费、跨平台等诸多特性，并且更新得很快，现在非常的流行。 <br /><br />你所需要做的就是：按照你的需求配置Tomcat，只要你正确配置，Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技巧，这些技巧源自于我的书：《Tomcat权威指南》，希望对你有所帮助。?? Jason Brittain <br /><br /><b>1． 配置系统管理（Admin Web Application）</b> <br />大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面。Tomcat按照自己的方式，同样提供一个成熟的管理工具，并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现，当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数，user、group、role的多种数据库管理等。在后续的版本中，这些功能将得到很大的扩展，但现有的功能已经非常实用了。 <br /><br />Admin Web Application被定义在自动部署文件：CATALINA_BASE/webapps/admin.xml 。 <br />（译者注：CATALINA_BASE即tomcat安装目录下的server目录） <br /><br />你必须编辑这个文件，以确定Context中的docBase参数是绝对路径。也就是说，CATALINA_BASE/webapps/admin.xml 的路径是绝对路径。作为另外一种选择，你也可以删除这个自动部署文件，而在server.xml文件中建立一个Admin Web Application的context，效果是一样的。你不能管理Admin Web Application这个应用，换而言之，除了删除CATALINA_BASE/webapps/admin.xml ，你可能什么都做不了。 <br /><br />如果你使用UserDatabaseRealm（默认），你将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你编辑这个文件，添加一个名叫“admin”的role 到该文件中，如下： <br /><br />&lt;role name="admin"/&gt; <br /><br />你同样需要有一个用户，并且这个用户的角色是“admin”。象存在的用户那样，添加一个用户（改变密码使其更加安全）： <br /><br />&lt;user name="admin" password="deep_dark_secret" roles="admin"/&gt; <br /><br />当你完成这些步骤后，请重新启动Tomcat，访问<a href="http://localhost:8080/admin"><font color="#000080">http://localhost:8080/admin</font></a>，你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制，并采用了Jakarta Struts框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。 <br /><br /><b>2．配置应用管理（Manager Web Application）</b> <br />Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面，执行一些简单的Web应用任务。 <br /><br />Manager Web Application被被定义在一个自动部署文件中： <br /><br />CATALINA_BASE/webapps/manager.xml 。 <br /><br />你必须编辑这个文件，以确保context的docBase参数是绝对路径，也就是说CATALINA_HOME/server/webapps/manager的绝对路径。 <br />（译者注：CATALINA_HOME即tomcat安装目录） <br /><br />如果你使用的是UserDatabaseRealm，那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来，编辑这个文件，添加一个名为“manager”的角色到该文件中： <br /><br />&lt;role name=”manager”&gt; <br /><br />你同样需要有一个角色为“manager”的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）： <br /><br />&lt;user name="manager" password="deep_dark_secret" roles="manager"/&gt; <br /><br />然后重新启动Tomcat，访问<a href="http://localhost/manager/list"><font color="#000080">http://localhost/manager/list</font></a>，将看到一个很朴素的文本型管理界面，或者访问<a href="http://localhost/manager/html/list"><font color="#000080">http://localhost/manager/html/list</font></a>，将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager Web Application现在已经启动了。 <br /><br />Manager application让你可以在没有系统管理特权的基础上，安装新的Web应用，以用于测试。如果我们有一个新的web应用位于/home/user/hello下在，并且想把它安装到 /hello下，为了测试这个应用，我们可以这么做，在第一个文件框中输入“/hello”（作为访问时的path），在第二个文本框中输入“file:/home/user/hello”（作为Config URL）。 <br /><br />Manager application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问，当有用户尝试访问这个被停止的应用时，将看到一个503的错误??“503 - This application is not currently available”。 <br /><br />移除一个web应用，只是指从Tomcat的运行拷贝中删除了该应用，如果你重新启动Tomcat，被删除的应用将再次出现（也就是说，移除并不是指从硬盘上删除）。 <br /><br /><b>3．部署一个web应用 </b><br />有两个办法可以在系统中部署web服务。 <br />1&gt; 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到$CATALINA_BASE/webapps目录下。 <br />2&gt; 为你的web服务建立一个只包括context内容的XML片断文件，并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。 <br /><br />如果你有一个WAR文件，你若想部署它，则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可，文件必须以“.war”作为扩展名。一旦Tomcat监听到这个文件，它将（缺省的）解开该文件包作为一个子目录，并以WAR文件的文件名作为子目录的名字。接下来，Tomcat将在内存中建立一个context，就好象你在server.xml文件里建立一样。当然，其他必需的内容，将从server.xml中的DefaultContext获得。 <br /><br />部署web应用的另一种方式是写一个Context XML片断文件，然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件，而只是一个context元素，以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样，所以这种片断被命名为“context片断”。 <br /><br />举个例子，如果我们想部署一个名叫MyWebApp.war的应用，该应用使用realm作为访问控制方式，我们可以使用下面这个片断： <br /><br />&lt;!-- <br />Context fragment for deploying MyWebApp.war <br />--&gt; <br />&lt;Context path="/demo" docBase="webapps/MyWebApp.war" <br />debug="0" privileged="true"&gt; <br />&lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm" <br />resourceName="UserDatabase"/&gt; <br />&lt;/Context&gt; <br /><br />把该片断命名为“MyWebApp.xml”，然后拷贝到CATALINA_BASE/webapps目录下。 <br /><br />这种context片断提供了一种便利的方法来部署web应用，你不需要编辑server.xml，除非你想改变缺省的部署特性，安装一个新的web应用时不需要重启动Tomcat。 <br /><br /><br /><b>4．配置虚拟主机（Virtual Hosts） </b><br />关于server.xml中“Host”这个元素，只有在你设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制，对每个域名而言，都好象独享了整个主机。实际上，大多数的小型商务网站都是采用虚拟主机实现的，这主要是因为虚拟主机能直接连接到Internet并提供相应的带宽，以保障合理的访问响应速度，另外虚拟主机还能提供一个稳定的固定IP。 <br /><br />基于名字的虚拟主机可以被建立在任何web服务器上，建立的方法就是通过在域名服务器（DNS）上建立IP地址的别名，并且告诉web服务器把去往不同域名的请求分发到相应的网页目录。因为这篇文章主要是讲Tomcat，我们不准备介绍在各种操作系统上设置DNS的方法，如果你在这方面需要帮助，请参考《DNS and Bind》一书，作者是Paul Albitz and Cricket Liu (O'Reilly)。为了示范方便，我将使用一个静态的主机文件，因为这是测试别名最简单的方法。 <br />在Tomcat中使用虚拟主机，你需要设置DNS或主机数据。为了测试，为本地IP设置一个IP别名就足够了，接下来，你需要在server.xml中添加几行内容，如下： <br /><br />&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt; <br />&lt;Service name="Tomcat-Standalone"&gt; <br />&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector" <br />port="8080" minProcessors="5" maxProcessors="75" <br />enableLookups="true" redirectPort="8443"/&gt; <br />&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector" <br />port="8443" minProcessors="5" maxProcessors="75" <br />acceptCount="10" debug="0" scheme="https" secure="true"/&gt; <br />&lt;Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory" <br />clientAuth="false" protocol="TLS" /&gt; <br />&lt;/Connector&gt; <br />&lt;Engine name="Standalone" defaultHost="localhost" debug="0"&gt; <br />&lt;!-- This Host is the default Host --&gt; <br />&lt;Host name="localhost" debug="0" appBase="webapps" <br />unpackWARs="true" autoDeploy="true"&gt; <br />&lt;Context path="" docBase="ROOT" debug="0"/&gt; <br />&lt;Context path="/orders" docBase="/home/ian/orders" debug="0" <br />reloadable="true" crossContext="true"&gt; <br />&lt;/Context&gt; <br />&lt;/Host&gt; <br /><br />&lt;!-- This Host is the first "Virtual Host": <a href="http://www.example.com/"><font color="#000080">http://www.example.com/</font></a> --&gt; <br />&lt;Host name="www.example.com" appBase="/home/example/webapp"&gt; <br />&lt;Context path="" docBase="."/&gt; <br />&lt;/Host&gt; <br /><br />&lt;/Engine&gt; <br />&lt;/Service&gt; <br />&lt;/Server&gt; <br /><br />Tomcat的server.xml文件，在初始状态下，只包括一个虚拟主机，但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的server.xml版本，其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素，所包含的context元素中必须有一个是默认的context，这个默认的context的显示路径应该为空（例如，path=””）。 <br /><br /><b>5．配置基础验证（Basic Authentication） </b><br />容器管理验证方法控制着当用户访问受保护的web应用资源时，如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication（BASIC参数在web.xml文件中auto-method元素中设置），而有用户访问受保护的web应用时，Tomcat将通过HTTP Basic Authentication方式，弹出一个对话框，要求用户输入用户名和密码。在这种验证方法中，所有密码将被以64位的编码方式在网络上传输。 <br /><br />注意：使用Basic Authentication通过被认为是不安全的，因为它没有强健的加密方法，除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式（比如，在一个虚拟私人网络中）。若没有额外的加密方法，网络管理员将能够截获（或滥用）用户的密码。但是，如果你是刚开始使用Tomcat，或者你想在你的web应用中测试一下基于容器的安全管理，Basic Authentication还是非常易于设置和使用的。只需要添加&lt;security-constraint&gt;和&lt;login-config&gt;两个元素到你的web应用的web.xml文件中，并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加适当的&lt;role&gt;和&lt;user&gt;即可，然后重新启动Tomcat。 <br /><br />下面例子中的web.xml摘自一个俱乐部会员网站系统，该系统中只有member目录被保护起来，并使用Basic Authentication进行身份验证。请注意，这种方式将有效的代替Apache web服务器中的.htaccess文件。 <br /><br />&lt;!-- <br />Define the Members-only area, by defining <br />a "Security Constraint" on this Application, and <br />mapping it to the subdirectory (URL) that we want <br />to restrict. <br />--&gt; <br />&lt;security-constraint&gt; <br />&lt;web-resource-collection&gt; <br />&lt;web-resource-name&gt; <br />Entire Application <br />&lt;/web-resource-name&gt; <br />&lt;url-pattern&gt;/members/*&lt;/url-pattern&gt; <br />&lt;/web-resource-collection&gt; <br />&lt;auth-constraint&gt; <br />&lt;role-name&gt;member&lt;/role-name&gt; <br />&lt;/auth-constraint&gt; <br />&lt;/security-constraint&gt; <br />&lt;!-- Define the Login Configuration for this Application --&gt; <br />&lt;login-config&gt; <br />&lt;auth-method&gt;BASIC&lt;/auth-method&gt; <br />&lt;realm-name&gt;My Club Members-only Area&lt;/realm-name&gt; <br />&lt;/login-config&gt; <br /><br /><b>6．配置单点登录（Single Sign-On）</b> <br />一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。如果你运行了多个web应用，并且每个应用都需要进行单独的用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问