﻿<?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-大道至简-文章分类-Tomcat &amp; Apache &amp; Jboss</title><link>http://www2.blogjava.net/hellotony/category/11939.html</link><description>道生一，一生二，二生三，三生万物。万物负阴而抱阳，冲气以为和。</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 19:31:24 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 19:31:24 GMT</pubDate><ttl>60</ttl><item><title>利用Solaris10中的Apache2与Tomcat结合</title><link>http://www.blogjava.net/hellotony/articles/50742.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Tue, 06 Jun 2006 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/50742.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/50742.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/50742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/50742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/50742.html</trackback:ping><description><![CDATA[
		<p align="left">
				<font size="2">
						<strong>一、说在前头</strong>
				</font>
		</p>
		<p align="left">
				<font size="2">在
为ISV提供Solaris10 移植过程中发现有些ISV的应用是使用Apache和Tomcat结合实现负载均衡的J2EE
web应用。那么在Solaris10中具体怎么实现这种负载均衡方式呢？本文将给出一个参考实现。本文中多数操作是在Solaris10 B
Shell下进行的。 </font>
		</p>
		<p align="left">
				<font size="2">
						<strong> 二、本文中实现负载均衡的拓扑图</strong>
				</font>
		</p>
		<p align="left">
				<font size="2">
						<img src="http://isv.sun.com.cn/image/att00129_1.jpg" height="423" width="601" />
				</font>
		</p>
		<p align="left">
				<font size="2">此拓扑图只是本文中的实现，如果没有这样的条件也可以简化这些。把Apache和两个Tomcat都安装在一台主机上。也可以利用一台主机利用Solaris10提供的Zone功能来划分多个zone模拟多个主机。</font>
		</p>
		<p align="left">
				<font size="2">
						<strong>三、实现负载的步骤</strong>
				</font>
		</p>
		<ul>
				<li>
						<div align="left">
								<font size="2"> 验证 Apache2 是否能正常工作。 
                   </font>
								<p>
										<font size="2"> 1.1生成初始配置文件 httpd.conf </font>
								</p>
								<p>
										<font size="2"> #cp /etc/apache2/httpd.conf-example /etc/apache2/httpd.conf </font>
								</p>
								<p>
										<font size="2"> 1.2初次启动 Apache </font>
								</p>
								<p>
										<font size="2"> #/usr/apache2/bin/apachectl start </font>
								</p>
								<p>
										<font size="2"> 1.3查看 Apache 进程是否已经启动 </font>
								</p>
								<font size="2">
                  #ps –ef|grep httpd 如果出现下面的情况则表示 Apache 没成功的启动。 </font>
						</div>
				</li>
		</ul>
		<h3 align="left">
				<font size="2"> </font>
		</h3>
		<p align="left">
				<font size="2">
						<img src="http://isv.sun.com.cn/image/att00129_2.jpg" height="72" width="647" />
				</font>
		</p>
		<p align="left">
				<font size="2"> 1.4查看没有启动成功的原因 </font>
		</p>
		<div align="left">
				<font size="2">#more /var/apache2/logs/error_log 发现如下
             </font>
		</div>
		<div align="left">
				<p align="left">
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_3.jpg" height="103" width="720" />
						</font>
				</p>
				<p>
						<font size="2">  </font>
				</p>
				<p align="left">
						<font size="2"> 可以看出是因为 apache 在启动的时候要把 PID 的信息写入到一个文件 httpd.pid 时候发生了问题，原因是 /var/run/apache2 这个目录不存在。现在用下面的命令把这个目录建立起来。 </font>
				</p>
				<p align="left">
						<font size="2"> #mkdir –p /var/run/apache2 </font>
				</p>
				<p align="left">
						<font size="2"> 1.5第二次启动 Apache </font>
				</p>
				<p align="left">
						<font size="2"> 为了查看本次启动中产生的错误欣，先删除原有的 error _ log 文件 </font>
				</p>
				<p align="left">
						<font size="2"> #rm /var/apache2/logs/error_log </font>
				</p>
				<p align="left">
						<font size="2"> 接着启动 apache </font>
				</p>
				<p align="left">
						<font size="2"> #/usr/apache2/bin/apachectl start </font>
				</p>
				<p align="left">
						<font size="2"> 1.6第二次查看apache的启动情况 </font>
				</p>
				<font size="2">
		       #ps –ef|grep httpd 如果出现了下面的情况则说明启动成功。
</font>
				<p align="left">
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_4.jpg" height="149" width="720" />
						</font>
				</p>
		</div>
		<p align="left">
				<font size="2">也可以通过浏览器验证 Apache 是否启动成功，如果浏览器出现如下信息则说明已经启动成功。</font>
		</p>
		<p align="left">
				<font size="2">
						<img src="http://isv.sun.com.cn/image/att00129_5.jpg" height="400" width="721" />
				</font>
		</p>
		<p align="left">
				<font size="2">  否则就是没有 Apache 没有成功启动，重复执行 1.4-1.6直到成功为止。再去 error_log 中看一下有什么信息。 </font>
		</p>
		<p align="left">
				<font size="2"> #more /var/apache2/logs/error_log </font>
		</p>
		<div align="left">
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_6.jpg" height="77" width="721" />
						</font>
				</p>
				<p>
						<font size="2">可以看出已经没有错误产生了。 </font>
				</p>
				<ul>
						<li>
								<font size="2"> 安装 mod_jk </font>
						</li>
				</ul>
				<font size="2">
		       Mod_jk 是连接 Apache 与 Tomcat 的接口。其工作方式如下：
</font>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_7.jpg" height="236" width="720" />
						</font>
				</p>
				<p>
						<font size="2">  </font>
				</p>
				<p align="left">
						<font size="2"> Apache 在接收到用户请求的 JSP 和 servlet 的时候会通过 mod_jk 把他们转发给 tomcat，tomcat 处理完成后在将结果通过 mod_jk 返回给 apache 。之后 apache 将结果呈现给用户。 </font>
				</p>
				<p align="left">
						<font size="2"> 2.1获得 mod_jk </font>
				</p>
				<p align="left">
						<font size="2"> 在 tomcat 的官方网站提供了两种下载，一种是编译好的二进制文件 “ .dll” 或者“ .so ”。另外一种是源码下载，需要在本地编译。因为没有看到有 SOLARIS10 版本的“ .so ”文件，在这里使用其源码进行编译。 </font>
				</p>
				<p align="left">
						<font size="2"> 源码下载地址： </font>
				</p>
				<p align="left">
						<font size="2">
								<a href="http://www.apache.org/dist/tomcat/tomcat-connectors/jk/source/jk-1.2.15/jakarta-tomcat-connectors-1.2.15-src.tar.gz">http://www.apache.org/dist/tomcat/tomcat-connectors/jk/source/jk-1.2.15/jakarta-tomcat-connectors-1.2.15-src.tar.gz</a>
						</font>
				</p>
				<p align="left">
						<font size="2"> 二进制下载地址： </font>
				</p>
				<p align="left">
						<font size="2">
								<a href="http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/">http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/</a>
						</font>
				</p>
				<p align="left">
						<font size="2"> 2.2编译 mod_jk </font>
				</p>
				<p align="left">
						<font size="2"> 因为要用到 Solaris 的编译工具，所以要先安装 Sun Studio11。Sun Studio 11 安装程序和安装手册在 Sun 的网站可以免费下载而且安装方式是“下一步 ”型的，在这里就不多说了。接着要把下载的文件进行解压： </font>
				</p>
				<p align="left">
						<font size="2"> #gunzip jakarta-tomcat-connectors-1.2.15-src.tar.gz </font>
				</p>
				<p align="left">
						<font size="2"> #tar xvf jakarta-tomcat-connectors-1.2.15-src.tar </font>
				</p>
				<p align="left">
						<font size="2"> #cd jakarta-tomcat-connectors-1.2.15-src </font>
				</p>
				<p align="left">
						<font size="2"> 设置环境变量： PATH,LD_LIBRARY_PATH 等 </font>
				</p>
				<p align="left">
						<font size="2"> #export PATH=$PATH: /usr/ucb:/usr/ccs/bin </font>
				</p>
				<p align="left">
						<font size="2"> （含有编译工具和 make） </font>
				</p>
				<p align="left">
						<font size="2"> #export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: /usr/lib:/etc/lib </font>
				</p>
				<p align="left">
						<font size="2"> （含有可能用到的库） </font>
				</p>
				<p align="left">
						<font size="2"> 开始编译 mod_jk </font>
				</p>
				<p align="left">
						<font size="2"> #cd jk/native 相对于 jakarta-tomcat-connectors-1.2.15-src </font>
				</p>
				<p align="left">
						<font size="2"> #./configure –with-apxs=/usr/apache2/bin/apxs </font>
				</p>
				<p align="left">
						<font size="2"> #make </font>
				</p>
				<font size="2">
在 make 的过程中产生了下面的错误信息，这是由于在生成了 mod_jk.so 文件后要拷到
apache的特定路径的过程中发生了错误。没有关系，最有用的 mod_jk.so 已经生成了。存放在相对于
jakarta-tomcat-connectors-1.2.15-src 目录的下的 jk/native/apache-2.0/.libs
目录中。
</font>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_8.jpg" height="153" width="721" />
						</font>
				</p>
				<p>
						<font size="2">  </font>
				</p>
				<p align="left">
						<font size="2"> 编译 mod_jk 比较繁琐而且也容易出问题，现在将编译好的文件放在网上。需要的朋友可以直接下载使用（但不保证任何机器都能使用）。 </font>
				</p>
				<p align="left">
						<font size="2"> For Solaris10 sparc：http://www.cublog.cn/u/15296/upfile/060316125507.gz </font>
				</p>
				<p align="left">
						<font size="2"> For Solaris10 x86 ：http://www.cublog.cn/u/15296/upfile/060316121254.gz </font>
				</p>
				<ul>
						<li>
								<font size="2"> 配置 mod_jk 到 Apache </font>
						</li>
				</ul>
				<p align="left">
						<font size="2"> 3.1先把 mod_jk.so (在 jk/native/apache-2.0/.libs 目录 )文件拷贝到 Apache 的 libexec 目录下面。 </font>
				</p>
				<p align="left">
						<font size="2"> #cp mod_jk.so /usr/apache2/libexec/. </font>
				</p>
				<p align="left">
						<font size="2"> 3.2接着修改 Apache 的配置文件，使 Apache 能够将需要 tomcat 处理的文件通过 mod_jk 进行转发。有三处需要修改，见图。 </font>
				</p>
				<p align="left">
						<font size="2"> #vi /etc/apache2/httpd.conf 并在 LoadModule 模块的最后加入一行 </font>
				</p>
				<font size="2">
		       LoadModule jk_module libexec/mod_jk.so
</font>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_9.jpg" height="178" width="712" />
						</font>
				</p>
				<p>
						<font size="2">找一个合适的位置（任何地方），将下面的信息添加上去</font>
				</p>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_10.jpg" height="139" width="577" />
						</font>
				</p>
				<p>
						<font size="2">还要把需要转发的文件类型和路径配置好。具体的位置是在 DocumentRoot 指示器下。如下面已 JkMount 开头的两行。</font>
				</p>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_11.jpg" height="72" width="639" />
						</font>
				</p>
				<p>
						<font size="2">3.3编写 workers.properties 文件 </font>
				</p>
				<font size="2">
		       这个文件用力定义与 Apache 进行交互的 Tomcat 的配置信息。具体如下：
</font>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_12.jpg" height="621" width="548" />
						</font>
				</p>
				<p>
						<font size="2">可以看出 worker1 和 worker2 用来配置 tomcat 的信息， loaderbalancer 用来配置负载均衡信息。下面的表格对涉及到的属性进行了说明。更多的属性说明可以参见 <a href="http://tomcat.apache.org/connectors-doc/config/workers.html">worker文件的文档</a>。 </font>
				</p>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_13.jpg" height="287" width="695" />
						</font>
				</p>
				<p>
						<font size="2">  3.4验证安装 mod_jk 之后 Apache 仍然可用。 </font>
				</p>
				<p>
						<font size="2"> 按照 1.5,1.6 中的方式进行验证即可。 </font>
				</p>
				<ul>
						<li>
								<font size="2"> 配置 Tomcat ，实现负载均衡 </font>
						</li>
				</ul>
				<p>
						<font size="2"> 4. 1Tomcat 的获取和安装 </font>
				</p>
				<p>
						<font size="2"> 本文使用了从 tomcat 官方网站上提供的二进制文件打包 </font>
				</p>
				<p>
						<font size="2">
								<a href="http://apache.roweboat.net/tomcat/tomcat-5/v5.5.16/bin/apache-tomcat-5.5.16.tar.gz">http://apache.roweboat.net/tomcat/tomcat-5/v5.5.16/bin/apache-tomcat-5.5.16.tar.gz</a> 。将其拷贝的各个 worker 主机的安装目录并进行如下操作就算安装完成。 </font>
				</p>
				<p>
						<font size="2"> #gunzip apache-tomcat-5.5.16.tar.gz </font>
				</p>
				<p>
						<font size="2"> #tar xvf apache-tomcat-5.5.16.tar </font>
				</p>
				<p>
						<font size="2"> #mv apache-tomcat-5.5.16 tomcat551 </font>
				</p>
				<p>
						<font size="2"> 4.2创建一个空测试 web 应用并创建一个文件测试 JSP 页面放在其下： </font>
				</p>
				<p>
						<font size="2"> #mkdir –p $TOMCAT_HOME/webapps/testload </font>
				</p>
				<p>
						<font size="2"> 其中 $TOMCAT_HOME 是 Tomcat 的安装目录。 </font>
				</p>
				<p>
						<font size="2"> #vi $TOMCAT_HOME/webapps/testload/index.jsp 分别填写如下 </font>
				</p>
				<p>
						<font size="2"> worker1 的 index.jsp 源代码 </font>
				</p>
				<p>
						<font size="2"> &lt;html&gt; </font>
				</p>
				<p>
						<font size="2"> &lt;body bgcolor="red"&gt; </font>
				</p>
				<p>
						<font size="2"> Session ID:&lt;%=request.getSession().getId()%&gt; </font>
				</p>
				<p>
						<font size="2"> &lt;/body&gt; </font>
				</p>
				<p>
						<font size="2"> &lt;/html&gt; </font>
				</p>
				<p>
						<font size="2"> Worker2 的 index.jsp 源代码 </font>
				</p>
				<p>
						<font size="2"> &lt;html&gt; </font>
				</p>
				<p>
						<font size="2"> &lt;body bgcolor="blue"&gt; </font>
				</p>
				<p>
						<font size="2"> Session ID:&lt;%=request.getSession().getId()%&gt; </font>
				</p>
				<p>
						<font size="2"> &lt;/body&gt; </font>
				</p>
				<p>
						<font size="2"> &lt;/html&gt; </font>
				</p>
				<p>
						<font size="2"> 4.3修改 Tomcat 的配置文件，以便与 Apache 进行请求转发 </font>
				</p>
				<font size="2">
		       #vi $TOMCAT_HOME/conf/server.xml 修改其中的几处，如下图
</font>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_14.jpg" height="37" width="469" />
						</font>
				</p>
				<p>
						<font size="2">将其中的 port 分别改为“ 10008 ”和“ 10010 ”并将下面的这段注释掉（即将这段代码放在 &lt;!-- --&gt; 之间）。 </font>
				</p>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_15.jpg" height="82" width="673" />
						</font>
				</p>
				<p>
						<font size="2">配置 Tomcat 中 Ajp13 参数，将 port 分别改为“ 10009 ”和“ 10011 ”。</font>
				</p>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_16.jpg" height="70" width="672" />
						</font>
				</p>
				<p>
						<font size="2">配置 Tomcat 中的 AJP Engine 。</font>
				</p>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_17.jpg" height="118" width="681" />
						</font>
				</p>
				<p>
						<font size="2">将上面图中的信息分别修改为</font>
				</p>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_18.jpg" height="127" width="672" />
						</font>
				</p>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_19.jpg" height="133" width="670" />
						</font>
				</p>
				<p>
						<font size="2">将测试 web 应用的加到 Context 中（在文件的尾部， &lt;/Host&gt; 前面） </font>
				</p>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_20.jpg" height="34" width="531" />
						</font>
				</p>
				<p>
						<font size="2">  4.4验证负载均衡 </font>
				</p>
				<p>
						<font size="2"> 按前面的方法先启动 Apache ，之后分别启动 Tocmat （别忘了先设置 JAVA_HOME） </font>
				</p>
				<p>
						<font size="2"> #$TOMCAT_HOME/bin/startup.sh </font>
				</p>
				<p>
						<font size="2"> 用 #ps –ef|grep java 查看一下 Tomcat 是否已经启动 </font>
				</p>
				<font size="2">
		       在不同的机器打开几个浏览器查看 <a href="http://ip/index.jsp,Apache"> http://IP:Port/ index .jsp,Apache</a>
将会把请求转发给这两个 Tocmat 进行处理。如下图，可以看出对用户的请求是由多个 Tomcat 分担完成的。其中红色表明用户的请求是由
worker1 进行处理和响应的，蓝色则表明用户的请求是由 worker2 负载响应的。页面中也打印出了请求的 SessionId
，可以用刷新来看看是否会变（ 在 Session 没有过期， Tomcat 或 Tomcat 中的 Context
没有刷新的情况下这个值是不能变化的 ）。这样就可以验证这种负载均衡方式是不是能保持 Session （也可以打开新的浏览器来看一下是否有相同的
SessionId 产生）。
</font>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_21.jpg" height="267" width="721" />
						</font>
				</p>
				<p>
						<font size="2">
								<img src="http://isv.sun.com.cn/image/att00129_22.jpg" height="267" width="721" />
						</font>
				</p>
				<p>
						<font size="2">  参考资料： </font>
				</p>
				<p>
						<font size="2"> Mod_jk 文档： <a href="http://tomcat.apache.org/connectors-doc/index.html">http://tomcat.apache.org/connectors-doc/index.html</a></font>
				</p>
				<p>
						<font size="2"> Workers 文件说明： <a href="http://tomcat.apache.org/connectors-doc/config/workers.html">http://tomcat.apache.org/connectors-doc/config/workers.html</a></font>
				</p>
				<p>
						<font size="2"> Tomcat5.5 文档： <a href="http://tomcat.apache.org/tomcat-5.5-doc/index.html">http://tomcat.apache.org/tomcat-5.5-doc/index.html</a></font>
				</p>
				<font size="2">
	           Apache2 的文档： <a href="http://httpd.apache.org/docs/2.0/">http://httpd.apache.org/docs/2.0/</a></font>
		</div>
<img src ="http://www.blogjava.net/hellotony/aggbug/50742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2006-06-06 12:55 <a href="http://www.blogjava.net/hellotony/articles/50742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实践中整理出tomcat集群和负载均衡(zt)</title><link>http://www.blogjava.net/hellotony/articles/50739.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Tue, 06 Jun 2006 04:53:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/50739.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/50739.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/50739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/50739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/50739.html</trackback:ping><description><![CDATA[
		<font size="2">
				<span id="zoom">
						<div>
								<p>(一)环境说明<br />(1)服务器有4台，一台安装apache,三台安装tomcat<br />(2)apache2.0.55、tomcat5.5.15、jk2.0.4、jdk1.5.6或jdk1.4.2<br />(3)ip配置,一台安装apache的ip为192.168.0.88,三台安装tomcat的服务器ip分别为192.168.0.1/2/4<br />(二)安装过程<br />(1)在三台要安装tomcat的服务器上先安装jdk<br />(2)配置jdk的安装路径,在环境变量path中加入jdk的bin路径,新建环境变量JAVA_HOME指向jdk的安装路径<br />(3)在三台要安装tomcat的服务器上分别安装tomcat,调试三个tomcat到能够正常启动<br />(4)tomcat的默认WEB服务端口是8080,默认的模式是单独服务,我的三个tomcat的WEB服务端口修改为7080/8888/9999<br />修改位置为tomcat的安装目录下的conf/server.xml<br />修改前的配置为<br />    &lt;Connector port="8080" maxHttpHeaderSize="8192"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               connectionTimeout="20000" disableUploadTimeout="true" /&gt;<br />修改后的配置为<br />    &lt;Connector port="7080" maxHttpHeaderSize="8192"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               connectionTimeout="20000" disableUploadTimeout="true" /&gt;<br />依次修改每个tomcat的监听端口(7080/8888/9999)<br /><br />(5)分别测试每个tomcat的启动是否正常<br />http://192.168.0.1:7080<br />http://192.168.0.2:8888<br />http://192.168.0.4:9999<br />(三)负载均衡配置过程<br />(1)在那台要安装apache的服务器上安装apache2.0.55,我的安装路径为默认C:\Program Files\Apache Group\Apache2<br />(2)安装后测试apache能否正常启动，调试到能够正常启动http://192.168.0.88<br />(3)下载jk2.0.4后解压缩文件<br />(4)将解压缩后的目录中的modules目录中的mod_jk2.so文件复制到apache的安装目录下的modules目录中,我的为C:\Program Files\Apache Group\Apache2\modules<br />(5)修改apache的安装目录中的conf目录的配置文件httpd.conf，在文件中加LoadModule模块配置信息的最后加上一句LoadModule jk2_module modules/mod_jk2.so<br />(6)分别修改三个tomcat的配置文件conf/server.xml，修改内容如下<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 /><br />    &lt;!-- You should set jvmRoute to support load-balancing via AJP ie :<br />    &lt;Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1"&gt;         <br />    --&gt; <br />         <br />    &lt;!-- Define the top level container in our container hierarchy --&gt;<br />    &lt;Engine name="Catalina" defaultHost="localhost"&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 /><br />    &lt;!-- You should set jvmRoute to support load-balancing via AJP ie :--&gt;<br />    &lt;Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1"&gt;         <br />     <br />         <br />    &lt;!-- Define the top level container in our container hierarchy <br />    &lt;Engine name="Catalina" defaultHost="localhost"&gt;<br />    --&gt;<br />将其中的jvmRoute="jvm1"分别修改为jvmRoute="tomcat1"和jvmRoute="tomcat2"和jvmRoute="tomcat3"<br /><br />(7)然后重启三个tomcat，调试能够正常启动。<br />(8)在apache的安装目录中的conf目录下创建文件workers2.propertie，写入文件内容如下<br /><br /># fine the communication channel <br />[channel.socket:192.168.0.1:8009] <br />info=Ajp13 forwarding over socket<br />#配置第一个服务器 <br />tomcatId=tomcat1 #要和tomcat的配置文件server.xml中的jvmRoute="tomcat1"名称一致<br />debug=0 <br />lb_factor=1 #负载平衡因子，数字越大请求被分配的几率越高<br /><br /># Define the communication channel <br />[channel.socket:192.168.0.2:8009] <br />info=Ajp13 forwarding over socket<br />tomcatId=tomcat2 <br />debug=0 <br />lb_factor=1 <br /><br /># Define the communication channel <br />[channel.socket:192.168.0.4:8009] <br />info=Ajp13 forwarding over socket<br />tomcatId=tomcat3 <br />debug=0 <br />lb_factor=1 <br /><br />[status:] <br />info=Status worker, displays runtime information.  <br /><br />[uri:/jkstatus.jsp] <br />info=Display status information and checks the config file for changes. <br />group=status: <br /><br />[uri:/*] <br />info=Map the whole webapp <br />debug=0<br />(9)在三个tomcat的安装目录中的webapps建立相同的应用,我和应用目录名为TomcatDemo,在三个应用目录中建立相同 WEB-INF目录和页面index.jsp,index.jsp的页面内容如下<br />&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />&lt;%@ page import="java.util.*" %&gt;<br />&lt;html&gt;&lt;head&gt;&lt;title&gt;Cluster App Test&lt;/title&gt;&lt;/head&gt;<br />&lt;body&gt;<br />Server Info:<br />&lt;%<br />out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"&lt;br&gt;");%&gt;<br />&lt;%<br />  out.println("&lt;br&gt; ID " + session.getId()+"&lt;br&gt;");<br /><br />  // 如果有新的 Session 属性设置<br />  String dataName = request.getParameter("dataName");<br />  if (dataName != null &amp;&amp; dataName.length() &gt; 0) {<br />     String dataValue = request.getParameter("dataValue");<br />     session.setAttribute(dataName, dataValue);<br />  }<br /><br />  out.print("&lt;b&gt;Session 列表&lt;/b&gt;");<br /><br />  Enumeration e = session.getAttributeNames();<br />  while (e.hasMoreElements()) {<br />     String name = (String)e.nextElement();<br />     String value = session.getAttribute(name).toString();<br />     out.println( name + " = " + value+"&lt;br&gt;");<br />         System.out.println( name + " = " + value);<br />   }<br />%&gt;<br />  &lt;form action="index.jsp" method="POST"&gt;<br />    名称:&lt;input type=text size=20 name="dataName"&gt;<br />     &lt;br&gt;<br />    值:&lt;input type=text size=20 name="dataValue"&gt;<br />     &lt;br&gt;<br />    &lt;input type=submit&gt;<br />   &lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br />(10)重启apache服务器和三个tomcat服务器,到此负载 均衡已配置完成。测试负载均衡先测试apache,访问http://192.168.0.88/jkstatus.jsp<br />能否正常访问，并查询其中的内容，有三个tomcat的相关配置信息和负载说明,访问http://192.168.0.88/TomcatDemo/index.jsp看能够运行,<br />能运行，则已建立负载均衡。<br />(四)tomcat集群配置<br />(1)负载均衡配置的条件下配置tomcat集群<br />(2)分别修改三个tomcat的配置文件conf/server.xml,修改内容如下<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"<br />                 notifyListenersOnReplication="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"<br />                ackTimeout="5000"/&gt;<br /><br />            &lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"<br />                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/&gt;<br />                   <br />            &lt;Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"<br />                      tempDir="/tmp/war-temp/"<br />                      deployDir="/tmp/war-deploy/"<br />                      watchDir="/tmp/war-listen/"<br />                      watchEnabled="false"/&gt;<br />                      <br />            &lt;ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/&gt;<br />        &lt;/Cluster&gt;<br />        --&gt;   <br />修改后<br />        &lt;!-- modify by whh --&gt;<br />        &lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"<br />                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"<br />                 expireSessionsOnShutdown="false"<br />                 useDirtyFlag="true"<br />                 notifyListenersOnReplication="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"<br />                ackTimeout="5000"/&gt;<br /><br />            &lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"<br />                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/&gt;<br />                   <br />            &lt;Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"<br />                      tempDir="/tmp/war-temp/"<br />                      deployDir="/tmp/war-deploy/"<br />                      watchDir="/tmp/war-listen/"<br />                      watchEnabled="false"/&gt;<br />                      <br />            &lt;ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/&gt;<br />        &lt;/Cluster&gt;<br />       &lt;!-- modify by whh --&gt;       <br />将集群配置选项的注释放开即可，如上。<br />(3)重启三个tomcat。到此tomcat的集群已配置完成。</p>
								<p> </p>
								<p>(五)应用配置<br />对于要进行负载和集群的的tomcat目录下的webapps中的应用中的WEB-INF中的web.xml文件要添加如下一句配置<br />&lt;distributable/&gt;<br />配置前<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;web-app
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;<br />  &lt;display-name&gt;TomcatDemo&lt;/display-name&gt;<br />&lt;/web-app&gt;<br />配置后<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;web-app
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;<br />  &lt;display-name&gt;TomcatDemo&lt;/display-name&gt;<br />   &lt;distributable/&gt;<br />&lt;/web-app&gt;<br /><!-- the post be hidden --></p>
								<p>问:tomcat集群是怎么处理session的阿</p>
								<p>答:在tomcat做集群之后，每个tomcat之间自动根据tomcat的配置文件中的参数进行session复制,<br />对于一个客户端对说，只要是同一个IP，那它每次上传的sessionID就是一样的, <!-- the post be hidden --></p>
						</div>
				</span>
		</font>
		<font size="2">
				<br />
		</font>
<img src ="http://www.blogjava.net/hellotony/aggbug/50739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2006-06-06 12:53 <a href="http://www.blogjava.net/hellotony/articles/50739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大型高并发高负载网站的系统架构(ZT)</title><link>http://www.blogjava.net/hellotony/articles/49341.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Wed, 31 May 2006 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/49341.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/49341.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/49341.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/49341.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/49341.html</trackback:ping><description><![CDATA[
		<font size="2">转自：Just Do IT (<a title="http://www.toplee.com" href="http://www.toplee.com/" target="_blank">http://www.toplee.com</a>) lee@toplee.com<br /><br />我
在Cernet做过拨号接入平台的搭建，而后在Yahoo3721负载搜索引擎前端平台开发，又在猫扑处理过大型社区猫扑大杂烩的架构升级等工作，同时自
己接触和开发过不少大中型网站的模块，因此在大型网站应对高负载和并发的解决方案上有一些积累和经验，可以和大家一起探讨一下。<br /><br />一个小型
的网站，比如个人网站，可以使用最简单的html静态页面就实现了，配合一些图片达到美化效果，所有的页面均存放在一个目录下，这样的网站对系统架构、性
能的要求都很简单，随着互联网业务的不断丰富，网站相关的技术经过这些年的发展，已经细分到很细的方方面面，尤其对于大型网站来说，所采用的技术更是涉及
面非常广，从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求，已经不是原来简单的html静态网站所能比拟的。<br /><br />大型网站，比如门户网站。在面对大量用户访问、高并发请求方面，基本的解决方案集中在这样几个环节：使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面，还没法根本解决大型网站面临的高负载和高并发问题。<br /><br />上面提供的几个解决思路在一定程度上也意味着更大的投入，并且这样的解决思路具备瓶颈，没有很好的扩展性，下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。<br /><br /><span style="color: green;">1、HTML静态化</span><br /><br />其
实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有
效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统CMS，像我们常访问的各个门户站点的新
闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限管
理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的CMS是必不可少的。<br /><br />除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像Mop的大杂烩就是使用了这样的策略，网易社区等也是如此。<br /><br />同
时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论
坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分
内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。<br /><br /><span style="color: green;">2、图片服务器分离</span><br /><br />大
家知道，对于Web服务器来说，不管是Apache、IIS还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站
都会采用的策略，他们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片
问题而崩溃，在应用服务器和图片服务器上，可以进行不同的配置优化，比如apache在配置ContentType的时候可以尽量少支持，尽可能少的
LoadModule，保证更高的系统消耗和执行效率。<br /><br /><span style="color: green;">3、数据库集群和库表散列</span><br /><br />大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。<br /><br />在数据库集群方面，很多数据库都有自己的解决方案，Oracle、Sybase等都有很好的方案，常用的MySQL提供的Master/Slave也是类似的方案，您使用了什么样的DB，就参考相应的解决方案来实施即可。<br /><br />上
面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最
有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能
进行更小的数据库散列，比如用户表，按照用户ID进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架
构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和ID进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统
随时增加一台低成本的数据库进来补充系统性能。<br /><br /><span style="color: green;">4、缓存</span><br /><br />缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。<br />架构方面的缓存，对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块，也可以使用外加的Squid模块进行缓存，这两种方式均可以有效的提高Apache的访问响应能力。<br />网
站程序开发方面的缓存，Linux上提供的Memory
Cache是常用的缓存接口，可以在web开发中使用，比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享，一些大
型社区使用了这样的架构。另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，PHP有Pear的Cache模块，Java就更多
了，.net不是很熟悉，相信也肯定有。<br /><br /><span style="color: green;">5、镜像</span><br /><br />镜
像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异，比如ChinaNet和EduNet
之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构
和产品可选。也有廉价的通过软件实现的思路，比如Linux上的rsync等工具。<br /><br /><span style="color: green;">6、负载均衡</span><br /><br />负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。<br />负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。<br />硬件四层交换<br />第
四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象是虚
IP，指向物理服务器。它传输的业务服从的协议多种多样，有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上，需要复杂的
载量平衡算法。在IP世界，业务类型由终端TCP或UDP端口地址来决定，在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决
定。<br />在硬件四层交换产品领域，有一些知名的产品可以选择，比如Alteon、F5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。<br /><br /><span style="color: green;">软件四层交换</span><br /><br />大家知道了硬件四层交换机的原理后，基于OSI模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。<br />软
件四层交换我们可以使用Linux上常用的LVS来解决，LVS就是Linux Virtual
Server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟VIP配置和管理功能，可以同时满
足多种应用需求，这对于分布式的系统来说必不可少。<br /><br />一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。<br /><br />对于大型网站来说，前面提到的每个方法可能都会被同时使用到，我这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的squid参数或者apache参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。</font>
<img src ="http://www.blogjava.net/hellotony/aggbug/49341.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2006-05-31 22:11 <a href="http://www.blogjava.net/hellotony/articles/49341.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache优化管理</title><link>http://www.blogjava.net/hellotony/articles/49330.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Wed, 31 May 2006 13:10:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/49330.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/49330.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/49330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/49330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/49330.html</trackback:ping><description><![CDATA[
		<table border="0" cellpadding="4" cellspacing="1" width="100%">
				<tbody>
						<tr>
								<td valign="top">
										<div class="subhead">
												<font size="2">
														<b>Apache优化管理</b>
												</font>
										</div>
								</td>
						</tr>
						<tr>
								<td valign="top">
										<div class="content">
												<p>
														<font size="2">版权声明：可以任意转载，转载时请务必以超链接形式标明文章原始出处和作者信息及本声明<br /><a href="http://www.chedong.com/tech/apache_install.html">http://www.chedong.com/tech/apache_install.html</a></font>
												</p>
												<p>
														<font size="2">关键词： apache install php resin mod_gzip mod_expire webalizer cronolog</font>
												</p>
												<p>
														<font size="2">内容摘要：</font>
												</p>
												<p>
														<font size="2">Apache是一个历史悠久并且功能十分强大的WEB服务器，但其丰富的功能对于一个新手来说往往不知道从何下手。我个人感觉Apache的设计充分体现了模块化设计的优势，通过在动态模块加载（DSO）模式下的安装，任何子应用模块都可以通过配置文件的简单修改进行积木式的灵活配置。安装的过程可以从简单的静态html服务开始，一个模块一个模块的学习使用。从单纯的HTML静态服务(core)，到复杂的动态页面服务(core 
+ php, core + resin, core + php + mod_gzip, core + resin + mod_expire)。<br /></font>
												</p>
												<p>
														<font size="2">本文主要从简化安装==&gt;性能调优==&gt;维护方便的角度，介绍了WEB服务的规划、HTTPD安装/应用模块配置、升级/维护等过程。让Apache和PHP，Resin等应用模块的独立升级，完全互不影响。</font>
												</p>
												<ol>
														<li>
																<font size="2">
																		<a href="http://www.chedong.com/tech/apache_install.html#scale">WEB应用容量规划</a>：根据硬件配置和WEB应用的特点进行WEB服务的规划及一些简单的估算公式； 

</font>
														</li>
														<li>
																<font size="2">
																		<a href="http://www.chedong.com/tech/apache_install.html#install">Apache安装过程</a>：apache的通用的简化安装选项，方便以后的应用的模块化配置；<br />修改 
HARD_SERVER_LIMIT：<br />vi /path/to/apache_src/src/include/httpd.h<br />#define 
HARD_SERVER_LIMIT 2560 &lt;===将原来的 HARD_SERVER_LIMIT 256 
后面加个“0”<br />apache编译：<br />./configure --prefix=/home/apache --enable-shared=max 
--enable-module=most 
</font>
														</li>
														<li>
																<font size="2">
																		<a href="http://www.chedong.com/tech/apache_install.html#module">可选应用模块/工具的安装</a>：php 
resin mod_gzip mod_expire及各个模块之间的配合；<br />mod_php安装：./configure 
--with-apxs=/home/apache/bin/apxs --enable-track-vars 
--with-mysql<br />mod_resin安装：./configure --with-apxs=/home/apache/bin/apxs 
<br />mod_gzip安装：修改Makefile中的 apxs路径：然后make make 
install<br />工具：日志轮循工具cronolog安装：http://www.cronolog.org 
</font>
														</li>
														<li>
																<font size="2">
																		<a href="http://www.chedong.com/tech/apache_install.html#maintain">升级/维护</a>：看看通用和模块化的安装过程如何简化了日常的升级/维护工作；<br />按照以上的方法：系统管理员和应用管理员的职责可以清楚的分开，互相独立。<br />系统安装：系统管理员的职责就是安装好一台DSO模式的Apache，然后COLON即可，<br />应用安装：由应用管理员负责具体应用所需要的模块，比如PHP 
Resin等，并设置httpd.conf中相关的配置。<br />系统升级：系统管理员：升级操作系统/升级Apache<br />应用升级：应用管理员：升级应用模块，PHP 
Resin等。 </font>
														</li>
												</ol>
												<p>
														<font size="2">
																<b>
																		<a name="scale">WEB应用的容量规划</a>
																</b>
														</font>
												</p>
												<p>
														<font size="2">Apache主要是一个内存消耗型的服务应用，我个人总结的经验公式：<br />apache_max_process_with_good_perfermance 
&lt; (total_hardware_memory / apache_memory_per_process ) * 
2<br />apache_max_process = apache_max_process_with_good_perfermance * 1.5</font>
												</p>
												<p>
														<font size="2">为什么会有一个apache_max_process_with_good_perfermance和apache_max_process呢？原因是在低负载下系统可以使用更多的内存用于文件系统的缓存，从而进一步提高单个请求的响应速度。在高负载下，系统的单个请求响应速度会慢不少，而超过 
apache_max_process，系统会因为开始使用硬盘做虚拟内存交换空间而导致系统效率急剧下降。此外，同样的服务：2G内存的机器的 
apache_max_process一般只设置到1G内存的1.7倍，因为Apache本身会因为进程过多导致性能下降。</font>
												</p>
												<p>
														<font size="2">例子1：<br />一个apache + 
mod_php的服务器：一个apache进程一般需要4M内存<br />因此在一个1G内存的机器上：apache_max_process_with_good_perfermance 
&lt; (1g / 4m) * 2 = 500<br />apache_max_process ＝ 500 * 1.5 = 
750<br />所以规划你的应用让服务尽量跑在500个进程以下以保持比较高的效率，并设置Apache的软上限在800个。</font>
												</p>
												<p>
														<font size="2">例子2：<br />一个apache + mod_resin的服务器： 一个apache进程一般需要2M内存<br />在一个2G内存的机器上： 
<br />apache_max_process_with_good_perfermance &lt; (2g / 2m ) * 2 = 
2000<br />apache_max_process ＝ 2000 * 1.5 = 3000</font>
												</p>
												<p>
														<font size="2">以上估算都是按小文件服务估算的（一个请求一般大小在20k以下）。对于文件下载类型站点，可能还会受其他因素：比如带宽等的影响。</font>
												</p>
												<p>
														<font size="2">
																<b>
																		<a name="install">Apache安装过程</a>
																</b>
														</font>
												</p>
												<p>
														<font size="2">服务器个数的硬上限HARD_SERVER_LIMIT的修改：<br />在Apache的源代码中缺省的最大进程数是256个，需要修改apache_1.3.xx/src/include/httpd.h<br />#ifndef 
HARD_SERVER_LIMIT<br />#ifdef WIN32<br />#define HARD_SERVER_LIMIT 1024<br />#elif 
defined(NETWARE)<br />#define HARD_SERVER_LIMIT 2048<br />#else<br />#define 
HARD_SERVER_LIMIT 2560 &lt;===将原来的HARD_SERVER_LIMIT 256 
后面加个“0”<br />#endif<br />#endif</font>
												</p>
												<p>
														<font size="2">解释：<br />Apache缺省的最大用户数是256个：这个配置对于服务器内存还是256M左右的时代是一个非常好的缺省设置，但随着内存成本的急剧下降，现在大型站点的服务器内存配置一般比当时要高一个数量级不止。所以256个进程的硬限制对于一台1G内存的机器来说是太浪费了，而且 
Apache的软上限 max_client是受限于HARD_SERVER_LIMIT的，因此如果WEB服务器内存大于256M，都应该调高Apache的 
HARD_SERVER_LIMIT。根据个人的经验：2560已经可以满足大部分小于2G内存的服务器的容量规划了（Apache的软上限的规划请看后面）。</font>
												</p>
												<p>
														<font size="2">Apache的编译：以下通用的编译选项能满足以后任意模块的安装<br />./configure 
--prefix=/another_driver/apache/ --enable-shared=max<i></i>--enable-module=most<br />比如：<br />./configure --prefix=/home/apache/ 
--enable-shared=max<i></i>--enable-module=most<br /></font>
												</p>
												<p>
														<font size="2">解释：<br />--prefix=/another_driver/apache/：建议将apache服务安装在另外一个驱动设备上的目的在于硬盘往往是一个系统使用寿命最低的设备，因此：将服务数据和系统完全分开，不仅能提高了数据的访问速度，更重要的，大大方便系统升级，应用备份和恢复过程。</font>
												</p>
												<p>
														<font size="2">--shared-module=max：使用动态加载方式<a href="http://httpd.apache.org/docs-2.0/en/dso.html">载入子模块会带来5%的性能下降</a>，但和带来的配置方便相比更本不算什么：比如模块升级方便，系统升级风险降低，安装过程标准化等</font>
												</p>
												<p>
														<font size="2">--enable-module=most：用most可以将一些不常用的module编译进来，比如后面讲到的mod_expire是就不在 
apache的缺省常用模块中</font>
												</p>
												<p>
														<font size="2">如果不想build so, 也可以这样:<br />./configure \<br />"--with-layout=Apache" 
\<br />"--prefix=/path/to/apache" \<br />"--disable-module=access" 
\<br />"--disable-module=actions" \<br />"--disable-module=autoindex" 
\<br />"--disable-module=env" \<br />"--disable-module=imap" 
\<br />"--disable-module=negotiation" \<br />"--disable-module=setenvif" 
\<br />"--disable-module=status" \<br />"--disable-module=userdir" 
\<br />"--disable-module=cgi" \<br />"--disable-module=include" 
\<br />"--disable-module=auth" \<br />"--disable-module=asis"</font>
												</p>
												<p>
														<font size="2">但结果会发现，这样编译对服务性能只能有微小的提高（5%左右），但却失去了以后系统升级和模块升级的灵活性，无论是模块还是Apache本身升级都必须把Apache和PHP的SOURCE加在一起重新编译。</font>
												</p>
												<p>
														<font size="2">apache的缺省配置文件一般比较大：可以使用去掉注释的方法精简一下：然后再进入具体的培植过程能让你更快的定制出你所需要的。<br />grep -v "#" 
httpd.conf.default &gt;httpd.conf</font>
												</p>
												<p>
														<font size="2">需要修改的通用项目有以下几个：</font>
												</p>
												<p>
														<font size="2">#服务端口，缺省是8080，建议将整个Apache配置调整好后再将服务端口改到正式服务的端口<br />Port 8080 =&gt; 80</font>
												</p>
												<p>
														<font size="2">#服务器名：缺省没有<br />ServerName 
name.example.com<br /><br />#最大服务进程数：根据服务容量预测设置<br />MaxClients 256 =&gt; 800</font>
												</p>
												<p>
														<font size="2">#缺省启动服务后的服务进程数：等服务比较平稳后，按平均负载下的httpd个数设置就可以<br />StartServers 5 =&gt; 200</font>
												</p>
												<p>
														<font size="2">不要修改：<br />以前有建议说修改：<br />MinSpareServers 5 =&gt; 100<br />MaxSpareServers 10 =&gt; 
200</font>
												</p>
												<p>
														<font size="2">但从我的经验看来：缺省值已经是非常优化的了，而且让Apache自己调整子共享进程个数还是比较好的。</font>
												</p>
												<p>
														<font size="2">特别修改：<br />在solaris或一些比较容易出现内存泄露的应用上：<br />MaxRequestsPerChild 0 =&gt;3000</font>
												</p>
												<p>
														<font size="2">
																<b>
																		<a name="module">应用模块和工具的安装</a>配置：</b>
														</font>
												</p>
												<p>
														<font size="2">由于使用模块动态加载的模式，所以可以方便的通过简单的配置调整来把Apache定制成你需要的：最好把不常用模块全部清除（无论处于安全还是效率）。<br />比如：对于静态页面服务器：就什么其他子模块都不加载，对于PHP应用就加上PHP模块，对于JAVA应用就把Resin模块加载上。而且各种模块的插拔非常简单，这样调试过程中就可以简单的通过注释掉不需要的模块，而不用重新编译。</font>
												</p>
												<p>
														<font size="2">一般说来，可以不需要的模块包括：<br />#LoadModule env_module libexec/mod_env.so<br />#LoadModule 
negotiation_module libexec/mod_negotiation.so<br />#LoadModule status_module 
libexec/mod_status.so<br />#server side include已经过时了<br />#LoadModule 
includes_module 
libexec/mod_include.so<br />#不需要将没有缺省index文件的目录下所有文件列出<br />#LoadModule 
autoindex_module 
libexec/mod_autoindex.so<br />#尽量不使用CGI：一直是Apache安全问题最多的地方<br />#LoadModule 
cgi_module libexec/mod_cgi.so<br />#LoadModule asis_module 
libexec/mod_asis.so<br />#LoadModule imap_module 
libexec/mod_imap.so<br />#LoadModule action_module 
libexec/mod_actions.so<br />#不使用安全认证可以大大提高访问速度<br />#LoadModule access_module 
libexec/mod_access.so<br />#LoadModule auth_module 
libexec/mod_auth.so<br />#LoadModule setenvif_module libexec/mod_setenvif.so</font>
												</p>
												<p>
														<font size="2">最好保留的有：<br />#用于定制log格式<br />LoadModule config_log_module 
libexec/mod_log_config.so<br />#用于增加文件应用的关联<br />LoadModule mime_module 
libexec/mod_mime.so<br />#用于缺省index文件：index.php等<br />LoadModule dir_module 
libexec/mod_dir.so</font>
												</p>
												<p>
														<font size="2">可用可不用的有：<br />#比如：需要在~/username/下调试php可以将<br />LoadModule userdir_module 
libexec/mod_userdir.so<br />#比如：需要将以前的URL进行转向或者需要使用CGI script-alias<br />LoadModule 
alias_module libexec/mod_alias.so<br /></font>
												</p>
												<p>
														<font size="2">常用的模块：<br />最常用的可能就是php和JAVA应用服务器的前端，此外，从性能上讲利用mod_gzip可以减少40%左右的流量，减少机器用于传输的负载，而 
mod_expires可以减少10%左右的重复请求，让重复的用户对指定的页面请求结果都CACHE在本地，根本不向服务器发出请求。</font>
												</p>
												<p>
														<font size="2">建议将所有MODULE的配置都放到相应模块的配置内部：<ifmodule some_module.c="">some_module config 
</ifmodule></font>
												</p>
												<p>
														<font size="2">PHP的安装：<br />/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs 
--with-other-modules-you-need<br />需要修改的配置：<br />AddType application/x-httpd-php 
.php .php3 .any_file_in_php</font>
												</p>
												<p>
														<font size="2">resin的安装设置：<br />/path/to/resin/src/configure 
--with-apxs=/path/to/apache/bin/apxs 
<br /><br />具体的resin设置放在另外一个文件中：比如/home/resin/conf/resin.conf<br /><ifmodule mod_caucho.c=""><br />CauchoConfigFile 
/path/to/apache/conf/resin.conf<br /></ifmodule></font>
												</p>
												<p>
														<font size="2">mod_expires的安装配置：<br /><ifmodule mod_expires.c=""><br />ExpiresActive 
on<br />ExpiresByType image/gif "access plus 1 month"<br />ExpiresByType text/css 
"now plus 1 month"<br />ExpiresDefault "now plus 1 day"<br /></ifmodule></font>
												</p>
												<p>
														<font size="2">注释：<br />所有的.gif文件1个月以后过期<br />所有的文件缺省1天以后过期<br /></font>
												</p>
												<p>
														<font size="2">
																<a href="http://www.chedong.com/tech/compress.html">mod_gzip的安装</a>
																<br />http://www.chedong.com/tech/compress.html<br /></font>
												</p>
												<font size="2">日志的轮循：cronolog的安装和设置<br /></font>
												<p>
														<font size="2">cronolog可以非常整齐的将日志按天轮循存储<br />缺省编译安装到/usr/local/bin/下，只需要将配置改成：</font>
												</p>
												<p>
														<font size="2">CustomLog "|/usr/local/sbin/cronolog /home/apache/logs/%w/access_log" 
combined<br /></font>
												</p>
												<font size="2">日志将按天截断并存放在以星期为目录名的目录下：比如：log/1是周一，log/5是周五, 
log/0是周日<br /><br />用gzip压缩每天的日志：<br />30 4 * * * /usr/bin/gzip -f 
/home/apache/logs/`date -d yesterday +%w`/access_log<br /><br />日志的定期删除：<br />30 5 * * 
*/usr/bin/find /home/apache/logs/ -name access_log.gz -mtime +3 |xargs -r 
/bin/rm -f<br /></font>
												<p>
														<font size="2">
																<b>
																		<a name="maintain">升级维护</a>：</b>
														</font>
												</p>
												<p>
														<font size="2">由于使用动态模块加载方式（DSO模式)安装Apache，Apache的HTTPD核心服务和应用模块以及应用模块之间都变的非常灵活，建议将所有独立模块的配置都放在<br /><ifmodule mod_name=""><br />CONFIGURATIONS..<br /></ifmodule><br />里，这样配置非常容易通过屏蔽某个模块来进行功能调整：比如：<br />#AddModule 
mod_gzip.c<br />就屏蔽了mod_gzip，而其他模块不首任何影响。</font>
												</p>
												<p>
														<font size="2">安装和维护过程：</font>
												</p>
												<ul>
														<li>
																<font size="2">系统安装：系统管理员的职责就是安装系统和一个按照DSO模式安装的Apache，然后COLON。 
</font>
														</li>
														<li>
																<font size="2">应用安装：由应用管理员负责具体应用所需要的模块并设置HTTPD。 
</font>
														</li>
														<li>
																<font size="2">系统升级：系统管理员：升级系统/升级Apache 
</font>
														</li>
														<li>
																<font size="2">应用升级：应用管理员：升级应用模块：PHP CAUCHO等 
</font>
														</li>
														<li>
																<font size="2">系统备份/恢复：如果Apache不在缺省的系统盘上，只需要将Apache目录备份就可以了，遇到系统分区的硬件问题直接使用预先准备好的系统COLON，再直接将Apache所在物理盘恢复就行了。 
</font>
														</li>
												</ul>
												<table border="1">
														<tbody>
																<tr>
																		<td style="text-align: right;">
																				<font size="2">系统管理员：Apache的最简化安装</font>
																		</td>
																		<td colspan="3" align="center">
																				<font size="2">OS + Apache (httpd core only)</font>
																		</td>
																</tr>
																<tr>
																		<td style="text-align: right;">
																				<font size="2">应用管理员：应用模块定制</font>
																		</td>
																		<td>
																				<font size="2">纯静态页面服务<br />core<br /></font>
																		</td>
																		<td>
																				<font size="2">PHP动态页面<br />core+so<br />+php<br /></font>
																		</td>
																		<td>
																				<font size="2">JAVA应用<br />core+so<br />+caucho<br />+ssl</font>
																		</td>
																</tr>
																<tr>
																		<td style="text-align: right;">
																				<font size="2">应用例子：</font>
																		</td>
																		<td>
																				<font size="2">www.example.com<br />image.example.com<br /></font>
																		</td>
																		<td>
																				<font size="2">bbs.example.com</font>
																		</td>
																		<td>
																				<font size="2">mall.example.com</font>
																		</td>
																</tr>
														</tbody>
												</table>
												<p>
														<font size="2">
																<br />
														</font>
												</p>
												<p>
														<font size="2">例子：Apache和PHP模块的独立升级。</font>
												</p>
												<p>
														<font size="2">如果Apache是按照以下方式安装：<br />./configure --prefix=/home/apache --enable-shared=max 
--enable-module=most <br />PHP是按照以下方式安装：<br />./configure 
--with-apxs=/home/apache/bin/apxs --enable-track-vars 
--with-mysql<br /><br />以后单独升级Apache的时候，仍然是：<br />./configure --prefix=/home/apache 
--enable-shared=max --enable-module=most 
<br />make<br />su<br />#/home/apache/bin/apachectl stop<br />#make 
install<br /><br />单独升级php时，仍然是：<br />./configure --with-apxs=/home/apache/bin/apxs 
--enable-track-vars --with-mysql<br />make<br />su<br />#/home/apache/bin/apachectl 
stop<br />#make install<br />#/home/apache/bin/apachectl start<br /></font>
												</p>
												<p>
														<font size="2">基于反相代理的WEB加速：<br />squid和mod_proxy都可以实现反相代理加速。而基于缓存的代理加速比起原有WEB服务，速度会有数量级的提升。<br /><br /></font>
												</p>
												<p>
														<font size="2">小提示：</font>
												</p>
												<p>
														<font size="2">Apache安装后，缺省根目录下没有但很有用的2个文件:</font>
												</p>
												<ul>
														<li>
																<font size="2">favicon.ico: 
favicon.ico是一个16x16的站点图标文件，如果浏览器发现有这个文件，在地址栏中会用这个图标替换调浏览器的网页图标。IE6和 
MOZILLA等主流浏览器都支持这个功能。<br />例如： <a href="http://www.chedong.com/favicon.ico">http://www.chedong.com/favicon.ico<br /></a></font>
														</li>
														<li>
																<font size="2">robots.txt: 用于告诉搜索引擎的爬虫程序（spider）网站那些页面可以被索引，那些不可以。<br />具体说明请参考：<a href="http://www.robotstxt.org/wc/robots.html">http://www.robotstxt.org/wc/robots.html</a></font>
														</li>
												</ul>
												<p>
														<font size="2">参考文档：</font>
												</p>
												<p>
														<font size="2">Apache项目<br /><a href="http://httpd.apache.org/">http://httpd.apache.org</a></font>
												</p>
												<p>
														<font size="2">PHP<br /><a href="http://www.php.net/">http://www.php.net</a></font>
												</p>
												<p>
														<font size="2">Resin<br /><a href="http://www.caucho.com/">http://www.caucho.com</a></font>
												</p>
												<p>
														<font size="2">mod_gzip<br /><a href="http://sourceforge.net/projects/mod-gzip/">http://sourceforge.net/projects/mod-gzip/</a></font>
												</p>
												<p>
														<font size="2">Cronolog<br /><a href="http://www.cronolog.org/">http://www.cronolog.org</a></font>
												</p>
												<p>
														<font size="2">mod_expires<br /><a href="http://httpd.apache.org/docs/mod/mod_expires.html">http://httpd.apache.org/docs/mod/mod_expires.html</a><br /></font>
												</p>
												<p>
														<font size="2">面向搜索引擎的CMS设计：<br /><a href="http://www.chedong.com/tech/cms.html">http://www.chedong.com/tech/cms.html</a><br /></font>
												</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/hellotony/aggbug/49330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2006-05-31 21:10 <a href="http://www.blogjava.net/hellotony/articles/49330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat配置技巧Top 10排行榜</title><link>http://www.blogjava.net/hellotony/articles/20561.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Sat, 19 Nov 2005 04:16:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/20561.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/20561.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/20561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/20561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/20561.html</trackback:ping><description><![CDATA[<font size="2">1、配置系统管理（Admin Web Application） 
<br><br>大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面。Tomcat按照自己的方式，同样提
供一个成熟的管理工具，并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web
Application最初在4.1版本时出现，当时的功能包括管理context、data
source、user和group等。当然也可以管理像初始化参数，user、group、role的多种数据库管理等。在后续的版本中，这些功能将得
到很大的扩展，但现有的功能已经非常实用了。Admin Web
Application被定义在自动部署文件：CATALINA_BASE/webapps/admin.xml
。（译者注：CATALINA_BASE即tomcat安装目录下的server目录） <br><br>你必须编辑这个文件，以确定Context中的docBase参数是绝对路径。也就是说，CATALINA
<br><br>_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></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>＜role name="admin"/＞</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>你同样需要有一个用户，并且这个用户的角色是“admin”。象存在的用户那样，添加一个用户（改变密码使其更加安全）： 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>＜user name="admin" <br>password="deep_dark_secret"<br>roles="admin"/＞</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>当你完成这些步骤后，请重新启动Tomcat，访问http://localhost:8080/admin，你将看到一个登录界面。
Admin Web Application采用基于容器管理的安全机制，并采用了Jakarta
Struts框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。 <br><br>2、配置应用管理（Manager Web Application） 
<br><br>Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面，执行一些简单的Web应用任务。Manager Web Application被被定义在一个自动部署文件中： 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>CATALINA_BASE/webapps/manager.xml</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>你必须编辑这个文件，以确保context的docBase参数是绝对路径，也就是说CATALINA_HOME/server/webapps/manager的绝对路径。（译者注：CATALINA_HOME即tomcat安装目录） 
<br><br>如果你使用的是UserDatabaseRealm，那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来，编辑这个文件，添加一个名为“manager”的角色到该文件中： 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>＜role name=”manager”＞</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>你同样需要有一个角色为“manager”的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）： 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>＜user name="manager" <br>password="deep_dark_secret" <br>roles="manager"/＞</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>然后重新启动Tomcat，访问http://localhost/manager/list，将看到一个很朴素的文本型管理界面，或者
访问http://localhost/manager/html/list，将看到一个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>
              3、部署一个web应用 
<br><br>有两个办法可以在系统中部署web服务。 
<br><br>1. 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到$CATALINA_BASE/webapps目录下。 
<br><br>2. 为你的web服务建立一个只包括context内容的XML片断文件，并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。 
<br><br>如果你有一个WAR文件，你若想部署它，则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可，文件必须
以“.war”作为扩展名。一旦Tomcat监听到这个文件，它将（缺省的）解开该文件包作为一个子目录，并以WAR文件的文件名作为子目录的名字。
<br><br>接下来，Tomcat将在内存中建立一个context，就好象你在server.xml文件里建立一样。当然，其他必需的内容，将从server.xml中的DefaultContext获得。 
<br><br>部署web应用的另一种方式是写一个Context XML片断文件，然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件，而只是一个context元素，以及对该应用的相应描述。
<br><br>这种片断文件就像是从server.xml中切取出来的context元素一样，所以这种片断被命名为“context片断”。 
<br><br>举个例子，如果我们想部署一个名叫MyWebApp.war的应用，该应用使用realm作为访问控制方式，我们可以使用下面这个片断： 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>＜!-- <br>Context fragment for deploying MyWebApp.war <br>--＞ <br>＜Context path="/demo" <br>docBase="webapps/MyWebApp.war" <br>debug="0" privileged="true"＞ <br>＜Realm className=<br>"org.apache.catalina.realm.UserDatabaseRealm" <br>resourceName="UserDatabase"/＞ <br>＜/Context＞</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>把该片断命名为“MyWebApp.xml”，然后拷贝到CATALINA_BASE/webapps目录下。 
<br><br>这种context片断提供了一种便利的方法来部署web应用，你不需要编辑server.xml，除非你想改变缺省的部署特性，安装一个新的web应用时不需要重启动Tomcat。 
<br><br>4、配置虚拟主机（Virtual Hosts） 
<br><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><br>在Tomcat中使用虚拟主机，你需要设置DNS或主机数据。为了测试，为本地IP设置一个IP别名就足够了，接下来，你需要在server.xml中添加几行内容，如下： 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>＜Server port="8005" <br>shutdown="SHUTDOWN" debug="0"＞ <br>＜Service name="Tomcat-Standalone"＞ <br>＜Connector className=<br>"org.apache.coyote.tomcat4.CoyoteConnector" <br>port="8080" <br>minProcessors="5" maxProcessors="75" <br>enableLookups="true"<br>redirectPort="8443"/＞ <br>＜Connector className=<br>"org.apache.coyote.tomcat4.CoyoteConnector" <br>port="8443" minProcessors="5"<br>maxProcessors="75" <br>acceptCount="10" debug="0" <br>scheme="https" secure="true"/＞ <br>＜Factory className="org.apache.coyote.<br>tomcat4.CoyoteServerSocketFactory" <br>clientAuth="false" protocol="TLS" /＞ <br>＜/Connector＞ <br>＜Engine name="Standalone" <br>defaultHost="localhost" debug="0"＞ <br>＜!-- This Host is the default Host --＞ <br>＜Host name="localhost" <br>debug="0" appBase="webapps" <br>unpackWARs="true" autoDeploy="true"＞ <br>＜Context path="" docBase="ROOT" debug="0"/＞ <br>＜Context path="/orders" <br>docBase="/home/ian/orders" debug="0" <br>reloadable="true" crossContext="true"＞ <br>＜/Context＞ <br>＜/Host＞ <br><br>＜!-- This Host is the first <br>"Virtual Host": http://www.example.com/ --＞ <br>＜Host name="www.example.com"<br>appBase="/home/example/webapp"＞ <br>＜Context path="" docBase="."/＞ <br>＜/Host＞ <br><br>＜/Engine＞ <br>＜/Service＞ <br>＜/Server＞</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>Tomcat的server.xml文件，在初始状态下，只包括一个虚拟主机，但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示
的是一个简单的server.xml版本，其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素，所包含的
context元素中必须有一个是默认的context，这个默认的context的显示路径应该为空（例如，path=””）。<br><br>
              5、配置基础验证（Basic Authentication） 
<br><br>容器管理验证方法控制着当用户访问受保护的web应用资源时，如何进行用户的身份鉴别。当一个web应用使用了Basic
Authentication（BASIC参数在web.xml文件中auto-method元素中设置），而有用户访问受保护的web应用时，
Tomcat将通过HTTP Basic
Authentication方式，弹出一个对话框，要求用户输入用户名和密码。在这种验证方法中，所有密码将被以64位的编码方式在网络上传输。 <br><br>注意：使用Basic Authentication通过被认为是不安全的，因为它没有强健的加密方法，除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式（比如，在一个虚拟私人网络中）。若没有额外的加密方法，网络管理员将能够截获（或滥用）用户的密码。
<br><br>但是，如果你是刚开始使用Tomcat，或者你想在你的web应用中测试一下基于容器的安全管理，Basic
Authentication还是非常易于设置和使用的。只需要添加＜security-constraint＞和＜login-config＞两个元素
到你的web应用的web.xml文件中，并且在CATALINA_BASE/conf/tomcat-users.xml文件中添加适当的＜role＞
和＜user＞即可，然后重新启动Tomcat。 <br><br>下面例子中的web.xml摘自一个俱乐部会员网站系统，该系统中只有member目录被保护起来，并使用Basic Authentication进行身份验证。请注意，这种方式将有效的代替Apache web服务器中的.htaccess文件。 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>＜!-- <br>Define the<br>Members-only area,<br>by defining <br>a "Security Constraint"<br>on this Application, and <br>mapping it to the <br>subdirectory (URL) that we want <br>to restrict. <br>--＞ <br>＜security-constraint＞ <br>＜web-resource-collection＞ <br>＜web-resource-name＞ <br>Entire Application <br>＜/web-resource-name＞ <br>＜url-pattern＞/members/*＜/url-pattern＞ <br>＜/web-resource-collection＞ <br>＜auth-constraint＞ <br>＜role-name＞member＜/role-name＞ <br>＜/auth-constraint＞ <br>＜/security-constraint＞ <br>＜!-- Define the Login <br>Configuration for<br>this Application --＞ <br>＜login-config＞ <br>＜auth-method＞BASIC＜/auth-method＞ <br>＜realm-name＞My Club <br>Members-only Area＜/realm-name＞ <br>＜/login-config＞</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>6、配置单点登录（Single Sign-On） 
<br><br>一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。
<br><br>如果你运行了多个web应用，并且每个应用都需要进行单独的用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问多少个不同的应用，只是很迷惑，为什么总要不停的登录。 
<br><br>Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有web应用时，只需登录一次。为了使用这个功能，你只需要在Host上添加一个SingleSignOn Valve元素即可，如下所示： 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>＜Valve className=<br>"org.apache.catalina.<br>authenticator.SingleSignOn" <br>debug="0"/＞</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>在Tomcat初始安装后，server.xml的注释里面包括SingleSignOn
Valve配置的例子，你只需要去掉注释，即可使用。那么，任何用户只要登录过一个应用，则对于同一虚拟主机下的所有应用同样有效。使用single
sign-on valve有一些重要的限制： <br><br>1＞ value必须被配置和嵌套在相同的Host元素里，并且所有需要进行单点验证的web应用（必须通过context元素定义）都位于该Host下。 
<br><br>2＞ 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。 
<br><br>3＞ 不能被context中的realm覆盖。 
<br><br>4＞ 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式（被定义在web.xml中的＜auth-method＞中），这比自定义的验证方式强，Tomcat内置的的验证方式包括basic、digest、form和client-cert。 
<br><br>5＞ 如果你使用单点登录，还希望集成一个第三方的web应用到你的网站中来，并且这个新的web应用使用它自己的验证方式，而不使用容器管理安全，那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次，并且在请求新的第三方应用时还得再登录一次。
<br><br>当然，如果你拥有这个第三方web应用的源码，而你又是一个程序员，你可以修改它，但那恐怕也不容易做。 
<br><br>6＞ 单点登录需要使用cookies。<br><br>
              7、配置用户定制目录（Customized User Directores） 
<br><br>一些站点允许个别用户在服务器上发布网页。例如，一所大学的学院可能想给每一位学生一个公共区域，或者是一个ISP希望给一些web空间给他的客户，但这又不是虚拟主机。在这种情况下，一个典型的方法就是在用户名前面加一个特殊字符（~），作为每位用户的网站，比如： 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>http://www.cs.myuniversity.edu/~username <br>http://members.mybigisp.com/~username</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>Tomcat提供两种方法在主机上映射这些个人网站，主要使用一对特殊的Listener元素。Listener的className属
性应该是org.apache.catalina.startup.UserConfig，userClass属性应该是几个映射类之一。
<br><br>如果你的系统是Unix，它将有一个标准的/etc/passwd文件，该文件中的帐号能够被运行中的Tomcat很容易的读取，该文件指定了用户的主目录，使用PasswdUserDatabase 映射类。 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>＜Listener className=<br>"org.apache.catalina.startup.UserConfig" <br>directoryName="public_html" <br>userClass="org.apache.catalina.<br>startup.PasswdUserDatabase"/＞</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>web文件需要放置在像/home/users/ian/public_html或者/users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。 
<br><br>实际上，这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件，但你又想把一个用户名映射到公共的像/home一样目录的子目录里面，则可以使用HomesUserDatabase类。 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>＜Listener className=<br>"org.apache.catalina.startup.UserConfig" <br>directoryName="public_html"<br>homeBase="/home" <br>userClass="org.apache.catalina.<br>startup.HomesUserDatabase"/＞</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>这样一来，web文件就可以位于像/home/ian/public_html或者/home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利，你可以使用一个像c:\home这样的目录。 
<br><br>这些Listener元素，如果出现，则必须在Host元素里面，而不能在context元素里面，因为它们都用应用于Host本身。 
<br><br>8、在Tomcat中使用CGI脚本 
<br><br>Tomcat主要是作为Servlet/JSP容器，但它也有许多传统web服务器的性能。支持通用网关接口（Common Gateway Interface，即CGI）就是其中之一，CGI提供一组方法在响应浏览器请求时运行一些扩展程序。
<br><br>CGI之所以被称为通用，是因为它能在大多数程序或脚本中被调用，包括：Perl，Python，awk，Unix shell scripting等，甚至包括Java。
<br><br>当然，你大概不会把一个Java应用程序当作CGI来运行，毕竟这样太过原始。一般而言，开发Servlet总要比CGI具有更好的效率，因为当用户点击一个链接或一个按钮时，你不需要从操作系统层开始进行处理。 
<br><br>Tomcat包括一个可选的CGI Servlet，允许你运行遗留下来的CGI脚本。 
<br><br>为了使Tomcat能够运行CGI，你必须做如下几件事： 
<br><br>1. 把servlets-cgi.renametojar （在CATALINA_HOME/server/lib/目录下）改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。 
<br><br>2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中，把关于＜servlet-name＞ CGI的那段的注释去掉（默认情况下，该段位于第241行）。 
<br><br>3. 同样，在Tomcat的CATALINA_BASE/conf/web.xml文件中，把关于对CGI进行映射的那段的注释去掉（默认情况下，该段位于第299行）。注意，这段内容指定了HTML链接到CGI脚本的访问方式。 
<br><br>4. 你可以把CGI脚本放置在WEB-INF/cgi
目录下（注意，WEB-INF是一个安全的地方，你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处），或者你也可以把CGI脚本放置在
context下的其他目录下，并为CGI Servlet调整cgiPathPrefix初始化参数。这就指定的CGI
Servlet的实际位置，且不能与上一步指定的URL重名。 <br><br>5. 重新启动Tomcat，你的CGI就可以运行了。 
<br><br>在Tomcat中，CGI程序缺省放置在WEB-INF/cgi目录下，正如前面所提示的那样，WEB-INF目录受保护的，通过客户端的浏览器无法窥探到其中内容，所以对于放置含有密码或其他敏感信息的CGI脚本而言，这是一个非常好的地方。
<br><br>为了兼容其他服务器，尽管你也可以把CGI脚本保存在传统的/cgi-bin目录，但要知道，在这些目录中的文件有可能被网上好奇的冲浪者看到。另外，在Unix中，请确定运行Tomcat的用户有执行CGI脚本的权限。              
              <br><br>
              9、改变Tomcat中的JSP编译器（JSP Compiler） 
<br><br>在Tomcat 4.1（或更高版本，大概），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。
<br><br>这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac page列表。
<br><br>使用起来是容易的，因为你只需要在＜init-param＞ 元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下： 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>＜servlet＞ <br>＜servlet-name＞jsp＜/servlet-name＞ <br>＜servlet-class＞ <br>org.apache.jasper.servlet.JspServlet <br>＜/servlet-class＞ <br>＜init-param＞ <br>＜param-name＞logVerbosityLevel<br>＜/param-name＞ <br>＜param-value＞WARNING＜/param-value＞ <br>＜/init-param＞ <br>＜init-param＞ <br>＜param-name＞compiler＜/param-name＞ <br>＜param-value＞jikes＜/param-value＞ <br>＜/init-param＞ <br>＜load-on-startup＞3＜/load-on-startup＞ <br>＜/servlet＞</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>当然，给出的编译器必须已经安装在你的系统中，并且CLASSPATH可能需要设置，那处决于你选择的是何种编译器。 
<br><br>10、限制特定主机访问（Restricting Access to Specific Hosts） 
<br><br>有时，你可能想限制对Tomcat
web应用的访问，比如，你希望只有你指定的主机或IP地址可以访问你的应用。这样一来，就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效
果，Tomcat提供了两个参数供你配置：RemoteHostValve 和RemoteAddrValve。 <br><br>通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。例如你可以把Admin Web application设置成只允许本地访问，设置如下： 
<br><br></font><center><font size="2"><ccid_nobr>
</ccid_nobr></font><table bordercolorlight="black" bordercolordark="#FFFFFF" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
<tbody><tr>
    <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
    <pre><font size="2"><ccid_code>＜Context path=<br>"/path/to/secret_files" ...＞ <br>＜Valve className="org.apache.<br>catalina.valves.RemoteAddrValve" <br>allow="127.0.0.1" deny=""/＞ <br>＜/Context＞</ccid_code></font></pre> 
   </td>
  </tr>
</tbody></table>
</center>
<font size="2"><br><br>如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。
<br><br></font><img src ="http://www.blogjava.net/hellotony/aggbug/20561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2005-11-19 12:16 <a href="http://www.blogjava.net/hellotony/articles/20561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat+MySql数据库连接池配置经验实例</title><link>http://www.blogjava.net/hellotony/articles/19734.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Mon, 14 Nov 2005 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/19734.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/19734.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/19734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/19734.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/19734.html</trackback:ping><description><![CDATA[<font size="2">连接池的配置(Tomcat+MySql)有两种方式:代码配置与可视化配置。<br>其中，可视化配置方便快捷，下面就根据我配置的经验写下配置的过程。<br>版本:MySQL-4.19、Tomcat--5.5.9。<br>在
进行Tomcat连接池配置前，先解压缩mysql-connector-java-xxx.zip，将其中的mysql-connector-java
-3.x.x-xxx.jar取出，置于&lt;%TOMCAT_HOME%&gt;\common\lib中，没有？去http:
//www.mysql.com/products下载吧。<br><br>1.如果Tomcat没有安装Admin，先安装Admin。安装后以
admin权限登陆(用户管理在/conf/tomcat-user.xml下，如果没有admin权限的用户了，新建一个用户，或者将已有的
tomcat或者both等设置roles="admin");<br>2.登陆以后，在左边的选择栏里可以看到如下功能：<br>&nbsp;&nbsp;--Tomcat Server <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--+Service (Catalina) <br>&nbsp;&nbsp;--Resources <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--+Data Sources <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--+Mail Sessions <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--+Environment Entries <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--+User Databases <br>&nbsp;&nbsp;--User Definition <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--+Users <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--+Groups <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--+Roles <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;点Data Sources--&gt;Data Source Actions 下拉选择Create New Data Source.填写下面几个选项,其中yxz是我建立的mySql实例，根据情况修改。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JNDI
Name:&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mySql/yxz
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data Source URL:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbc:mysql://localhost:3306/yxz<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JDBC Driver Class:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.mysql.jdbc.Driver<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User Name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Password:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max. Active Connections: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;---最大活跃连接数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max. Idle Connections:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;---最大闲置连接数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max. Wait for Connection:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5000&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validation Query:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;完成后，按save，再按Commit Changes，OK!<br>3.此时,数据库连接池可视化配置完成。但如果要在相应的应用下使用该连接池，仍旧需要另外的工作，就是配置相应的content.xml。在yourapp/META-INF/下建立content.xml文件，将刚才的配置拷贝进去，如下：<br></font><pre title="pre code" class="overflow"><font size="2"><br>&lt;Context path="/yourapp" docBase="yourapp" debug="5" reloadable="true"&gt; <br>&nbsp;&nbsp; &lt;Resource name="jdbc/yxz" auth="Container" type="javax.sql.DataSource"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driverClassName="com.mysql.jdbc.Driver"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url="jdbc:mysql://localhost:3306/yxz"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username="root" password="root"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxActive="20" maxIdle="10" maxWait="-1" /&gt;<br>&lt;/Context&gt;<br><br></font></pre><font size="2"><br>保存，OK。<br>4. 在mySql里的yxz下建立table：user 进行测试。user表含有字段ID，Name。<br>5.测试程序,在yourapp下建立index.jsp，拷贝下面代码：<br><br></font><pre title="pre code" class="overflow"><font size="2"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%@page contentType="text/html;charset=gb2312"%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%@page import="java.sql.*"%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%@page import="javax.sql.DataSource"%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%@page import="javax.naming.*"%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;html&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;body&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context initCtx=new InitialContext();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSource db = (DataSource)initCtx.lookup("java:comp/env/jdbc/yxz");&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection conn = db.getConnection();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement stmt = conn.createStatement();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet rs = stmt.executeQuery("SELECT * FROM user");&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("User-list"+"&lt;br&gt;");&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(rs.next()){&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.print(rs.getString(1)+" ");&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.print(rs.getString(2)+"&lt;br&gt;");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--关闭数据库连接，实际是将连接放到mySql的连接池pool内了。--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null!=rs){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null!=stmt){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt.close(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null!=conn){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;out.print(e);}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/body&gt;<br>&lt;/html&gt;<br></font></pre><font size="2"><br>6.启动Tomcat，在浏览器内敲入http://localhost:8080/yourapp/index.jsp，OK，如果看到查询的user，恭喜了!</font><img src ="http://www.blogjava.net/hellotony/aggbug/19734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2005-11-14 16:59 <a href="http://www.blogjava.net/hellotony/articles/19734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>四步搞定tomcat 5.5.X admin</title><link>http://www.blogjava.net/hellotony/articles/19733.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Mon, 14 Nov 2005 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/19733.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/19733.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/19733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/19733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/19733.html</trackback:ping><description><![CDATA[<font size="2">Tomcat 5.5及以后的版本，都不带Tomcat Administration。安装完tomcat，如果打开在<a href="http://localhost:8080/">http://localhost:8080</a>的
页面，点击左上角的Tomcat Administration，tomcat会告诉你“Tomcat's administration web
application is no longer installed by default. Download and install the
"admin" package to use
it.”这个信息。那么下载了jakarta-tomcat-5.5.x-admin.zip之后，如何配置呢？<br>1、解压jakarta-tomcat-5.5.x-admin.zip到d:\unzip；<br>2、将D:\unzip\apache-tomcat-5.5.x\server\webapps\下整个admin目录拷贝到&lt;tomcat_home&gt;\server\webapps下；<br>3、将D:\unzip\apache-tomcat-5.5.x\conf\Catalina\localhost\admin.xml这个文件拷贝到&lt;tomcat_home&gt;\conf\Catalina\localhost下面；<br>4、<br>conf\tomcat-users.xml 中加入<br>&nbsp;&lt;user username="admin" password="admin" roles="admin,manager"/&gt;<br>重新启动tomcat，Administration应该可以用了。</font><img src ="http://www.blogjava.net/hellotony/aggbug/19733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2005-11-14 16:57 <a href="http://www.blogjava.net/hellotony/articles/19733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何配置Tomcat下的MS SQL Server连接池？</title><link>http://www.blogjava.net/hellotony/articles/19732.html</link><dc:creator>Tony</dc:creator><author>Tony</author><pubDate>Mon, 14 Nov 2005 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/hellotony/articles/19732.html</guid><wfw:comment>http://www.blogjava.net/hellotony/comments/19732.html</wfw:comment><comments>http://www.blogjava.net/hellotony/articles/19732.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hellotony/comments/commentRss/19732.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellotony/services/trackbacks/19732.html</trackback:ping><description><![CDATA[<font size="2">一.在tomcat_home\common下放入jdbc的三个驱动程序(一定要的哦)，可以在微软的网站上去下载，安
装的SQLSERVER2k默认的用户名是sa,密码是空，但密码为空并不代表没有密码，所以你的url中一定要定义username和
password，最好是重设定一下密码<br>二.出现不能引用错误的话一般就是路径没有写对，tomcat默认的路径是tomcat_home\webapps\不过使用5.5.x的话，按下面方法就行，不需要配置路径，而且也不用在youwebapp\WEB-INF\web.xml文件配置引用<br>三.
tomcat5.5.x版的server.xml配置与tomcat5.0的配置不同，下面列举三种在tomcat5.5.x的配置方法，如果配置不正确
会出现javax.naming.NameNotFoundException: Name is not bound in this
Context 错误<br>方式一、全局数据库连接池<br>1、通过管理界面配置连接池，或者直接在tomcat\conf\server.xml的GlobalNamingResources中增加<br>&lt;Resource
name="jdbc/mydb" type="javax.sql.DataSource" password="mypwd"
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
maxIdle="2" maxWait="5000" validationQuery="select 1" username="sa"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"
maxActive="4"/&gt;<br>2、在tomcat\webapps\myapp\META-INF\context.xml的Context中增加：<br>&lt;ResourceLink global="jdbc/mydb" name="jdbc/mydb" type="javax.sql.DataSource"/&gt;<br>这样就可以了。<br>方式二、全局数据库连接池<br>1、同上<br>2、在tomcat\conf\context.xml的Context中增加：<br>&lt;ResourceLink global="jdbc/mydb" name="jdbc/mydb" type="javax.sql.DataSource"/&gt;<br>方式三、局部数据库连接池<br>只需在tomcat\webapps\myapps\META-INF\context.xml的Context中增加：<br>&lt;Resource
name="jdbc/mydb" type="javax.sql.DataSource" password="mypwd"
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
maxIdle="2" maxWait="5000" validationQuery="select 1" username="sa"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"
maxActive="4"/&gt;<br>参数说明：<br>driveClassName：JDBC驱动类的完整的名称； <br>maxActive：同时能够从连接池中被分配的可用实例的最大数； <br>maxIdle：可以同时闲置在连接池中的连接的最大数； <br>maxWait：最大超时时间，以毫秒计； <br>password：用户密码； <br>url：到JDBC的URL连接； <br>user：用户名称； <br>validationQuery：用来查询池中空闲的连接。<br>以上三种方式在tomcat 5.5.4下都可以。另外，sql server的jdbc driver是从微软网站上下载的sql server jdbc (sp3)。<br>四.
报错org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create
PoolableConnectionFactory ([Microsoft][SQLServer 2000 Driver for
JDBC]Error establishing
socket.)此是一个小问题，因为我的SQLSERVER2K的服务改成手动的，所以每次启动后就要手动的启动SQLSERVER2K，由于一下子不
记的启动了，所以报些错误，所以如果你经常要用到SQLSERVER2K的话，最好不要将其改为手动启动</font><img src ="http://www.blogjava.net/hellotony/aggbug/19732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellotony/" target="_blank">Tony</a> 2005-11-14 16:57 <a href="http://www.blogjava.net/hellotony/articles/19732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>