tomcat6学习笔记( 包括和apache2的集成,集群,SSI,SSL,安全域,嵌入应用程序,访问控制平台和管理平台)


一.访问tomcat的控制平台和管理平台
首先下载tomcat6 :进入 http://www.apache.org/ 点击 tomcat项目进入 http://tomcat.apache.org/  点击download下的tomcat6.x进入 http://tomcat.apache.org/download-60.cgi 选择 Binary Distributions 下的core下的 zip,下载后为 apache-tomcat-6.0.18.zip 文件,解压后为 apache-tomcat-6.0.18,可以直接启动,不需要安装,访问  http://localhost:8080  可以测试是否成功
1.访问控制平台: tomcat自带了manager项目来管理平台,但是在tomcat-users.xml中没有定义角色和用户,所以只需要修改该文件就可以了
修改前:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
</tomcat-users>
修改后:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="manager"/>
  <user username="tomcat" password="tomcat" roles="manager"/>
</tomcat-users>
启动tomcat后访问 http://localhost:8080  成功,访问 http://localhost:8080/manager/html   成功

2.访问控制平台:实际就是tomcat的server.xml配置文件配置的可视化操作,tomcat6已经不带该项目了,需要先到apache官网下 载,下载过程和下载tomcat6类似,先找到tomcat,然后找到5.5版本,最后选择 Administration Web Application 下的zip,下载文件是 apache-tomcat-5.5.27-admin.zip ,解压后为 apache-tomcat-5.5.27 , 将apache-tomcat-5.5.27\server\webapps下的admin文件夹复制粘贴到tomcat的webapps目录下,将 apache-tomcat-5.5.27\conf下的Catalina目录复制粘贴到tomcat的conf目录下,最后是修改tomcat- user.xml文件来添加用户和角色,原因和过程同上,修改后文件内容如下
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="manager"/>
  <role rolename="admin"/>
  <user username="tomcat" password="tomcat" roles="manager,admin"/>
</tomcat-users>
修改文件apache-tomcat-6.0.18\webapps\admin下的admin.xml,将
<Context docBase="${catalina.home}/server/ webapps/admin" privileged="true"
         antiResourceLocking="false" antiJARLocking="false">
改成
<Context docBase="${catalina.home}/webapps/admin" privileged="true"
         antiResourceLocking="false" antiJARLocking="false">
相同方式修改apache-tomcat-6.0.18\conf\Catalina\localhost下的admin.xml文件

项目运行需要两个jar文件:commons-logging.jar 和 commons-modeler.jar ,需要到apache网站下载
下载commons-logging 的过程是:登录 http://www.apache.org/ ,找到commons项目后点击进入 http://commons.apache.org/   页面,找到Components下的logging点击后进入 http://commons.apache.org/logging/ ,点击 Commons logging 下的download进入 http://commons.apache.org/downloads/download_logging.cgi 下载页面。然后下载 Binary下的1.1.1.zip,下载后解压,将其中的 commons-logging-1.1.1.jar 复制粘贴到tomcat下的lib目录下
下载 commons-modeler-2.0.1.jar 的过程大致相同,访问 http://commons.apache.org/downloads/download_modeler.cgi
启动tomcat后访问 http://localhost:8080  成功,访问 http://localhost:8080/admin   成功

二.将tomcat集成到apache2服务器上

首先安装apache2 :登录 http://www.apache.org/  点击 HTTP Server 项目 ,进入 http://httpd.apache.org/ ,选择download下的froma mirror后进入 http://httpd.apache.org/download.cgi 页面,选择 Apache HTTP Server 2.2.11 is the best available version 下的 Win32 Binary without crypto (no mod_ssl) (MSI Installer): apache_2.2.11-win32-x86-no_ssl.msi ,文件名称是apache_2.2.11-win32-x86-no_ssl.msi,下载后为apache_2.2.11-win32-x86-no_ssl.msi。双击安装,一切默认安装就行了
安装后访问 http://localhost ,如果出现提示页面告诉你apache已经开始工作就说明成功了
首先下载mod_jk.so:进入 http://www.apache.org/ 点击 tomcat项目进入 http://tomcat.apache.org/  点击download下的Tomcat Connectors 进入 http://tomcat.apache.org/download-connectors.cgi  选择Tomcat Connectors JK 1.2下的Binary Releases 进入 http://labs.xiaonei.com/apache-mirror/tomcat/tomcat-connectors/jk/binaries/ 页面,点击win32进入 http://labs.xiaonei.com/apache-mirror/tomcat/tomcat-connectors/jk/binaries/win32/ 页面,点击版本jk-1.2.28/  进入http://labs.xiaonei.com/apache-mirror/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.28/ 页面,点击mod_jk-1.2.28-httpd-2.0.52.so   ,下载文件为mod_jk-1.2.28-httpd-2.0.52.so 下载后为 mod_jk-1.2.28-httpd-2.0.52.so文件,可以改名为mod-jk.so。
1.拷贝mod_jk.so插件到apache2的modules目录

2.在apache2的conf目录下新建worker.properties文件,内容如下
worker.list=worker1
worker.worker1.port=8009  #工作端口,若没占用则不用修改
worker.worker1.host=localhost  #Tomcat服务器的地址
worker.worker1.type=ajp13  #类型
worker.worker1.lbfactor=1  #负载平衡因数

3.在apache2的conf目录下修改httpd.conf文件,在后面追加内容如下
# Using mod_jk.so to redirect dynamic calls to Tomcat
LoadModule  jk_module  modules/mod_jk.so
JkWorkersFile  conf/workers.properties
JkLogFile  logs/mod_jk.log
JkLogLevel  debug
JkMount  /*.jsp  worker1
JkMount  /manager/*  worker1

4.测试时输入http://localhost/manager/html成功运行

三.使用一个apache2和两个tomcat6配置tomcat集群
1.拷贝mod_jk.so插件到apache2的modules目录

2.在apache2的conf目录下新建worker.properties文件,内容如下
worker.list=worker1,worker2,loadbalancer

worker.worker1.port=8009  #工作端口,若没占用则不用修改
worker.worker1.host=localhost  #Tomcat服务器的地址
worker.worker1.type=ajp13  #类型
worker.worker1.lbfactor=100  #负载平衡因数

worker.worker2.port=8109  #工作端口,若没占用则不用修改
worker.worker2.host=localhost  #Tomcat服务器的地址
worker.worker2.type=ajp13  #类型
worker.worker2.lbfactor=100  #负载平衡因数

worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=worker1, worker2
worker.loadbalancer.sticky_session=false
worker.loadbalancer.sticky_session_force=false

3.在apache2的conf目录下修改httpd.conf文件,在后面追加内容如下
# Using mod_jk.so to redirect dynamic calls to Tomcat
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /*.jsp loadbalancer
JkMount /manager/* loadbalancer

4.复制两个免安装的tomcat,把其中一个的server.xml文件修改成
Server port="8105"
Connector port="8180"
<Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />
两个文件的engine元素都要添加jmvRoute属性,分别是worker1和worker2
比如 <Engine name="Catalina" defaultHost="localhost" jmvRoute="worker2">
5.新建文件test.jsp,内容如下
<html>
<head>
  <title>helloapp</title>
</head>
<body>
<%
System.out.println("call test.jsp");
%>  
SessionID: <%=session.getId() %> 
</body>
</html>
在两个tomcat的webapps目录下的manager项目文件夹下分别复制粘贴一个文件test.jsp
6.测试时输入http://localhost/manager/test.jsp成功运行,问题在于session不唯一
====================================
下面解决session的唯一问题
7.在每个tomcat的server.xml文件中的engine元素下都添加如下内容
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

  <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>
  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Membership className="org.apache.catalina.tribes.membership.McastService"
                        bind="127.0.0.1" 
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>
    <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
        <Transport  className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
    </Sender>
   
    <Interceptor  className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
    <Interceptor  className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
  </Channel>

  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

  <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

  <ClusterListener  className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
  <ClusterListener  className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>   

8.在每个tomcat的webapps下的web应用的web.xml文件中添加如下内容
<distributeable/>
9.重新测试session唯一

 四.配置tomcat的Server Side include (SSI)
1.因为tomcat6的lib文件夹中没有servlet-ssi.jar,所以从tomcat5.5的lib文件夹中复制servlet-ssi.renametojar粘贴到tomcat6的lib中并改名为servlet-ssi.jar
2.将tomcat6的web.xml文件中的两处注释掉的内容取消注释,打开tomcat服务器的ssi功能
第一处
    <servlet>
        <servlet-name>ssi</servlet-name>
        <servlet-class>
          org.apache.catalina.ssi.SSIServlet
        </servlet-class>
        <init-param>
          <param-name>buffered</param-name>
          <param-value>1</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>0</param-value>
        </init-param>
        <init-param>
          <param-name>expires</param-name>
          <param-value>666</param-value>
        </init-param>
        <init-param>
          <param-name>isVirtualWebappRelative</param-name>
          <param-value>0</param-value>
        </init-param>
        <load-on-startup>4</load-on-startup>
    </servlet>
第二处
    <servlet-mapping>
        <servlet-name>ssi</servlet-name>
        <url-pattern>*.shtml</url-pattern>
    </servlet-mapping>

3.新建文件sample.shtml,并将文件复制粘贴到tomcat的webapps目录的manager项目文件夹下,
sample.shtml文件内容如下
<html>
<head><title>my first SSI page</title></head>
<body>
欢迎您于(<!--#echo var="DATE_LOCAL" -->)访问本网站。
</body>
</html>
4.修改manager项目的META-INF文件夹下的context.xml文件

<Context relodable="true" />
改成
<Context relodable="true"  privileged="true" />
5.访问
http://localhost:8080/manager/sample.shtml

五.配置tomcat的Server Socket Layer(SSL)
1.使用sun公司的tookey工具制作个人证书,在jdk的bin文件夹中有

证书制作
cmd进入ms-dos窗口
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\100554>cd\

C:\>cd C:\Program Files\Java\jdk1.6.0_07\bin

C:\Program Files\Java\jdk1.6.0_07\bin>keytool -genkey -alias tomcat -keyalg RSA
-keypass changeit -storepass changeit -keystore d:\server.keystore -validity 3000
您的名字与姓氏是什么?
  [Unknown]:  ellen
您的组织单位名称是什么?
  [Unknown]:  xinxihua
您的组织名称是什么?
  [Unknown]:  jianlong
您所在的城市或区域名称是什么?
  [Unknown]:  fengtai
您所在的州或省份名称是什么?
  [Unknown]:  beijing
该单位的两字母国家代码是什么
  [Unknown]:  cn
CN=ellen, OU=xinxihua, O=jianlong, L=fengtai, ST=beijing, C=cn 正确吗?
  [否]:  y

C:\Program Files\Java\jdk1.6.0_07\bin>

2.配置tomcat的server.xml文件
 <Connector className="org.apache.coyote.tomcat6.CoyoteConnector"
                         port="8443" minProcessors="5"
                         maxProcessors="75" enableLookups="true"
                         acceptCount="100"
                         protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
               keystoreFile="D:/server.keystore"
               keystorePass="changeit" />

3启动ie浏览器(不同的浏览器有区别),访问 https://localhost:8433 (注意是https,不是http;是8433,不是8080)

 六.将tomcat嵌入到应用程序中

原书的demo运行繁琐,这里改变的主要是编译环境,并部署了一个web项目做进一步的实验
1.下载一个免安装的tomcat服务器,改名tomcat并放在f盘根目录
2.启动MyEclipse,已经集成了tomcat ,新建一个名为hellodemo的javaWeb应用,运行无误后导出为名为hellodemo的war包。
并将hellodemo.war复制粘贴到f:\tomcat\webapps目录下
3.将MyEclipse的tomcat禁用掉 ,新建一个java项目,注意不是web项目 ,名称是tomcatdemo,在src下的pkg包中新建一个java类,代码如下
package pkg;
import java.net.InetAddress;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Embedded;

public class EmbeddedTomcat {

  private String path = null;
  private Embedded embedded = null;
  private Host host = null;

  public EmbeddedTomcat() { }

  /** 设置Tomcat的根路径 */
  public void setPath(String path) {
    this.path = path;
  }

  /** 返回Tomcat的根路径 */
  public String getPath() {
    return path;
  }

  /** 启动Tomcat服务器 */
  public void startTomcat() throws Exception {

    Engine engine = null;

    //设置catalina.home系统属性
    System.setProperty("catalina.home", getPath());

    //创建嵌入式Tomcat服务器
    embedded = new Embedded();

    //创建Engine实例
    engine = embedded.createEngine();
    engine.setDefaultHost("localhost");

    //创建默认的Host实例
    host = embedded.createHost("localhost", getPath() + "/webapps");
    engine.addChild(host);

    //创建ROOT context
    Context context = embedded.createContext("",  getPath() + "webapps/ROOT");
    host.addChild(context);

    //创建examples context
    Context examplesContext = embedded.createContext("/examples",
     getPath() + "webapps/examples");
    host.addChild(examplesContext);
    /****************************************************/
    //创建hellodemo context 
    Context hellodemo= embedded.createContext("/hellodemo",
     getPath() + "webapps/hellodemo");
    host.addChild(hellodemo);
    /****************************************************/

    //把Engine实例加入到嵌入式Tomcat服务器
    embedded.addEngine(engine);

    //创建和安装默认的HTTP connector
    InetAddress addr=null;
    Connector connector = embedded.createConnector(addr, 8080, false);
    embedded.addConnector(connector);

    //启动嵌入式Tomcat服务器
    embedded.start();
  }

  /** 终止嵌入式Tomcat服务器  */
  public void stopTomcat() throws Exception {
    embedded.stop();
  }

  public static void main(String args[]) {
    try {
      EmbeddedTomcat tomcat = new EmbeddedTomcat();
      String rootpath="f:/tomcat/";
      tomcat.setPath(rootpath);
      tomcat.startTomcat();
      Thread.sleep(1000*60*5); //睡眠5分钟
      tomcat.stopTomcat();
      System.exit(0);
    }
    catch( Exception e ) {
      e.printStackTrace();
    }
  }
}

4.将f:\tomcat的lib目录和bin目录下的jar包都导入到项目中
5.运行有main方法的EmbeddedTomcat类。
6.测试访问,成功
http://localhost:8080
http://localhost:8080/hellodemo/index.jsp

七.tomcat阀
1.客户访问日志阀
只修改manager应用的context.xml文件,添加内容如下
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="ellen_log." suffix=".txt" pattern="%h %l %u %t %r %s %b" resolveHosts="true" />
保存后启动tomcat后访问 http://localhost:8080/manager/html
tomcat的logs文件夹新建文件ellen_log.txt,文件内容如下
127.0.0.1 - tomcat [06/May/2009:16:37:10 +0800] GET /manager/html HTTP/1.1 200 13030

2.远程地址过滤器
只修改tomcat的server.xml文件,在host元素内添加如下内容
<!--Remote Address Filter-->
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="127.* , 222.*"/>
保存后启动tomcat访问 http://localhost:8080  http://127.0.0.1:8080 显示网站拒绝
修改如下
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.* , 222.*"/>
保存后启动tomcat访问 http://localhost:8080 http://127.0.0.1:8080 页正常显示
如果想实现本机的tomct服务器只允许本机的浏览器访问就可以如此设置
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.0.0.1*, localhost*"/>

3.远程主机过滤器
只修改tomcat的server.xml文件,在host元素内添加如下内容
<!--Remote Host Filter-->
<Valve className="org.apache.catalina.valves.RemoteHostValve"
deny="monster*"  />
保存后启动tomcat访问 http://localhost:8080  http://127.0.0.1:8080 显示网站拒绝

4.客户请求记录器
只修改tomcat的server.xml文件,在host元素内添加如下内容
<!--Request Dumper-->
<Valve className="org.apache.catalina.valves.RequestDumperValve" />
保存后启动tomcat访问 http://localhost:8080 每次访问一次就到logs下查看文件 localhost.2009-05-06.log(日期为当日日期),
仅仅启动tomcat后产生的文件内容如下
2009-5-6 17:18:02 org.apache.catalina.core.ApplicationContext log
信息: ContextListener: contextInitialized()
2009-5-6 17:18:02 org.apache.catalina.core.ApplicationContext log
信息: SessionListener: contextInitialized()
第一次访问后追加了如下内容(略)


八.tomcat安全域
分类:内存域MemoryRealm;JDBC域JDBCRealm;数据源域DataSourceRealm;JNDI域JNDIRealm;JAAS域JAASRealm
三种登录方式
 <!--  BASIC authentication -->
 <login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>ellen realm</realm-name>
 </login-config>

 <!-- DIGEST authentication -->
 <login-config>
  <auth-method>DIGEST</auth-method>
  <realm-name>ellen realm</realm-name>
 </login-config>
 
 <!-- FORM authentication -->
 <login-config>
  <auth-method>FORM</auth-method>
  <realm-name>ellen realm</realm-name>
  <form-login-config>
   <form-login-page>/usercheck.jsp</form-login-page>
   <form-error-page>/error.jsp</form-error-page>
  </form-login-config>
 </login-config>
使用表单方式必须新建两个文件 usercheck.jsp(有严格的要求) 和 error.jsp(没有严格要求)
usercheck.jsp
<html>
<head>
<title>Login Page for helloapp</title>
<body bgcolor="white">
<form method="POST" action=j_security_check>
  <table border="0" cellspacing="5">
    <tr>
      <th align="right">Username:</th>
      <td align="left"><input type="text" name="j_username"></td>
    </tr>
    <tr>
      <th align="right">Password:</th>
      <td align="left"><input type="password" name="j_password"></td>
    </tr>
    <tr>
      <td align="right"><input type="submit" value="LogIn"></td>
      <td align="left"><input type="reset" value="reset"></td>
    </tr>
  </table>
</form>
</body>
</html>
内存域
1.在web应用的WEB-INF目录下的web.xml文件中配置安全约束
web.xml文件内容

 <!--指定受保护的资源及访问的方式和可以访问的角色-->
 <security-constraint>
  <display-name>
   ellen Configuration Security Constraint
  </display-name>
  <web-resource-collection>
   <web-resource-name>Protected Area</web-resource-name>
   <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
   <role-name>guest</role-name>
  </auth-constraint>
 </security-constraint>

 <!--登录对话框的类型-->
 <login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>ellen realm</realm-name>
 </login-config>
 
 <!--这里的角色和步骤2的角色相同-->
 <security-role>
  <description>
   The role that is required to login to the ellen Application
  </description>
  <role-name>guest</role-name>
 </security-role>

2.在web应用的METE-INF目录下的context.xml文件中配置Realm
context.xml文件内容
<Context reloadable="true">
 <Realm className="org.apache.catalina.realm.MemoryRealm" />
</Context>
3.在tomcat的conf目录下的tomcat-users.xml文件中定义角色和用户
MemoryRealm类从一个xml文件中读取用户信息,默认是tomcat的conf目录下的tomcat-users.xml文件
tomcat-users.xml文件内容
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="guest"/>
  <user username="ellen" password="123" roles="guest"/>
</tomcat-users>

JDBC域
1.和内存域相同
2.运行数据库脚本
数据库脚本
create database ellen;
use ellen;
create table users(
user_name varchar(15) not null primary key,
user_pass varchar(15) not null
);
create table user_roles(
user_name varchar(15) not null,
role_name varchar(15) not null,
primary key(user_name,role_name)
);
insert into users values("ellen","123");
insert into user_roles values("ellen","guest");
3.将数据库驱动类复制粘贴到tomcat的lib目录
4.在web应用的METE-INF目录下的context.xml文件中配置Realm
context.xml文件内容
<Context reloadable="true">
 <Realm className="org.apache.catalina.realm.JDBCRealm"
  driverName="com.mysql.jdbc.Driver"
  connectionURL="jdbc:mysql://localhost/ellen" connectionName="root"
  connectionPassword="root" userTable="users" userNameCol="user_name"
  userCredCol="user_pass" userRoleTable="user_roles"
  roleNameCol="role_name" />
</Context>

DataSource域
1.2.3步和JDBC域相同
4.在web应用的METE-INF目录下的context.xml文件中配置Realm
context.xml文件内容
<Context reloadable="true">
 <Realm className="org.apache.catalina.realm.JDBCRealm"
  driverName="com.mysql.jdbc.Driver"
  connectionURL="jdbc:mysql://localhost/ellen" connectionName="root"
  connectionPassword="root" userTable="users" userNameCol="user_name"
  userCredCol="user_pass" userRoleTable="user_roles"
  roleNameCol="role_name" />
</Context>

JNDI域
1.2.3步和JDBC域相同
4.在web应用的METE-INF目录下的context.xml文件中配置Realm
context.xml文件内容
<Context reloadable="true">
 <Realm className="org.apache.catalina.realm.DataSourceRealm"
  dataSourceName="jdbc/ellen" userTable="users" userNameCol="user_name"
  userCredCol="user_pass" userRoleTable="user_roles"
  roleNameCol="role_name" />
</Context>
5.在tomcat的conf目录下的server.xml文件中GlobalNamingResources元素下添加Resource元素
    <Resource name="jdbc/ellen" auth="Container"    type="javax.sql.DataSource"
     maxActive="100" maxIdle="30" maxWait="10000"
     username="root" password="root"
     driverClassName="com.mysql.jdbc.Driver"
     url="jdbc:mysql://localhost:3306/ellen?autoReconnect=true"/>

你可能感兴趣的:(tomcat,应用服务器,配置管理,项目管理,嵌入式)