博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
D21-JSP之了解 tomcat
阅读量:7231 次
发布时间:2019-06-29

本文共 7325 字,大约阅读时间需要 24 分钟。

D21-JSP之了解 tomcat

                                                  第二节 了解 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

servlet
话说tomcat的前世今生 
tomcat server.xml 中文版介绍  
tomcat部署web服务(一) 
apache tomcat整合后虚拟主机配置
tomcat 日志配置(Tomcat访问日志浅析)
用Haproxy做前端代理时让Apache日志记录客户端IP的修改方法

 

结束

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

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

转载地址:http://ypvfm.baihongyu.com/

你可能感兴趣的文章
Servlet和模本办法
查看>>
static和final修饰方法
查看>>
读《认知三部曲》
查看>>
关于SVN 目录结构
查看>>
tp5页面输出时,搜索后跳转下一页的处理
查看>>
crontab命令
查看>>
面试问题
查看>>
DeltaBlue基准测试显示 Dart2js生成的JavaScript代码优于手写代码
查看>>
cvReleaseImage()函数说明
查看>>
linux下查看某个文件属于哪个包
查看>>
Weui 文件上传完整版示例
查看>>
ubuntu上安装 MySQL 启动/停止 连接MySQL
查看>>
liunx 修改ssh 端口22
查看>>
iOS企业证书申请介绍
查看>>
hdu 1950 Bridging signals(最长上升子序列)
查看>>
jquery学习收获
查看>>
es6js promise在ie中报错“未定义”
查看>>
思科HSRP和Port-channel配置
查看>>
常用的sql脚本(陆续更新)
查看>>
mongodb的gridfs
查看>>