D21-JSP之了解 tomcat

简介:

D21-JSP之了解 tomcat

                                                  第二节 了解 tomcat

上接 D20-JSP之部署tomcat

1 tomcat 的目录结构

 
  1. ls /usr/local/tomcat/ 

bin   lib      logs    RELEASE-NOTES  temp     work
conf  LICENSE  NOTICE  RUNNING.txt    webapps

/bin: 存放配置,控制,停止catalina server 的一些相关脚本 
/conf: 存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和web.xml 
/doc: 存放Tomcat文档 
/webapps: Tomcat的主要Web发布目录,默认情况下把Web应用文件放于此目录 
          子目录WEB_INF/目录:包含三个子目录:classes、lib和web.xml  
          其中 classes 是应用运行时需要的私有类(编译好的可执行字节码),
/lib: 存放的是应用运行时需要的公共类 web.xml 当前应用程序的部署描述符 
      子目录 host-manager  ,manager 提供的是Tomcat的web管理工具 
/work: 存放JSP编译后产生的class文件 
       实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的 
       所以 Apache和通过Connector与Tomcat连接,实现Apache在web前端仅处理用户请求的静态内容,
       用户请求的动态内容通过Connector交给后端的Tomcat server 处理,从而实现对用户请求内容的快速响应。 
/log: tomcat 日志


2 tomcat 的逻辑结构
Server
  |
Service(关联一个或多个Connector至某engine)
  |
Engine(Container)
  |
Host(一个engin可以包含多个host,但要有一个默认host)
  |
Context(一个host内部可以有多个context,
        每一个Context对应与一个web应用程序,
        而每一个web应用程序(jsp)需要至少一个部署描述符文件web.xml)


3 tomcat 虚拟主机与jsp的应用
3.1 例子
//共三个虚拟主机(host)
localhost(默认host)
java.test.com
center.test.com

//每个虚拟机有一个jsp应用(context,可以有多个)
/var/www/html/localhost
/var/www/html/center
/var/www/html/java

3.2 添加虚拟机主机 (server.xml 配置文件中)

 
  1. <Host name="localhost"  appBase="/var/www/html/localhost" 
  2.       unpackWARs="true" autoDeploy="true"> 
  3.    <Context path="" docBase="/var/www/html/localhost" reloadable="true" crossContext="true"/> 
  4.    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/log/httpd/localhost" 
  5.           prefix="localhost_access_log." suffix=".txt" resolveHosts="false" 
  6.           pattern='%h %l %T %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %{X-Forwarded-For}i' /> 
  7. </Host> 
  8.  
  9. <Host name="center.test.com" appBase="/var/www/html/center" 
  10.       unpackWARs="true" autoDeploy="true"> 
  11.    <Context path="" docBase="/var/www/html/center" reloadable="true" crossContext="true"/> 
  12.    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/log/httpd/center" 
  13.           prefix="center_access_log." suffix=".txt" resolveHosts="false" 
  14.           pattern='%h %l %T %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %{X-Forwarded-For}i' /> 
  15. </Host> 
  16.  
  17. <Host name="java.test.com" appBase="/var/www/html/java" 
  18.       unpackWARs="true" autoDeploy="true"> 
  19.    <Context path="" docBase="/var/www/html/java" reloadable="true" crossContext="true"/> 
  20.    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/log/httpd/java" 
  21.           prefix="java_access_log." suffix=".txt" resolveHosts="false" 
  22.           pattern='%h %l %T %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %{X-Forwarded-For}i' /> 
  23. </Host> 

3.2.1 appBase和docBase
这里需要解释下,比较容易混淆的是appBase和docBase
appBase 表示此虚拟主机下所有java应用的目录该目录下的所有目录都会当作一个应用,例如上面/var/www/html/localhost路径下的所有目录都作为一个应用。
docBase 表示一个应用的路径
区别:
appBase设置与否其实关系不大,tomcat在找到host后然后继续找到context下docbase路径下的JSP文件,然后构造对象执行完,将值返回,那么appbase的作用是什么呢?因为jsp不像php直接将代码拷贝网站目录下就完事了,它往往是编译成一个war结尾的压缩包,然后将这个包放到网页目录下,这个appbase的作用就在这里,这个目录下的war包能自动解压自动部署,当然如果你只是把包放到appbase下,就算解压了,但是你没有配置docbase,依旧是不能从网页上访问的。

3.2.2 host和context区别
host    表示一个虚拟主机  
context 表示虚拟主机下一个jsp的应用
sever.xml中每建立一个虚拟主机,都会在/usr/local/tomcat/conf/Catalina/新生成一个目录,例如:

 
  1. ls /usr/local/tomcat/conf/Catalina/ 

center.test.com  java.test.com  localhost

每个目录其实就表示一个虚拟主机,在这个目录下你可以建每个JSP应用的配置文件
也就是说你刚才在server.xml中配置的context这部分,可以放到这个里面自建,例如在www.test.com目录下建立A.xml:

vim A.xml

 
  1. <Context path="/A" reloadable="true" docBase="/var/www/html/localhost/A"> 
  2. <Logger className="org.apache.catalina.logger.SystemOutLogger" verbosity="4" timestamp="true"/> 
  3. </Context>  


3.2.3 Context 参数 
3.2.3.1 context
context下path这个,例如上面这个/A 表示通过192.168.57.77/A 就可以访问docbase这个目录下的应用,这个path如果是在单tomcat的情况下可以任意写,但是在apache tomcat整合后这个就不能随便写了,因为用户首先是提交到apache,apache如果找不到这个路径就直接404了,当然apache也有其他办法实现这个的
3.2.3.2 reloadable
reloadable="true" 这个参数表示tomcat能自动部署新应用,这样的话tomcat就不需要重启,就能自动部署新的应用。


4 tomcat 日志配置
tomcat 日志默认的配置

 
  1. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
  2.        prefix="localhost_access_log." suffix=".txt" 
  3.        pattern="common" resolveHosts="false"/>  


4.1 value 参数
directory       日志保存的目录
prefix           日志的文件名的前缀
suffix           日志的后缀
resolveHost  解析主机名
pattern         日志输出的内容格式
注意:该项值可以为 common 与 combined ,这两个预先设置好的格式对应的日志输出内容如下
common 的值: %h %l %u %t %r %s %b
combined 的值: %h %l %u %t %r %s %b %{Referer}i %{User-Agent}i
pattern 也可以根据需要自由 组 合 , 例如 pattern="%h %l" 

4.2 日志格式
4.2.1 基本的日志格式项:
    %a – 远程主机的IP (Remote IP address)
    %A – 本机IP (Local IP address)
    %b – 发送字节数,不包含HTTP头,0字节则显示 ‘-’ (Bytes sent, excluding HTTP headers, or ‘-’ if no bytes were sent)
    %B – 发送字节数,不包含HTTP头 (Bytes sent, excluding HTTP headers)
    %h – 远程主机名 (Remote host name)
    %H – 请求的具体协议,HTTP/1.0 或 HTTP/1.1 (Request protocol)
    %l – 远程用户名,始终为 ‘-’ (Remote logical username from identd (always returns ‘-’))
    %m – 请求方式,GET, POST, PUT (Request method)
    %p – 本机端口 (Local port)
    %q – 查询串 (Query string (prepended with a ‘?’ if it exists, otherwise an empty string)
    %r – HTTP请求中的第一行 (First line of the request)
    %s – HTTP状态码 (HTTP status code of the response)
    %S – 用户会话ID (User session ID)
    %t – 访问日期和时间 (Date and time, in Common Log Format format)
    %u – 已经验证的远程用户 (Remote user that was authenticated
    %U – 请求的URL路径 (Requested URL path)
    %v – 本地服务器名 (Local server name)
    %D – 处理请求所耗费的毫秒数 (Time taken to process the request, in millis)
    %T – 处理请求所耗费的秒数 (Time taken to process the request, in seconds)

4.2.2 定制日志格式
你可以用以上的任意组合来定制你的访问日志格式,也可以用下面两个别名common和combined来指定常用的日志格式:
common – %h %l %u %t "%r" %s %b
combined - %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"
           %h %l %T %t %r %s %b %{Referer}i %{User-Agent}i %{X-Forwarded-For}i

另外你还可以将cookie, 客户端请求中带的HTTP头(incoming header), 会话(session)或是ServletRequest中的数据都写到Tomcat的访问日志中,你可以用下面的语法来引用。

    %{xxx}i – 记录客户端请求中带的HTTP头xxx(incoming headers)
    %{xxx}c – 记录特定的cookie xxx
    %{xxx}r – 记录ServletRequest中的xxx属性(attribute)
    %{xxx}s – 记录HttpSession中的xxx属性(attribute)

4.2.3 对比日志
日志格式 pattern="combined"

//access_log
10.0.100.82 - - [30/Aug/2012:11:55:07 +0800] "GET / HTTP/1.1" 200 217 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1" 

定制日志格式
pattern='%h %l %T %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %{X-Forwarded-For}i'
//access_log
10.0.100.82 - 0.058 [30/Aug/2012:15:54:12 +0800] "GET / HTTP/1.1" 200 217 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1" 192.168.4.33

注意:用haproxy作前端反向代理后,tomcat日志记录的IP是haproxy的IP,而不是用户客户端的IP,只需把日志配置里添加{X-Forwarded-For}i就可以了


最后转一个tomcat的处理http请求的过程,因为熟悉这样一个过程后对于tomcat的理解会更好:
假设来自客户的请求为: 
    http://localhost:8080/wsota/wsota_index.jsp 
     
    1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得 
    2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应 
    3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host 
    4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机) 
    5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context 
    6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理) 
    7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet 
    8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类 
    9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法 
    10)Context把执行完了之后的HttpServletResponse对象返回给Host 
    11)Host把HttpServletResponse对象返回给Engine 
    12)Engine把HttpServletResponse对象返回给Connector 
    13)Connector把HttpServletResponse对象返回给客户browser

 

参考

tomcat
http://baike.baidu.com/view/10166.htm

servlet
baike.baidu.com/view/25169.htm

话说tomcat的前世今生 
http://haicang.blog.51cto.com/2590303/963648

tomcat server.xml 中文版介绍  
http://jvortex.blog.163.com/blog/static/16961890020111253509772/

tomcat部署web服务(一) 
http://wjw7702.blog.51cto.com/5210820/960577

apache tomcat整合后虚拟主机配置
http://lsscto.blog.51cto.com/779396/899306

tomcat 日志配置(Tomcat访问日志浅析)
http://blog.sina.com.cn/s/blog_7acf99ef01013rjt.html

用Haproxy做前端代理时让Apache日志记录客户端IP的修改方法
http://www.ha97.com/4825.html

 

结束
更多请:
linux 相关 37275208
vmware 虚拟化相关  166682360



本文转自 dongnan 51CTO博客,原文链接:http://blog.51cto.com/dngood/1064424

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
5月前
|
Java 应用服务中间件 Apache
Tomcat 发布jsp报错
Tomcat 发布jsp报错
|
7月前
|
Oracle Java 关系型数据库
Jsp/Servlet中tomcat基础配置
Jsp/Servlet中tomcat基础配置
59 0
|
8月前
|
Java 应用服务中间件 Maven
Tomcat与Servlet、JSP、JDK的版本适配问题(解决访问出现404和500的问题)
一、问题描述 最近在学习Maven创建Java Web项目的过程中,出现了配置Servlet后访问出现404和500的问题,如下
|
开发框架 Java 应用服务中间件
搭建一个tomcat的JSP服务器环境
搭建一个tomcat的JSP服务器环境
66 0
|
Java 应用服务中间件 Android开发
eclipse配置Tomcat服务器开发Jsp 超详细
eclipse配置Tomcat服务器开发Jsp 超详细
254 0
eclipse配置Tomcat服务器开发Jsp 超详细
|
Java Maven
【Javaweb】【Maven】【Tomcat10】jsp访问正常,Servlet访问404
【Javaweb】【Maven】【Tomcat10】jsp访问正常,Servlet访问404
128 0
【Javaweb】【Maven】【Tomcat10】jsp访问正常,Servlet访问404
|
应用服务中间件
Tomcat&Servlet笔记
Tomcat&Servlet笔记
97 0
|
Java 应用服务中间件
Tomcat forward debug - how is jsp file served in Tomcat
Tomcat forward debug - how is jsp file served in Tomcat
Tomcat forward debug - how is jsp file served in Tomcat
|
Web App开发 Java 应用服务中间件
|
Java 应用服务中间件