You are on page 1of 26

本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.

com -1-

Tomcat 视频课程

Tomcat 是 一 种 流 行 的 J2EE 应 用 服 务 器 , 和 Bea[Oracle] 公 司 的 weblgoic,IBM 公 司 的


websphere,Caucho 公司的 resin,Sun 公司的 Sun Java Application Server,及 glassfish 等是同类产
品.也是业界使用较多的开源产品.Jboss 的 web 容器就是集成的 tomcat..
Tomcat 版本 4.x,5.5.x,6.0.x……
不同版本功能差异较大,配置也变化多样.这里主要探讨 Tomcat5.5.x/Tomcat6 系列的安装配置
与集群. 注意 Tomcat 5 及以后版本才支持集群功能的.以前版本需要一个额外的 jar 包来提供
集群功能

操作系统以 Redhat 企业版 5.2 为平台.

大纲:
*安装部分
1.JDK 安装
2.Tomcat 安装
3.认识目录结构

*管理部分
1.应用部署
2.JDBC 配置
3.URL 保护
4.虚拟主机
5.集成 Apache
6.性能调整

*集群部分
1.Tomcat 集群
2.APACHE 负载与 mod_proxy_ajp.so
3.APACHE 负载与 Mod_jk.so
4.会话复制

安装部分:
一个 J2EE 服务器的运行必须要 jvm 的支持.也就是说要安装 java 运行环境。 而包含 java 运
行环境的产品使用比较流行的就是 sun 的产品:JDK ,当然还有其他公司的如 IBM,HP 等。
这些 JDK 的 RPM 包在 redhat 5 附加盘有提供。
J2EE 服务器商业版本一般都集成了 JDK 的,如 BEA 的 weblogic,IBM 的 websphere。

Sun 公司 JDK 图:
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com -2-

JDK,JRE,JVM 三者的关系:
JDK (Java Development Kit)
JDK 是整个 Java 的核心,包括了 Java 运行环境(Java Runtime Envirnment),一堆 Java 工具
和 Java 基础的类库(rt.jar)。不论什么 Java 应用服务器实质都是内置了某个版本的 JDK。
JRE(Java Runtime Environment,Java 运行环境),运行 JAVA 程序所必须的环境的集合,包
含 JVM 标准实现及 Java 核心类库。
JRE 是 Java 运行环境 (Java Runtime Enviroment) 的缩写。
jre -- java rutime environment java 运行环境 java 字节码的运行环境,要使用 Java 程序,JRE
是必不可少的环境
jdk -- java developer’s kit java 开发工具包 简单的说,你写的 java 源代码必须用 jdk 提供的编
译工具编译成.class 文件,才可由 jre 来执行,jdk 包含 jre 运行环境

1. JDK 的选择
我们作为 SA,应该清楚以下两点:
根据 J2EE 服务器要求而定
根据应用程序部署要求而定

如果一个产品在 jdk1.3 上编译的,你要在 jdk1.5 上运行,可能需要你在源码的基础上重新


编译.java 结尾的文件。如在 jdk 的运行目录下:
[foway~uplooking.com]#cd $JAVA_HOME/bin
[foway~uplooking.com]#javac </filedir/filename>.java
[foway~uplooking.com]#ls </filedir/filename>.classes
然后将.classes 文件放在部署目录下 WEB-INF/classes 即可让程序调用了。
编译通常借助开发工具如 Eclipse NetBean JBuilder JCreator JDeveloper ……
最流行的是 Eclipse/MyEclipse
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com -3-

2.JDK 的安装
安装 Jboss 需要 JDK 的支持,Jboss5 必须在 JDK5/6 系列上运行.
而 JDK 的厂商也有好几个如 IBM,BEA,HP,SUN.这里选择 Sun 公司的 JDK.
Redhat5 产品中包含了 jdk 的 rpm 包.在 supplementary 光盘中.
[foway~uplooking.com]# yum install java-1.6.0-sun*
#安装即可,但注意如果你安装了多个 rpm 包的 jdk 那么你需要使用
[foway~uplooking.com]# /usr/sbin/alternatives --config java.
[foway~uplooking.com]# /usr/sbin/alternatives --config javac.
[foway~uplooking.com]# /usr/sbin/alternatives --config java_sdk_1.6.0
切换成你需要的 JDK 版本与厂商.
[foway~uplooking.com]# java –version #看到的是你指定的 JDK 即可

Sun 公司源码:
http://java.sun.com/javase/downloads/index_jdk5.jsp
http://java.sun.com/javase/downloads/
选一种下即可. 二进制包有 2 种形式
jdk-<release>.bin 安装后在 当前执行.bin 所在目录
jdk-<release>.rpm.bin 安装后在/usr/java/jdk-<release> 目录,
同时在执行目录下有 jdk-<release>.rpm 包生成

3.JDK 环境变量
通常办法:
编辑.bashrc 或.bash_profile 或/etc/profile 或/etc/bashrc 等变量文件 添加
export JAVA_HOME=/JDK 安装目录
export PATH:$PATH:$JAVA_HOME/bin
………

推荐办法:
修改 J2EE 应用服务器的启动与关闭脚本文件中加入
export JAVA_HOME=/<jdk 安装目录>

4.Tomcat 安装
Tomcat 版本一般解压即可. 压缩包有 zip,tar 的.按照要求解压.

启动 tomcat :在解压目录下的 bin 中有 startup.sh/shutdown.sh 脚本.


如果你愿意写一个 shell 脚本添加到系统启动中去,那也很值得鼓励的.

5.目录结构
bin:启动与停止服务的一些相关脚本
common/server:类与库等加载到 tomcat 时用,如 jdbc 驱动到 common/lib 下.
开发的独立的 classes 包可放在 common/classes 中,依赖的 classes 包放在 server/classes
conf: tomcat 服务配置相关文件
webapps:程序放置的目录,如 jsp 放到 webapps/ROOT/下.
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com -4-

在 tomcat6 中目录结构与以前的有变化的。

[foway~uplooking.com ]# unzip apache-tomcat-5.5.27.zip –d /usr/local


[foway~uplooking.com ]# cd /usr/local;mv apache-tomcat-5.5.27 tomcat
[foway~uplooking.com ]#修改/tomcat/bin/startup.sh

# Better OS/400 detection: see Bugzilla 31132
后添加:
export JAVA_HOME=/usr/java/jdk1.5.0_10 #<jdk 安装路径>

修改./tomcat/bin/shutdown.sh

# resolve links - $0 may be a softlink
后添加:
export JAVA_HOME=/usr/java/jdk1.5.0_10 #<jdk 安装路径>
[foway~uplooking.com ]# ./tomcat/bin/startup.sh
即可启动tomcat了.并可以在http://ip:8080 中看到一个猫猫了.

管理部分:
1. 应用部署.
网站默认路径在 webapps/ROOT 下.所以我们的通常的程序应该放在这里.

一个 jsp 程序应该有 3 个要素的:


……WEB-INF 目录
…….xml 文件
…….java 语言程序文件

下面是部署一个 jsp 程序例子:


[foway~uplooking.com ]#cd /usr/local/tomcat/webapps/ROOT
[foway~uplooking.com ]# echo “
<%@ page contentType="text/html;charset=utf-8"%>
<% java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd");
java.util.Date currentTime_1 = new java.util.Date();
out.print(formatter.format(currentTime_1));
%>”>date.jsp

启动 tomcat 后
打开浏览器,输入 http://ip:8080/date.jsp 看到当前时间的话说明就成功了。

部署一个 Servlet 例子.


[foway~uplooking.com ]#mkdir /usr/local/tomcat/webapps/ROOT/WEB-INF/classes;cd !$
[foway~uplooking.com ]#echo “
import java.io.*;
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com -5-

import javax.servlet.*;
import javax.servlet.http.*;
public class hello extends HttpServlet
{
public void init(ServletConfig config) throws ServletException
{
super.init(config);
}
public void destroy()
{
super.destroy();
}
public void service(HttpServletRequest req,HttpServletResponse resp) throws
ServletException,IOException
{
resp.setContentType("text/html");
PrintWriter out=new PrintWriter(resp.getOutputStream());
out.println("<html>");
out.println("<head><title>hello ULP</title></head>");
out.println("<body>");
out.println("Hello ULP! This is test Servlet!");
out.println("</body>");
out.println("</html>");
out.close();
}
}”>hello.java
[foway~uplooking.com]#
cp /usr/local/tomcat/common/lib/servlet-api.jar /usr/java/jdk1.5.0_07/jre/lib/ext/
[foway~uplooking.com ]#export PATH=/usr/java/jdk1.5.0_07/bin:$PATH;javac hello.java
然后修改 web,xml 添加 servlet 参数:
[foway~uplooking.com ]#vi ../web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software


distributed under the License is distributed on an "AS IS" BASIS,
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com -6-

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.


See the License for the specific language governing permissions and
limitations under the License.
-->
<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">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
<!-- JSPC servlet mappings start -->
<servlet>
<servlet-name>org.apache.jsp.index_jsp</servlet-name>
<servlet-class>org.apache.jsp.index_jsp</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>org.apache.jsp.index_jsp</servlet-name>
<url-pattern>/index.jsp</url-pattern>
</servlet-mapping>
<!-- JSPC servlet mappings end -->
<!-- add context -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.do</url-pattern> <!-- 定义访问的 URL -->
</servlet-mapping>
<!-- end context -->
</web-app>
重启动 tomcat 后访问:http://ip:8080/hello.do
看到
Hello ULP! This is test Servlet!
即可.

部署一个 java bean 例子:


[foway~uplooking.com ]#mkdir /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/test
[foway~uplooking.com ]#cd !$;echo “
package test;
public class TestBean
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com -7-

{
private String name =null;
public TestBean(String nameInit){
this.name = nameInit;
}
public void setName(String newName){
this.name=newName;
}
public String getName(){
return this.name;
}
}”>TestBean.java
[foway~uplooking.com ]# export PATH=/usr/java/jdk1.5.0_07/bin:$PATH;javac TestBean.java
[foway~uplooking.com ]#cd /usr/local/webapps/ROOT;echo “
<%@ page import="test.TestBean" %>
<html>
<head>
<title>Test Bean</title>
</head>
<body>
<center>
<%
TestBean testBean = new TestBean("Hello ULP! test bean !");
%>
Java Bean Test:
The context is<%=testBean.getName()%>
</center>
</body>
</html>”>upbean.htm
重启 Tomcat,在浏览器输入:http://ip:8080/upbean.htm 看到:
Java Bean Test: The context isHello ULP! test bean !

即可
这样就完成了整个 Tomcat 下的 jsp、servlet 和 javabean 的配置。

另外可以在 conf/server.xml 中配置 http 端口,ajp 端口, 虚拟目录等

2. JDBC 配置
Jdbc 是 java 连接数据库的一种驱动程序.有了它 java 才能与 sql 通信.
下面是 mysql 配置的例子.
[foway~uplooking.com]# mysql --default-character-set=gbk
>create database tomcatdb;
>use tomcatdb;
>create table dd(id int,name varchar(256)) character set gbk collate gbk_chinese_ci;
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com -8-

>insert into dd values(1,'建表加 character set gbk collate gbk_chinese_ci');


>insert into dd values(2,'插入数据:mysql --default-character-set=gbk ');
>insert into dd values(3,'jsp 页面的编码设为 utf-8');
>commit;
>grant all on tomcatdb.* to tomcat@localhost identified by ‘tomcat’;
>exit;

在 Mysql 官方 JDBC 驱动名为 Connector/J。 例如我下的 Connector/J 5.0.3


复制解压目录下的 jar 包到 commom\lib 目录下
[foway~uplooking.com]#cd /usr/local/tomcat/common/lib
[foway~uplooking.com]# cp /tmp/mysql-connector-java-5.0.3-bin.jar ./
[foway~uplooking.com]#cd /usr/local/tomcat/webapps/ROOT
[foway~uplooking.com]#echo “<%@ page contentType="text/html;charset=utf-8"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url
="jdbc:mysql://localhost/jbossdb?user=jboss&password=jboss&useUnicode=true&characterEnco
ding=8859_1";
Connection conn= DriverManager.getConnection(url);
Statement
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDA
TABLE);
String sql="select * from dd";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
step:<%=rs.getString(1)%>
context:<%=rs.getString(2)%><br><br>
<%}%>
<%out.print("ok");%>
<%rs.close();
stmt.close();
conn.close();
%>
</body>
</html> “>mtest.jsp

[foway~uplooking.com ]#
为了方便我们使用 tomcat-admin 包来配置 jdbc 参数:
如果 tomcat 中没有集成 admin 管理包,需要你额外安装它。

[foway~uplooking.com ]# unzip /mnt/apache-tomcat-5.5.27-admin.zip -d /tmp


本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com -9-

[foway~uplooking.com ]# cp /tmp/apache-tomcat-5.5.27/server/webapps/admin/
/usr/local/tomcat/server/webapps/ -rf
[foway~uplooking.com ]# cp /tmp/apache-tomcat-5.5.27/conf/Catalina/localhost/admin.xml
/usr/local/tomcat/conf/Catalina/localhost/
[foway~uplooking.com ]#vi /usr/local/tomcat/conf/tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="admin" password="tomcat" roles="admin,manager"/>
</tomcat-users>
[foway~uplooking.com ] /usr/local/tomcat/bin/shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.5.0_07
[foway~uplooking.com ]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.5.0_07
[foway~uplooking.com ]#
通过http://ip:8080/admin 使用admin/tomcat登陆去配置jdbc
或直接修改 conf/server.xml 添加
<Resource
name="Mysql"
type="javax.sql.DataSource"
password="tomcat"
driverClassName="com.mysql.jdbc.Driver"
maxIdle="2"
maxWait="5000"
username="tomcat"
url="jdbc:mysql://localhost/tomcatdb"
maxActive="4"/>
类似内容也可以的
[foway~uplooking.com ]#
重起tomcat 后 访问http://ip:8080/mtest.jsp 能看到dd表中数据即可

其他数据库配置方法是一致的: 部署 jdbc 驱动到 common/lib 下,并在 conf/server.xml 中配


本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 10 -

置对应参数。

JNDI 数据源配置例子:

URL 保护
何保护关键 web 应用
目前有若干种方式:
1、写 javaBean,利用 session + jdbc 专门验证 session 中的 username,passWord,如果不进行
登录,有这些代码的 JSP 页一律会拒绝访问;
2、如果使用的是 weblogic,websphere,jboss,j2ee ri 这样的 J2EE 伺服器,可以通过定义
role\group\user 进行安全部署;
3、配置站点关键应用使用 SSL,进行电子证书进行验证;
4. Ream and AAA tomcat 的特殊保护机制
5..混合型 如 apache 的 url 认证
下面我们给大家介绍 ssl 与 Ream 的实现。
SSL 配置例子:
[foway~uplooking.com]#cd $JAVA_HOME/bin;./keytool -genkey -alias tomcat -keyalg RSA
Enter keystore password: uplooking
What is your first and last name?
[Unknown]: ulp
What is the name of your organizational unit?
[Unknown]: ulp
What is the name of your organization?
[Unknown]: ulp
What is the name of your City or Locality?
[Unknown]: china
What is the name of your State or Province?
[Unknown]: Shenzhen
What is the two-letter country code for this unit?
[Unknown]: cn
Is CN=ulp, OU=ulp, O=ulp, L=china, ST=Shenzhen, C=cn correct?
[no]: y

Enter key password for <tomcat>


(RETURN if same as keystore password):
[foway~uplooking.com]# ls ~/.keystore
/root/.keystore
这样就生成了一个证书
复制证书到 conf 目录下
[foway~uplooking.com ]# cp ~/.keystore /usr/loca/tomcat/conf/chap8.keystore
修改 conf/server.xml 中:
<!-- Define a SSL HTTP/1.1 Connector on port 8443 -->
<!--
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 11 -

<Connector port="8443" maxHttpHeaderSize="8192"


maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
内容为:
<!-- Define a SSL HTTP/1.1 Connector on port 8443 -->
<!-- -->
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
keystoreFile="conf/chap8.keystore"
keystorePass="uplooking"
clientAuth="false" sslProtocol="TLS" />

重起tomcat 后 访问https://ip:8443

Ream 配置:
realm 的实现方式有若干种:基于 http basic authentication 的,基于 form 表单的;基于验证
的数据库。

数据后台也不同,一个是利用 OS 系统验证,一个是利用*.xml 文件,一个是基于数据库

下面,我们来配置 tomcat 对关键应用使用 BASIC 验证:


利用 tomcat 的 UserDatabase: tomcat-users.xml
默认的情况下,serverl.xml 已经有了一个 UserDatabase 和 Realm.
配置%TOMCAT_HOME%\webapps\ROOT\WEB-INF\ 下的 web.xml
[foway~uplooking.com ]# vi /usr/local/tomcat/conf/tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<role rolename="admin"/>
<!-- 定义允许访问的用户角色 -->
<role rolename="ulp"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="admin" password="tomcat" roles="admin,manager"/>
<!-- 定义允许访问的用户 -->
<user username="uplooking" password="tomcat" roles="admin,manager,ulp"/>
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 12 -

</tomcat-users>
[foway~uplooking.com ]#
修改程序目录 WEB-INF/web.xml 加入如下内容
<security-constraint>
<web-resource-collection>
<web-resource-name>admin</web-resource-name>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>ulp</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>http basic authentication</realm-name>
</login-config>
在</web-app>的前面。然后重启动 tomcat 服务即可。
[foway~uplooking.com ]#
注意这里保护的URL为:http://ip:8080/admin/ 下面的任何jsp页面。

如果使用 apahce 与 tomcat 集成的话,URL 保护也可以使用 apache 的访问安全认证来实现的。

虚拟主机
实现虚拟主机可以使用 tomcat 的配置,也可以使用 apache 的虚拟主机配置<前提你用
apache 访问 tomcat>。

Tomcat 虚拟主机:
修改 tomcat 安装目录下的/conf/server.xml 在 server.xml 中的
<Engine> </Engine>中添加
<Host name="192.168.0.253" debug="0"
appBase="/www/web1"
unpackWARs="true" autoDeploy="true">
<Alias>localhost</Alias>
<Alias>www</Alias>
<Alias>192.168.0.253</Alias>
<Context path="" docBase="" debug="1"/>
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="vtomcat_log."
suffix=".txt"
pattern="common" resolveHosts="false"/>
<Logger className="org.apache.catalina.logger.FileLogger"
directory="logs"
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 13 -

prefix="home_log_"
suffix="_app_log.txt"
timestamp="true"/>
</Host>

如果是与 mod_jk 集成的,虚拟主机还可以利用 apache 的虚拟主机配置实现。


<VirtualHost 192.168.0.253>
ServerAdmin root@localhost
DocumentRoot /www/web1
DirectoryIndex index.jsp index.htm index.html
ServerName ulp.uplooking.com
ErrorLog logs/ulp.com-error_log
CustomLog logs/ulp-access_log common
<Location "/*.jsp">
JkUriSet worker ajp13:localhost:8009
</Location>
</VirtualHost>

server.xml配置简介
server.xml的基本配置信息,更具体的配置信息见tomcat的文档
server:
port 指定一个端口,这个端口负责监听关闭tomcat的请求
shutdown 指定向端口发送的命令字符串
service:
name 指定service的名字
Connector (表示客户端和service之间的连接):
port 指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求
minProcessors 服务器启动时创建的处理请求的线程数
maxProcessors 最大可以创建的处理请求的线程数
enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得
到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请
求数,超过这个数的请求将不予处理
connectionTimeout 指定超时的时间数(以毫秒为单位)
Engine (表示指定service中的请求处理机,接收和处理来自Connector的请求):
defaultHost 指定缺省的处理请求的主机名,它至少与其中的一个host元素的
name属性值是一样的
Context (表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范):
docBase 应用程序的路径或者是WAR文件存放的路径
path 表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****
reloadable 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib
和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重起tomcat的情况下改
变应用程序
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 14 -

host (表示一个虚拟主机):
name 指定主机名
appBase 应用程序基本目录,即存放应用程序的目录
unpackWARs 如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文
件中运行应用程序
Logger (表示日志,调试和错误信息):
className 指定logger使用的类名,此类必须实现
org.apache.catalina.Logger 接口
prefix 指定log文件的前缀
suffix 指定log文件的后缀
timestamp 如果为true,
则log文件名中要加入时间,如下例:localhost_log.2001-10-04.txt
Realm (表示存放用户名,密码及role的数据库):
className 指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口
Valve (功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样):
className 指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve 类
可以记录应用程序的访问信息directory 指定log文件存放的位置
pattern 有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字
符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多

[foway~uplooking.com ]#

集成 Apache:
与 apache 的配合使用可以使用 mod_jk,把 tomcat 放在内网,可使用支持 ajp 协议的代理访问
tomcat 服务,如 mod_proxy_ajp.

下面是 apache 代理模块的使用例子:


[foway~uplooking.com]# ls /etc/httpd/modules/mod_proxy_ajp.so
/etc/httpd/modules/mod_proxy_ajp.so
改模块在 EL5 中默认已经有了。不过这个模块在 apache2.1 版本才开始推出来的。
配置文件/etc/httpd/conf.d/proxy_ajp.conf 中有参考配置
如:
[foway~uplooking.com]#vi /etc/httpd/conf.d/proxy_ajp.conf
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#
# When loaded, the mod_proxy_ajp module adds support for
# proxying to an AJP/1.3 backend server (such as Tomcat).
# To proxy to an AJP backend, use the "ajp://" URI scheme;
# Tomcat is configured to listen on port 8009 for AJP requests
# by default.
#
#
# Uncomment the following lines to serve the ROOT webapp
# under the /tomcat/ location, and the jsp-examples webapp
# under the /examples/ location.
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 15 -

#
#ProxyPass /tomcat/ ajp://localhost:8009/
#ProxyPass /examples/ ajp://localhost:8009/jsp-examples/

ProxyPass / balancer://proxy/
<Proxy balancer://proxy>
BalancerMember ajp://192.168.15.128:8009/
</Proxy>

[foway~uplooking.com]# /etc/init.d/httpd restart


[foway~uplooking.com]#/usr/local/tomcat/bin/startup.sh
这样 apache 可以访问 tomcat 了。这种功能的使用就像 squid 代理访问其他网站一样。

在这样的代理访问配置中,apache,tomcat 的启动与停止没有先后要求的

下面是动静分离的一个例子:
[foway~uplooking.com]#whereis apxs
apxs: /usr/sbin/apxs /usr/share/man/man8/apxs.8.gz
如果没有 apxs 指令安装 httpd-devel 包
[foway~uplooking.com]# pm -qf /usr/sbin/apxs
httpd-devel-2.2.3-11.el5_1.3
[foway~uplooking.com]#wget
http://apache.mirror.phpchina.com/tomcat/tomcat-connectors/jk/source/jk-1
.2.26/tomcat-connectors-1.2.26-src.tar.gz
[foway~uplooking.com]#tar xzvf tomcat-connectors-1.2.26-src.tar.gz
[foway~uplooking.com]# cd ./tomcat-connectors-1.2.26-src/native
[foway~uplooking.com]# ./configure \
--with-apxs=/usr/sbin/apxs
[foway~uplooking.com]#make ;make install
[foway~uplooking.com]# ls /etc/httpd/modules/mod_jk*
mod_jk.so
当看到 mod_jk.so 在 apache 模块目录下时,则编译的 mod_jk 已成功.
下面是配置 mod_jk 了.
[foway~uplooking.com]#cd /etc/httpd/conf.d;vi mod_jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers2.properties
JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 16 -

JkRequestLogFormat "%w %V %T"


JkMount /* loadbalancer#apache will serve the static picture.
JkUnMount /*.jpg loadbalancer
JkUnMount /*.gif loadbalancer
JkUnMount /*.swf loadbalancer
JkUnMount /*.bmp loadbalancer
JkUnMount /*.png loadbalancer
保存退出.
[foway~uplooking.com]#cd /etc/httpd/conf;vi workers2.properties
worker.list=loadbalancer
#set properties for loadbalancer (ajp13)
worker. loadbalancer.type=ajp13
worker. loadbalancer.host=localhost
worker. loadbalancer.port=8009
worker. loadbalancer .lbfactor=1
#worker. loadbalancer.cachesize=10
#worker. loadbalancer.cache_timeout=600
worker. loadbalancer.socket_keepalive=1
#worker. loadbalancer.reclycle_timeout=300
保存退出.
[foway~uplooking.com]#
cp /home/tomcat-connectors-1.2.26-src/conf/uriworkermap.properties ./

修改 apache 的“DocumentRoot”与 tomcat 的网站目录/usr/local/tomcat/webapps/ROOT 一致。


这样 jsp 程序与图片都可以放在 ROOT 下了,方便程序设计与系统维护。

分别启动 apache,tomcat 服务,测试图片与 jsp 能访问即可


[foway~uplooking.com]#

性能调整
关于性能在<<Java TM Paltform Performance>>中定义了五个性能标准
运算性能---那一个算法执行性能最好
内存分配---程序运行在 JVM 需要消耗的内存
启动时间---主要考虑运行在客户端的程序
程序扩展---在压力负载下程序可否动态调整
性能预知---什么时候觉得性能会不好
作为 SA 我们最难调整就是程序代码了。
我们只需要关心有影响的程序,可以察觉到的性能问题,而不是每一个类中的每一个方法我
们都需要想方设法的提高性能。如果程序的性能没有达到我们所期望的要求,我们才需要考
虑如何优化性能。同样的,晦涩的代码虽然提高了程序的性能,但同时可能带给我们的是维
护的噩梦。我们需要折中的考虑以上两种情况,使得程序的代码是优美的,并且运行的足够
快,达到客户所期望的性能要求。
优化代码必须要考虑以下问题:
代码已正常工作,优化可能引入新的 bug
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 17 -

优化代码不要造成理解与维护的难度
优化的代码能否迁移到其他平台
优化代码消耗时间多而性能提升少甚至导致晦涩的代码
所以性能的好坏很大程度在代码的测试工作上了。

优化的一般步骤:
1) 明确应用程序的性能指标,怎样才符合期望的性能需求;
2) 在目标平台进行测试;
3) 如果性能已经达到性能指标,Stop;
4) 查找性能瓶颈;
5) 修改性能瓶颈;
6) 返回到第 2 步。

JDK 调整:
选择合适 JDK
不同版本的 JDK,甚至不同厂家的 JDK 可能都存在着很大的差异,对于性能优化的程
度不同。一般来说,尽可能选择最新发布的稳定的 JDK 版本。最新的稳定的 JDK 版本相对
以前的 JDK 版本都会做一些 bug 的修改和性能的优化工作
-优化 java 堆
垃圾收集就是自动释放不再被程序所使用的对象的过程。当一个对象不再被程序所引用时,
它所引用的堆空间可以被回收,以便被后续的新对象所使用。垃圾收集器必须能够断定哪些
对象是不再被引用的,并且能够把它们所占据的堆空间释放出来。如果对象不再被使用,但
还有被程序所引用,这时是不能被垃圾收集器所回收的,此时就是所谓的“内存泄漏”。监
控应用程序是否发生了内存泄漏,有一个非常优秀的监控工具推荐给大家——Quest 公司的
JProbe 工具,使用它来观察程序运行期的内存变化,并可产生内存快照,从而分析并定位内
存泄漏的确切位置,可以精确定位到源码内。这个工具的使用我在后续的章节中还会做具体
介绍。
Java 堆是指在程序运行时分配给对象生存的空间。通过-mx/-Xmx 和-ms/-Xms 来设置起
始堆的大小和最大堆的大小。根据自己 JDK 的版本和厂家决定使用-mx 和-ms 或-Xmx 和
-Xms。Java 堆大小决定了垃圾回收的频度和速度,Java 堆越大,垃圾回收的频度越低,速
度越慢。同理,Java 堆越小,垃圾回收的频度越高,速度越快。要想设置比较理想的参数,
还是需要了解一些基础知识的。 Java 堆的最大值不能太大,这样会造成系统内存被频繁的
交换和分页。所以最大内存必须低于物理内存减去其他应用程序和进程需要的内存。而且堆
设置的太大,造成垃圾回收的时间过长,这样将得不偿失,极大的影响程序的性能。以下是
一些经常使用的参数设置:
1) 设置-Xms 等于-XmX 的值;
2) 估计内存中存活对象所占的空间的大小,设置-Xms 等于此值,-Xmx 四倍于此值;
3) 设置-Xms 等于-Xmx 的 1/2 大小;
4) 设置-Xms 介于-Xmx 的 1/10 到 1/4 之间;
5) 使用默认的设置。
根据自己的运行程序的具体使用场景,来确定最适合自己的参数设置。 除了-Xms 和
-Xmx 两个最重要的参数外,还有很多可能会用到的参数,这些参数通常强烈的依赖于垃圾
收集的算法,所以可能因为 JDK 的版本和厂家而有所不同。但这些参数一般在 Web 开发中
用的比较少,我就不做详细介绍了。在实际的应用中注意设置-Xms 和-Xmx 使其尽可能的
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 18 -

优化应用程序就行了。对于性能要求很高的程序,就需要自己再多研究研究 Java 虚拟机和


垃圾收集算法的机制了。
Tomcat 中 jvm 参数修改:修改 catalina.sh 在文件开头中加入如下内容:
set CATALINA_OPTS=-Xms512m -Xmx1024m
set JAVA_OPTS=-Xms512m -Xmx1024m
其中-Xms 表示 jvm 最小内存数,-Xmx 表示最大内存数
参数含义:
-Xms 最小内存。也是启动时分配内存。
-Xmx 最大内存使用限制。2G 内存下经验值 75-82%不要超过物理内存的 85%,但在有+XX:
AggressiveHeap 参数时无效
-Xss 每个增加的线程占用多少内存,经验值 128k。
这些值配置不好,JBOSS 服务器很快就会因内存而罢工。如这样配置:
JAVA_OPTS="-Xms256m –Xmx1600m +XX:AggressiveHeap
尽管配置了-Xmx 可以控制最大内存使用量,但还是会因进程的增长而消耗完内存的。因为
参数 AggressiveHeap 存在忽略-Xmx
JAVA_OPTS="-Xms800m –Xmx1600m –Xss 15120k
这个参数配置看起来是没错误,但是却在每增加一个线程就会消耗 15m 内存。这也太夸张
了。在有限的资源却不能资源利用率最大化。
连接器优化:
在 server.xml 中与连接数相关的参数:
maxThreads:Tomcat 使用线程来处理接收的每个请求。这个值表示 Tomcat 可创建的最大的
线程数
acceptCount: 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中
的请求数,超过这个数的请求将不予处理
minSpareThreads:Tomcat 初始化时创建的线程数
maxSpareThreads:一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程
enableLookups:是否反查域名,默认值为 true。为了提高处理能力,应设置为 false
connnectionTimeout:网络连接超时,默认值 60000,单位:毫秒。设置为 0 表示永不超时,
这样设置有隐患
maxKeepAliveRequests:保持请求数量
bufferSize:输入流缓冲大小
compression:压缩传输,取值 on/off/force,默认值 off
其中和最大连接数相关的参数为 maxThreads 和 acceptCount。如果要加大并发连接数,应
同时加大这两个参数。允许的最大连接数还受制于操作系统的内核参数设置

操作系统参数优化按照 ULA-优化中 proc 参数来调整。

程序优化需要借助测试工具来分析是否有 bug,是否有内存溢出的代码了。

性能与压力测试需要专业测试软件完成了。

[foway~uplooking.com]#
集群部分
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 19 -

Tomcat 集群支持比较晚,tomcat5 以前要集群需要 replication-tomcat.jar 包支持。 从 tomcat5


开始自己有了集群的功能了,这里说的集群是 j2ee 服务器间的 jp 协议的集群。
为了让成员之间相互协作和复制状态,它们之间需要互相通信。
通信可以使用 point-to-point RMI(TCP-IP)或者 IP 多播两种方式。
大部分的 J2EE 应用服务器(如 JBoss、Oracle、WebLogic 和 Borland) 都是使用 IP 多播让
集群成员进行通信,在集群内发送 state/update/heartbeat 数据给其他成员。
Tomcat 集群成员的通信是如下进行的:所有的集群成员用多播 ping 消息来对话。每一个
Tomcat 实例将发送一个消息,广播其 IP 地址和 TCP 监听端口(为 session replication)。
如果在给定的时间帧内,某个实例没有接收到这些信息,那么该实例就会被认为是当机。

说到 web 应用程序的集群,我们都需要做至少 2 个方面的配置。 负载调度集群,被负载成


员之间的 session 管理

负载方式:
 前端,采用硬件负载均衡器;后端,部署多台 J2EE 服务器。
 前端,部署 tomcat LoadBalancer;后端,部署多台 J2EE 服务器。
 前端,采用第三方软件负载均衡器;后端,部署多台 J2EE 服务器。

Session 管理:
* 内存对内存的复制;使用 Tomcat 5 自带的 SimpleTcpCluster (在 org.apache.catalina.cluster.tcp
包中,文件为 server/lib/catalina-cluster.jar)。
* 文件系统 session 持久化, session 信息从一个中央文件系统读写;
(org.apache.catalina.session.FileStore, part of catalina-optional.jar)。文件系统采用集群的文件
系统如 nfs,gfs,ocfs 等。
* 数据库 session 持久化, session 数据存储在一个 JDBC 数据存储器。
(org.apache.catalina.session.JDBCStore) ;可以使用常见的 rdbms 数据库如 mysql,oracle.
<上面的是 tomcat 支持的 3 种方式,一般 j2ee 服务器都支持这 3 种方式,不过实现原理不尽
相同>
* 采用 jboss 的 cache 模块实现 session 的管理<新的 cache 模块可以使用 memcached 了>
* 采用 dangge 公司开发的 memcached 内存集中管理 session
* 采用 terracotta 实现 session 集群管理
* 采用 oracle 公司的 java 版 coherence 实现 jvm 级别的集群实现 session 同步
* 采用 jboss 开发的 mod_cluster 与 mod_jk 或 mod_proxy_ajp 配合 session 同步
* 采用 dbcached 分布内存数据库实现

至于其他软件我就没涉猎过了,如果你有好的软件,please mail to me.


这么多方案如果是一个高并发的大型项目中怎么选择是一很难决策的。没有最好的解决办
法,只能根据客户需求,程序调试等因素综合分析找到一个接近最好的解决方案。

在内存 session 持久化中,当 HTTP session 中的独立的对象改变,这个对象将会被序列化


到其他的备用机器上,而在数据库 session 持续化中,当 session 中的任何对象改变时,session
中的所有对象将被一起序列化。
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 20 -

数据库/文件系统 session 持续化的缺点是限制了当在 HttpSession 存储大型或大量对象时的


可伸缩性。每一次用户增加一个对象到 HttpSession 中,session 中所有的对象都会被序列化
并被写到数据库或者共享文件系统中。

当前 Tomcat 版本的 session 复制是一种 all-to-all 的复制,即在任何时,session 中的属性


被传播到集群的所有成员。当集群小的情况下,这个算法是高效的,为应付大型集群的情况,
Tomcat 6 以后版本将提供主-从复制,session 将仅仅被保存在一个或者两个备份服务器上。

下面是 Tomcat 集群的粘性会话管理<采用 mod_proxy_ajp>的例子


apache 作为前端的负载服务器,后端两个 Tomcat 作集群,此次选择的配置方式为 Session
Sticky(粘性 Session),这种方式将同一用户的请求转发到特定的 Tomcat 服务器上,避免了
集群中 Session 的复制,缺点是用户只跟一种的一台服务器通信,如果此服务器 down 掉,
如果有登陆的需要验证 session 的程序时,用户需要重新登陆。 。

我的环境:192.168.0.254 apache 采用 mod_proxy_ajp.so mod_balancer.so


192.168.0.253/252 tomcat5
配置步骤:
254 上:
[foway~uplooking.com]# grep ajp.so /etc/httpd/conf.d/proxy_ajp.conf
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
[foway~uplooking.com]# grep balance /etc/httpd/conf/httpd.conf
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
保证有这 2 个模块就可以了。
[foway~uplooking.com]# vi /etc/httpd/conf.d/proxy_ajp.conf

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so


#
# When loaded, the mod_proxy_ajp module adds support for
# proxying to an AJP/1.3 backend server (such as Tomcat).
# To proxy to an AJP backend, use the "ajp://" URI scheme;
# Tomcat is configured to listen on port 8009 for AJP requests
# by default.
#

#
# Uncomment the following lines to serve the ROOT webapp
# under the /tomcat/ location, and the jsp-examples webapp
# under the /examples/ location.
#
#ProxyPass /tomcat/ ajp://localhost:8009/
#ProxyPass /examples/ ajp://localhost:8009/jsp-examples/
#add context for ajp
ProxyPass / balancer://proxy/ lbmethod=byrequests stickysession=JSESSIONID
ProxyPassReverse / balancer://proxy/
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 21 -

<Proxy balancer://proxy>
BalancerMember ajp://192.168.0.253:8009 route=253
BalancerMember ajp://192.168.0.252:8009 route=252
</Proxy>
[foway~uplooking.com]#/etc/init.d/httpd restart
253 上:
[foway~uplooking.com]# vi /usr/local/tomcat/conf/server.xml
找如下内容并按照红色的地方修改:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009"
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

<!-- Define a Proxied HTTP/1.1 Connector on port 8082 -->


<!-- See proxy documentation for more information about using this. -->
<!--
<Connector port="8082"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" acceptCount="100" connectionTimeout="20000"
proxyPort="80" disableUploadTimeout="true" />
-->
<!-- An Engine represents the entry point (within Catalina) that processes
every request. The Engine implementation for Tomcat stand alone
analyzes the HTTP headers included with the request, and passes them
on to the appropriate Host (virtual host). -->

<!-- You should set jvmRoute to support load-balancing via AJP ie :


<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->

<!-- Define the top level container in our container hierarchy -->
<!-- <Engine name="Catalina" defaultHost="localhost" > -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute=”253”>
其他内容不改变。
[foway~uplooking.com]#/usr/local/tomcat/bin/startup.sh

252 上:操作与 253 上一样,只是 jvmRoute 消息路由不同而已


[foway~uplooking.com]# vi /usr/local/tomcat/conf/server.xml
找如下内容并按照红色的地方修改:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009"
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

<!-- Define a Proxied HTTP/1.1 Connector on port 8082 -->


本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 22 -

<!-- See proxy documentation for more information about using this. -->
<!--
<Connector port="8082"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" acceptCount="100" connectionTimeout="20000"
proxyPort="80" disableUploadTimeout="true" />
-->
<!-- An Engine represents the entry point (within Catalina) that processes
every request. The Engine implementation for Tomcat stand alone
analyzes the HTTP headers included with the request, and passes them
on to the appropriate Host (virtual host). -->

<!-- You should set jvmRoute to support load-balancing via AJP ie :


<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->

<!-- Define the top level container in our container hierarchy -->
<!-- <Engine name="Catalina" defaultHost="localhost" > -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute=”252”>
其 他内容不改变。
[foway~uplooking.com]#/usr/local/tomcat/bin/startup.sh

这样部署好后就实现了基本的负载了与粘性会话管理了。这个时候一个用户登陆需要会话验
证的话,通过 mod_balancer 所调度的成员不能宕机,否则用户将弹出登陆页面要求登陆。

如果要解决这个弹出登陆的问题,可以使用 session 复制或中央存放办法。如 tomcat 配置


A. session 复制传播,或 session 放在共享文件,或数据库中,或 java_memcached。
如果你需要这么做,可以如下操作。
Session replication 法 : 配 置 conf/server.xml 支 持 集 群 会 话 复 制 , 配 置 j2ee 程序 中 的
WEB-INF/web.xml 支持会话即可。
简单来说:
把 server.xml 中有关
<Cluster>
</Cluster>
注释取消。
在你的 tomcat 程序目录<默认 webapps/ROOT>/WEB-INF/web.xml 中的</web-app>前面加入
<distributable/>
</web-app>

然后重新启动 tomcat 服务即可

如果你没有指定默认网关,你可能需要指定在 server.xml 中
多播使用的网络:如:servel.xml 中
<Membership
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 23 -

className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
则:
#route add -net 228.0.0.0 netmask 255.0.0.0 dev eth0
如果在一个内网中有多个集群,你需要指定节点复制协议方式:如
252 上修改 server.xml 中
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>

<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
为:
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastBindAddress="192.168.0.252"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>

<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
<!-- tcpListenAddress="auto" -->
tcpListenAddress="192.168.0.252"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>

253 上:修改为:
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastBindAddress="192.168.0.253"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 24 -

<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
<!-- tcpListenAddress="auto" -->
tcpListenAddress="192.168.0.253"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>

B. 集群文件存放法:在 254,253,252 上配置 gfs,254 上配置 gnbd 服务端并分配一个存放


session 使用的分区。 在 252,253 上配置 gfs,并使用 254 共享的分区。
或在 254 上配置 nfs,指定一个可写目录共享给 252/253 访问。在 253/252 分别挂载。然后指
定到 tomcat 写 session 的路径,在 conf/server.xml 配置 tomcat 使用 FileStore 存放 session 即
可.
具体的集群分件系统配置这里就不罗嗦了。假如 253/252 都挂载好了一个 cluster filesystem
dir.--/gfs/gfs1.
然后在 253/252 上修改 conf/server.xml 在<Host> </Host>之间加入下面内容:
<!-- 配置 file 存放 session -->
<Context path="." docBase="." debug="0"
reloadable="true">
<Manager
className="org.apache.catalina.session.PersistentManager" >
debug=0;
saveOnRestart="true"
maxActiveSessions="-1"
minIdleSwap="-1"
maxIdleSwap="-1"
maxIdleBackup="-1"
<Store className="org.apache.catalina.session.FileStore"
directory="fsession" />
</Manager>
</Context>
[foway~uplooking.com]#
FileStore 将 HttpSession 对象保存在一个文件中。这个文件的默认目录为
<CATALINA_HOME>/work/Catalina/hostname/applicationname. 每个 HttpSession 对象都会
对应一个文件,它以 Session 的 ID 作为文件名,扩展名为: .session. 所以我们需要对
/work/Catalina/hostname 处理。
[foway~uplooking.com]# cd /usr/local/tomcat/work/Catalina
[foway~uplooking.com]#mv hostname hostname-bak
[foway~uplooking.com]#ln –s /gfs/gfs1 hostname
[foway~uplooking.com]#
分别在 253/252 上重启动 tomcat 服务即可
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 25 -

C. Jdbc 数据库法:在 254 上安装数据库如 mysql,然后如下建立表:


[foway~uplooking.com]# mysql
>create database tomcatdb;
>use tomcatdb
>create table tsession(
session_id varchar(100) not null primary key,
valid_session chart(1)not null,
max_inactive int not null,
last_access bigint not null,
app_name varchar (255),
session_data mediumblob,
KEY kapp_name(app_name)
);
>grant all on tomcatdb.* to tomcat@’%’ identified by ‘tomcat’;
>flush privileges;
>exit;
[foway~uplooking.com]#
然后在 253/252 上修改 conf/server.xml 在<Host> </Host>之间加入下面内容:
<!-- 配置 JDBC 存放 session -->
<Context path="." docBase="." debug="0"
reloadable="true">
<Manager className="org.apache.catalina.session.PersistentManager" >
debug=99;
saveOnRestart="true"
maxActiveSessions="-1"
minIdleSwap="-1"
maxIdleSwap="-1"
maxIdleBackup="-1"
<Store className="org.apache.catalina.session.JDBCStore"
driverName="com.mysql.jdbc.Driver"
<!-- tomcatdb 是在 254 上建立的 mysql 库 -->
connectionURL="jdbc:mysql://192.168.0.254/tomcatdb?autoReconnect=true"
<!-- tomcat 是访问 254 上 tomcatdb 的 mysql 用户 -->
connectionName="tomcat"
<!-- tomcat 是访问 254 上 tomcatdb 的 mysql 密码 -->
connectionPassword="tomcat"
sessionTable="tsessions"
sessionIdCol="session_id"
sessionDataCol="session_data"
sessionValidCol="valid_session"
sessionMaxInactiveCol="max_inactive"
sessionLastAccessedCol="last_access"
sessionAppCol="app_name"
本视频课程是我的个人知识总结,欢迎交流批评与指正->foway@uplooking.com - 26 -

checkInterval="60"
debug="99"
/>
</Manager>
</Context>
[foway~uplooking.com]#
分别在 253/252 上重启动 tomcat 服务即可
[foway~uplooking.com]#

如果要实现 tomcat 动静分离集群参看 jboss 的视频。


。。
。。按照要求配置 mod_jk
。。按照上面的配置 session 管理<A/B/C 可以任意选一种配置即可>。
。。

You might also like