Apache与Tomcat整合之Tomcat讲解

来源:互联网 发布:好玩的rpg 知乎 编辑:程序博客网 时间:2024/04/26 08:45

本文只是对于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为http://localhost:8080/path/****     
  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)。  示例如下: 

<!-- <Realm className="org.apache.catalina.realm.JDBCRealm" driverName="org.gjt.mm.mysql.Driver" connectionURL="jdbc:mysql://localhost/authority" connectionName="test" connectionPassword="test" userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name" /> -->

可以看到示例注释掉了。

     还有一些元素,如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来使用,因此关闭。

 <!--   <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" /> -->

 

3.2 更改tomcat服务端口,在某些情况下有意义。 

<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

若需更改则更改此处的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的好处之一。

原创粉丝点击