开发者社区> 科技小能手> 正文

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23533 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
22242 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
18721 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
14694 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
15404 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14867 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
36361 0
23704
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载