分类: LINUX
2010-05-14 11:40:55
本文只是对于apache+tomcat的整合讲解一些基础知识,希望能够起到抛砖引玉的效果。
1.Tomcat的目录结构及其用途
目 录
用 途
/bin
存放启动和关闭Tomcat的脚本文件
/common/lib
存放Tomcat服务器及所有Web应用程序都可以访问的JAR文件
/conf
存放Tomcat服务器的各种配置文件,其中包括server.xml(Tomcat的主要配置文件)、tomcat-users.xml和web.xml等配置文件
/logs
存放Tomcat的日志文件
/server/lib
存放Tomcat服务器运行所需的各种JAR文件
/server/webapps
存放Tomcat的两个Web应用程序:admin应用程序和manager应用程序
/shared/lib
存放所有Web应用程序都可以访问的JAR文件
/temp
存放Tomcat运行时产生的临时文件
/webapps
当发布Web应用程序时,通常把Web应用程序的目录及文件放到这个目录下
/work
Tomcat将JSP生成的Servlet源文件和字节码文件放到这个目录下
/common/lib目录、/server/lib和/shared/lib目录下都可以存放JAR文件,它们的区别在于:
在/server/lib目录下的JAR文件只能被Tomcat服务器访问;
在/shared/lib目录下的JAR文件可以被所有的Web应用程序访问,但不能被Tomcat服务器访问;
在/common/lib目录下的JAR文件可以被Tomcat服务器和所有的Web应用程序访问。
2.对于tomcat部分文件的阐释
2.1 server.xml(Tomcat的主要配置文件)
server:
port 指定一个端口,这个端口负责监听关闭tomcat的请求
shutdown 指定向端口发送的命令字符串
service:
name 指定service的名字
Connector (表示客户端和service之间的连接):
port 指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求
minProcessors 服务器启动时创建的处理请求的线程数
maxProcessors 最大可以创建的处理请求的线程数
enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
connectionTimeout 指定超时的时间数(以毫秒为单位)
Engine (表示指定service中的请求处理机,接收和处理来自Connector的请求):
defaultHost 指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
Context (表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范):
docBase 应用程序的路径或者是WAR文件存放的路径
path 表示此web应用程序的url的前缀,这样请求的url为****
reloadable 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序
host (表示一个虚拟主机):
name 指定主机名
appBase 应用程序基本目录,即存放应用程序的目录
unpackWARs 如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
Logger (表示日志,调试和错误信息):
className 指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口
prefix 指定log文件的前缀
suffix 指定log文件的后缀
timestamp 如果为true,则log文件名中要加入时间,如下例:localhost_log.2001-10-04.txt
Realm (表示存放用户名,密码及role的数据库):
className 指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口
Valve (功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样):
className 指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息
directory 指定log文件存放的位置
pattern 有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多
注意:
默认的server.xml中,Realm元素只设置了一个className属性,但此文件中也包含几个通过JDBC连接到数据库进行验证的示例(被注释掉了),通过Realm元素我们可以实现容器安全管理(Container Managed Security)。 示例如下:
可以看到示例注释掉了。 |
还有一些元素,如Parameter,loader,你可以通过tomcat的文档获取这些元素的信息。
2.2 Jk指令分析
很重要,虽然有点繁缛,但是在实际生产中需要对此指令有详细了解。
定义workers
JkWorkersFile 指定mod_jk的workers定义.
JkWorkersFile /etc/httpd/conf/workers.properties
Logging
JkLogFile指定mod_jk放log文件的位置.
JkLogFile /var/log/httpd/mod_jk.log
JkLogLevel 可以设置以下log级别 :
info 包含标准的mod_jk行为 (默认).
error 包含错误信息.
debug mod_jk行为的全部信息
JkLogLevel info
JkLogStampFormat 用来配置log文件的日期/时间格式. 使用strftime()的格式化字符串,默认是[%a %b %d %H:%M:%S %Y]
JkLogStampFormat [%a %b %d %H:%M:%S %Y]
JkRequestLogFormat 设置个人用户请求的log格式.
Options Description
%b 发送的字节, 不包括 HTTP headers (CLF format)
%B 发送的字节, 不包括 HTTP headers
%H 协议
%m 请求方式(get/post)
%p 服务器响应请求的规范端口.
%q 查询字符串 (如果存在以?开头,否则是空串)
%r 请求的第一行.
%s HTTP状态码
%T 请求间隔, 处理请求耗费的时间 秒.微秒
%U 请求的url路径,不包含查询字符串.
%v 响应请求的规范服务器名字
%V 根据UseCanonicalName设置的服务器名字.
%w Tomcat worker 名字
JkRequestLogFormat %w %V %T
转发
JkOptions 允许你设置一些转发设置 允许或者不允许以下设置.
JkOptions ForwardKeySize, you ask mod_jk, when using ajp13, to forward also the SSL Key Size as required by Servlet API 2.3. This flag shouldn’t be set when servlet engine is Tomcat 3.2.x (on by default). .
JkOptions ForwardKeySize,要求mod_jk当使用ajp13的时候.因为Servlet API 2.3的需要,一起提交SSL Key Size.这个状态在servlet引擎3.2.x里不能设置(默认是打开的).
JkOptions +ForwardKeySize
JkOptions ForwardURICompat, you told mod_jk to send the URI to Tomcat normally, which is less spec compliant but mod_rewrite compatible, use it for compatibility with Tomcat 3.2.x engines (on by default).
JkOptions ForwardURICompat,要求mod_jk正常发送uri给tomcat,不符合规范,但是mod_rewrite兼容.使用它为Tomcat 3.2.x引擎的兼容性.(默认是打开的)
JkOptions +ForwardURICompat
JkOptions ForwardURICompatUnparsed, the forwarded URI is unparsed, it’s spec compliant but broke mod_rewrite.
JkOptions ForwardURICompatUnparsed,提交的uri是未解析的,兼容规范,但是中断了mod_rewrite.
JkOptions +ForwardURICompatUnparsed
JkOptions ForwardURIEscaped, 提交的url逃逸了,tomcat自己做解码.
JkOptions +ForwardURIEscaped
JkOptions ForwardDirectories 被用来与apache的DirectoryIndex命令配合. As such mod_dir should be available to Apache, statically or dynamically (DSO)
配置了DirectoryIndex的时候,Aapache将为每个在命令中指定的本地url建立子请求,来决定是否有匹配的本地文件.
如果ForwardDirectories设置为false(默认) 并且Apache没找到任何匹配的文件,Apache将提供文件夹的内容(如果这个文件夹的Options命令指定了Indexes)或者一个403 Forbidden(如果这个文件夹的Options命令没指定Indexes)
如果ForwarDirectories设置为true并且Apache没找到任何匹配的文件,请求将提交tomcat解决,这个被用在万一apache在几种情况下在本地文件系统上不能找到index文件:tomcat和apache不在一台机器上,jsp文件已经被预编译等等.
注意,本地可见的文件将优先于只能tomcat可见的文件.(使用,如果apache能看到文件,那么就是将被来提供的那个).这个很重要,如果多于一种文件被tomcat提供,例如Velocity pages 和 JSP pages.
JkOptions +ForwardDirectories
JkEnvVar 使用允许你从apache向tomcat提交一个环境变量.
JkEnvVar SSL_CLIENT_V_START
给tomcat指派url
如果你已经像上面记录的建立了一个定义的或者本地版本的mod_jk.conf-local.你可以改变像workers或者URL前缀的设置.
JkMount使用指派指定的url给Tomcat. 通常一个JkMount命令像这样:
JkMount [URL 前缀] [Worker name]
# 发送所有以.jsp结尾的请求给worker1
JkMount /*.jsp worker1
# 发送所有以/servlet结尾的请求给worker1
JkMount /*/servlet/ worker1
# 发送所有在/otherworker下的jsp请求给worker2
JkMount /otherworker/*.jsp worker2
可以在你的httpd.conf文件顶级或者段中使用JkMount命令.
配置apache提供静态web应用程序文件.
如果 Tomcat Host appBase (webapps) 文件夹apache可以访问,Apache可以被配置为提供web应用程序上下文文件夹的静态文件而不是转送给tomcat.
注意:如果Apache 被配置为为一个web应用程序提供静态页面.它将绕过任何你在web.xml中配置的安全约束.
Use Apache’s Alias directive to map a single web application context directory into Apache’s document space for a VirtualHost:
使用Apache的Alias使用来映射一个单web应用程序上下文文件夹到Apache的虚拟主机文档空间
# examples web应用程序的静态内容,apache来提供.
Alias /examples /vat/tomcat3/webapps/examples
# 下面一行禁止用户直接访问 WEB-INF
AllowOverride None
deny from all
# 所有的jsp请求给worker1
JkMount /*.jsp worker1
# 所有的servlets请求给worker1
JkMount /*/servlet/ worker1
Starting with mod_jk 1.2.6, and under Apache 2.0, it’s possible to exclude some URL/URI from jk processing by setting the env var no-jk, for example with the SetEnvIf Directive.
开始在apache2.0下使用mod_jk1.2.6,可以通过设置no-jk环境变量,把一些url/uri排除在jk处理以外,比如用SetEnvIf语句.
你可以使用no-jk 环境变量解决当jk和alias/userdir URL匹配时,mod_alias或mod_userdir存在的问题.
# 除了 /home所有的url转向tomcat.
ServerName testxxx.mysys
DocumentRoot /www/testxxx/htdocs
# 使用 SetEnvIf 来设置 当遇到/home/时 no-jk.
SetEnvIf Request_URI /home/* no-jk
# 现在 /home 将变成 /home/dataxxx/
Alias /home /home/dataxxx/
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
JkMount /* myssys-xxx
JkAutoAlias命令映射应用程序上下文文件夹在apache的文档空间.
试着访问在一个tomcat Host appBase(webapps)中的web应用程序上下文或者Web档案 *.war WEB-INF 或 META-INF 目录 将返回一个HTTP 403, Access Forbidden 失败.
# 静态内容由apache提供服务.
JkAutoAlias /var/tomcat3/webapps
JkMount /*.jsp ajp13
JkMount /*/servlet/ ajp13
3. 细节
3.1 关闭8080端口
如果apache与tomcat,一般情况就不需tomcat来作为前端web来使用,因此关闭。
|
3.2 更改tomcat服务端口,在某些情况下有意义。
|
若需更改则更改此处的8009.
3.3 关于转换解释的简单阐释
Servlet是Java对CGI的回应。它们在服务器上执行和解释浏览器的请求,承担客户端和其他应用程序之间的中间层的角色。Servlet主要是把动态的内容混合到静态的内容中以产生HTML。
JSP页面在HTML元素中嵌入Java脚本代码和JSP标记,使得文件长度变短,格式更加清晰。另一方面,JSP把静态和动态的内容分离开来,实现了内容和表示的分离。
使用JSP,不需要单独配置每一个文件,只要扩展名是.jsp,JSP容器(也是Servlet容器)就会自动识别,将其转换为Servlet为客户端服务。术语Web容器和JSP容器是同义的。
JSP容器管理JSP页面生命周期的两个阶段:转换阶段(translation phase)和执行阶段(execution phase)。当有一个对JSP页面的客户请求到来时,JSP容器检验JSP页面的语法是否正确,将JSP页面转换为Servlet源文件,然后调用javac工具类编译Servlet源文件生成字节码文件,这一阶段是转换阶段。接下来,Servlet容器加载转换后的Servlet类,实例化一个对象处理客户端的请求,在请求处理完成后,响应对象被JSP容器接收,容器将HTML格式的响应信息发送到客户端,这一阶段是执行阶段。
从整个过程中我们可以知道,当第一次加载JSP页面时,因为要将JSP文件转换为Servlet类,所以响应速度较慢。当再次请求时,JSP容器就会直接执行第一次请求时产生的Servlet,而不会再重新转换JSP文件,所以其执行速度和原始的Servlet执行速度几乎就相同了。在JSP执行期间,JSP容器会检查JSP文件,看是否有更新或修改。如果有更新或修改,JSP容器会再次编译JSP或Servlet;如果没有更新或修改,就直接执行前面产生的Servlet,这也是JSP相对于Servlet的好处之一。