首页 > 代码库 > 高性能Web服务之tomcat基础应用详解(一)

高性能Web服务之tomcat基础应用详解(一)

Tomcat概述:

  Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

   Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。


Tomcat系统架构图如下所示:

技术分享

=============================================================

技术分享

server:服务器段,直接面向用户请求,tomcat的一个实例。
service:服务进程,deamon守护进程。
connect:连接器,用来连接server与service,当server接收请求后,通过连接器将请求传达给service。
engine:引擎,不同的引擎,提供了不同的方式处理serverlet,一个service中可以有多个engine,但是一般来说只有一个engine。
host:虚拟主机,可以有多个host,每个servername指向各自的host。
context:上下文,可以有多个,每一个context指向了不同的程序。
valve:阀门,用来定义一些独立的功能,如日志等,每一个host内可以有多个value,每一个value定义一个功能。
Realm:领域,用于用户的认证和授权。
Logger:用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。

Tomcat服务安装配置:

(1)安装JDK

# rpm -ivh jdk-7u9-linux-x64.rpm 
--安装JDK后生成的文件
# cd /usr/java/ ; ll
total 4
lrwxrwxrwx  1 root root   16 Sep 27 09:09 default -> /usr/java/latest
drwxr-xr-x 10 root root 4096 Sep 27 09:09 jdk1.7.0_09
lrwxrwxrwx  1 root root   21 Sep 27 09:09 latest -> /usr/java/jdk1.7.0_09

--配置JDK环境变量
# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.7.0_09
export PATH=$PATH:$JAVA_HOME/bin
--执行使环境变量生效
# . /etc/profile.d/java.sh
--测试如下:
# java -version
java version "1.7.0_45"        --jdk版本
OpenJDK Runtime Environment (rhel-2.4.3.3.el6-x86_64 u45-b15)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

(2)安装tomcat

--解压tomcat包至/usr/local下
# tar xf apache-tomcat-7.0.67.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv apache-tomcat-7.0.67 tomcat
--配置tomcat环境变量
# vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
# . /etc/profile.d/tomcat.sh
--测试如下:
# catalina.sh version
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.7.0_09
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.67
Server built:   Dec 7 2015 13:07:11 UTC
Server number:  7.0.67.0
OS Name:        Linux
OS Version:     2.6.32-431.el6.x86_64
Architecture:   amd64
JVM Version:    1.7.0_09-b05
JVM Vendor:     Oracle Corporation

--为tomcat提供srv启动脚本
# vim /etc/init.d/tomcat
#!/bin/sh
# Tomcat init script for Linux.
# 
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
# JAVA_OPTS=‘-Xms64m -Xmx128m‘
JAVA_HOME=/usr/java/latest
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME

case $1 in
start)
  $CATALINA_HOME/bin/catalina.sh start;;
stop)
  $CATALINA_HOME/bin/catalina.sh stop;;
restart)
  $CATALINA_HOME/bin/catalina.sh stop
  sleep 2
  $CATALINA_HOME/bin/catalina.sh start;;
*)
  echo "Usage: `basename $0` {start|stop|restart}"
  exit 1
  ;;
esac

# chmod +x /etc/init.d/tomcat
# chkconfig --add tomcat
# service tomcat start

--检查tomacat默认监听端口如下所示:
# ss -tunlp | grep java
tcp    LISTEN     0      100                   :::8080                 :::*      users:(("java",19525,42))
tcp    LISTEN     0      1       ::ffff:127.0.0.1:8005                 :::*      users:(("java",19525,47))
tcp    LISTEN     0      100                   :::8009                 :::*      users:(("java",19525,43))

访问测试如下:

技术分享



Tomcat服务配置:

Tomcat的主要目录和文件:

/usr/local/tomcat

bin/                       ----二进制文件目录。
    - catalina.sh          
    - ...                  
                           
conf/                      ----配置文件目录。
    - catalina.policy      ----Java相关的安全策略配置文件;
    - catalina.properties  ----Tomcat内部package的定义及访问相关的控制;
    - context.xml          ----所有host的默认配置信息;
    - logging.properties   ----日志记录器相关;
    - server.xml           ----Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;
    - tomcat-users.xml     ----Realm认证时用到的相关角色、用户和密码等信息;
    - web.xml              ----遵循Servlet规范标准的配置文件;
                           
lib/                       ----class类库文件目录。
    - catalina.jar         
    - ...                  
                           
logs/                      ----tomcat的日志目录。          
temp/                      ----临时文件目录。
                           
webapps/                   ----应用程序的默认存放目录。
    - docs                 
    - examples             
    - host-manager         
    - manager              
    - ROOT                 ----一般来说,当前版本所使用的APP会被通过ROOT来软链接。
    ├── images/         ----图片文件目录
    │    ├── void.gif      
    │    └── ...           
    ├── META-INF/          ----相当于一个信息包,用来配置应用程序、扩展程序、类加载器和服务manifest.mf文件,在用jar打包时自动生成。
    ├── index.jsp          ----JSP的默认文件,一般是默认主页。
    └── WEB-INF/           
        ├──    classes/    ----包含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中,编译成class的类库。
        ├──    lib/        ----存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件。
        ├──    ...         
        └── web.xml        ----Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
                           
work/                         ----tomcat的工作目录,存放了已经编译好了的文件等。


Tomcat的管理脚本:

# catalina.sh --help
Using CATALINA_BASE:   /usr/local/tomcat            --可以这边列出了CATALINA的一些ENV变量的值。
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/jdk1.7.0_09
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Usage: catalina.sh ( commands ... )                --以下就是catalina.sh的命令使用帮助。
commands:
  debug             Start Catalina in a debugger
  debug -security   Debug Catalina with a security manager
  jpda start        Start Catalina under JPDA debugger
  run               Start Catalina in the current window
  run -security     Start in the current window with security manager
  start             Start Catalina in a separate window
  start -security   Start in a separate window with security manager
  stop              Stop Catalina, waiting up to 5 seconds for the process to end
  stop n            Stop Catalina, waiting up to n seconds for the process to end
  stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running
  stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running
  configtest        Run a basic syntax check on server.xml - check exit code for result
  version           What version of tomcat are you running?
Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined

Tomcat主配置文件server.xml结构如下:

server.xml的基本结构:
<server>
  <service>
    <connect />
    <connect />
      <engine>
        <host>
          <context />
          <Logger />
          <valve />
          <Realm />
        </host>
      </engine>
    </service>
  </server>

======================================================================================
文件具体的解析:
<?xml version=‘1.0‘ encoding=‘utf-8‘?>                                        定义了xml的版本和采用的编码。
<Server port="8005" shutdown="SHUTDOWN">                                      定义在tomcat关闭时,传递给shutdown监听端口8005的字符串"SHUTDOWN".
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />  类库的调用和参数传递。
  <Listener className="org.apache.catalina.security.SecurityListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

    <GlobalNamingResources>                                GlobalNamingResources    定义了服务器的全局JNDI资源来调用java API结构。                        
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
    </GlobalNamingResources>

      <Service name="Catalina">                                                     定义了service的name。                
    <Connector port="8080" protocol="HTTP/1.1"     http的连接器; 每一个连接器类似于定义了不同的端口,不同的协议来接收用户请求。
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="80" protocol="HTTP/1.1"     http的连接器; 每一个连接器类似于定义了不同的端口,不同的协议来接收用户请求。
               connectionTimeout="20000"
               redirectPort="8443" />          
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />                ajp的连接器。

    <!-- 
    <Connector executor="tomcatThreadPool"                                            tomcat的线程池关联的连接器。
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"        https的连接器相关。
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->


    <Engine name="Catalina" defaultHost="localhost">            engine段,定义了engine name和访问/时,默认指向的虚拟主机。

          <Realm className="org.apache.catalina.realm.LockOutRealm">     安全上下文,基于UserDatabase文件(通常是tomcat-user.xml)实现用户认证。
               <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
          </Realm>

          <Host name="localhost"  appBase="webapps"        默认的虚拟主机localhost,指向了tomcat的默认页面。
                unpackWARs="true" autoDeploy="true">       name虚拟主机名称,appbase程序的目录,unpackWARs自动展开WAR文件,autoDeploy热部署。

            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/log"    valve定义了日志相关。
                   prefix="localhost_access_log." suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
          </Host>

          <Host name=‘www.samlee.com‘ appBase=‘/www/webapps‘ unpackWARs=‘ture‘ autoDeploy=‘false‘>        第二个虚拟主机www.samlee.com。

             <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/www/webapps/log"        
                   prefix="samlee_access_log." suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />

             <Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="127\.0\.0\.1"/>        
                    <!-- 此处通过valve中的类RemoteAddrValve定义了基于ip的访问控制,拒绝了本地访问,类RemoteHostValve则是基于主机名的访问控制 
                            当然其实此处的访问控制仅为演示,实际上并没有什么特殊意义!-->

             <Context path=‘/‘ docBase=‘/www/webapps/samlee‘ />        定义了一个访问路径,如果访问/,相对应的路径为/www/webapps/samlee
          </Host>
      </Engine>
      </Service>
    </Server>

重启tomcat服务,通过以上配置两个虚拟主机:基于IP地址端口为8080与端口80 基于域名端口为8080与端口80的虚拟主机:

--创建虚拟主机目录
# mkdir -pv /www/webapps/{log,samlee,classes,META-INF,WEB-INF,lib}
--创建index.jsp主页文件
# vim /www/webapps/samlee/index.jsp 
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
  <head>
    <title>JSP test page.</title>
  </head>
  <body>
    <% out.println("Hello,www.samlee.com!"); %>
  </body>
</html>
--创建test.jsp主页文件
# vim /www/webapps/samlee/test.jsp 
<%@ page language="java" %>
<html>
  <head><title>samlee</title></head>
  <body>
    <h1><font color="red">www.samlee.com</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("magedu.com","magedu.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>
--重启tomcat服务
# service tomcat restart
--查看tomcat监听端口
# ss -tunlp | grep java
tcp    LISTEN     0      100                   :::8080                 :::*      users:(("java",20774,43))
tcp    LISTEN     0      100                   :::80                   :::*      users:(("java",20774,42))
tcp    LISTEN     0      1       ::ffff:127.0.0.1:8005                 :::*      users:(("java",20774,54))
tcp    LISTEN     0      100                   :::8009                 :::*      users:(("java",20774,44))

访问测试如下:

技术分享

访问test.jsp测试页如下:

技术分享

技术分享


配置Tomcat Manager管理页面认证:

修改/usr/local/tomcat/conf/tomcat-users.xml内容如下所示即可:

技术分享

重启tomcat服务,进入manager-gui管理界面,进入server status页面,可以显示服务器内容占用时间,如下所示:

技术分享

技术分享

技术分享

以上为tomcat基础应用详解所有内容。

本文出自 “Opensamlee” 博客,请务必保留此出处http://gzsamlee.blog.51cto.com/9976612/1857075

高性能Web服务之tomcat基础应用详解(一)