D21-JSP之了解 tomcat
第二节 了解 tomcat
1 tomcat 的目录结构
- 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.comcenter.test.com//每个虚拟机有一个jsp应用(context,可以有多个)
/var/www/html/localhost
/var/www/html/center
/var/www/html/java
3.2 添加虚拟机主机 (server.xml 配置文件中) - <Host name="localhost" appBase="/var/www/html/localhost"
- unpackWARs="true" autoDeploy="true">
- <Context path="" docBase="/var/www/html/localhost" reloadable="true" crossContext="true"/>
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/log/httpd/localhost"
- prefix="localhost_access_log." suffix=".txt" resolveHosts="false"
- pattern='%h %l %T %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %{X-Forwarded-For}i' />
- </Host>
-
- <Host name="center.test.com" appBase="/var/www/html/center"
- unpackWARs="true" autoDeploy="true">
- <Context path="" docBase="/var/www/html/center" reloadable="true" crossContext="true"/>
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/log/httpd/center"
- prefix="center_access_log." suffix=".txt" resolveHosts="false"
- pattern='%h %l %T %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %{X-Forwarded-For}i' />
- </Host>
-
- <Host name="java.test.com" appBase="/var/www/html/java"
- unpackWARs="true" autoDeploy="true">
- <Context path="" docBase="/var/www/html/java" reloadable="true" crossContext="true"/>
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/log/httpd/java"
- prefix="java_access_log." suffix=".txt" resolveHosts="false"
- pattern='%h %l %T %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %{X-Forwarded-For}i' />
- </Host>
3.2.1 appBase和docBase
这里需要解释下,比较容易
混淆的是appBase和docBaseappBase 表示
此虚拟主机下所有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/
新生成一个目录,例如:
- 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
- <Context path="/A" reloadable="true" docBase="/var/www/html/localhost/A">
- <Logger className="org.apache.catalina.logger.SystemOutLogger" verbosity="4" timestamp="true"/>
- </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 日志默认的配置
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
- prefix="localhost_access_log." suffix=".txt"
- 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