关于java
Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照SunMicrosystems提供的技术规范,实现了对Servlet和JavaServerPage(JSP)的支持,并提供了作为Web服
务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。
用于mod_proxy状态信息的输出
<Location/balancer-manager>
SetHandlerbalancer-manager
OrderDeny,Allow
Allowfromall
</Location>
安装:
tomcat的安装很简单,只需要解压即可,同时注意tomcat的运行依赖java开发环境
#rpm-ivhjdk-7u9-linux-x64.rpm
java会被安装到/usr/java/jdk1.7.0_09下,同时创建两个链接default和latest。
配置环境变量
cat>>/etc/profile.d/jdk.sh<<EOF
JAVA_HOME=/usr/java/latest
PATH=$JAVA_HOME/bin:$PATH
EOF
#tarxfapache-tomcat-7.0.42.tar.gz-C/usr/local
#cd/usr/local
#ln-svapache-tomcat-7.0.42tomcat
配置环境变量
cat>>/etc/profile.d/tomcat.sh<<EOF
CATALINA_HOME=/usr/local/tomcat
PATH=$CATALINA_HOME/bin:$PATH
EOF
tomcat脚本
#!/bin/sh
#TomcatinitscriptforLinux.
#
#chkconfig:23459614
#description:TheApacheTomcatservlet/JSPcontainer.
JAVA_OPTS='-Xms64m-Xmx128m'
JAVA_HOME=/usr/java/default
CATALINA_HOME=/usr/local/tomcat
exportJAVA_HOMECATALINA_HOME
exec$CATALINA_HOME/bin/catalina.sh"$@"
配置:
tomcat的配置文件在$CATALINA_HOME/conf中
其中server.xml是用来配置tomcat实例的
一个tomcat实例叫server,server下面有connector,设定tomcat监听的端口和与浏览器或者代理通信的方式,Engine是Servlet处理器的一个实例,即servlet引擎,为了将
Engine和connect关联起来,需要一个叫service的组件。Engine下面有host组件,是tomcat用来接收请求并进行相应处理的主机或虚拟主机,host组件下放置context组件,一个
context对应host下部署的一个web应用。
其它的组件有
Realm组件,用于认证
Valve,用于过滤,可以实现访问控制和日志记录
Engine相关的配置:
name="Catalina"#用于标识一个引擎
defaultHost="www.kiki.com"#缺省主机
jvmRoute="TomcatA"#在前端apache使用为tomcat做代理时用来区分不同Engine
host组件相关的配置:
name="localhost"标识一个host,须唯一
auotDeploy="true"自动布署,默认为false
appBase="webapps"定义这个主机的应用程序的路径,相对路径是相对于tomcat的安装路径(也就是"/usr/local/tomcat"),也可以使用绝对路径
unpackWARs="true"让Tomcat可以自动解压war文件
context相关的配置:
1)docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;切记,docBase的路径名不能与相应的Host中appBase中定义的路径
名有包含关系,比如,如果appBase为deploy,而docBase绝不能为deploy-bbs类的名字;
2)path:相对于(虚拟)主机根路径而言的URI;如果为空“”,则表示为此(虚拟)主机的根路径
tomcat安装后就部署了几个应用,在$CATALINA_HOME/webapps目录下,可以使用浏览器通过8080端口访问localhost这个host(缺省主机),但访问ServerStatus,和ManagerApp,Host
Manager需要认证,可以在$CATALINA_HOME/conf/tomcat-users.xml中配置如下
<rolerolename="manager-gui"/>
<rolerolename="admin-gui"/>
<userusername="gentoo"password="gentoo"roles="manager-gui,admin-gui"/>
即可使用gentoo:gentoo访问,注意tomcat中role即相当与group。
部署应用:
编辑$CATALINA_HOME/conf/server.xml,在Engine容器中添加如下配置,新增一个host和context
<Hostname="www.kiki.com"appBase="/tomcat/app1"
unpackWARs="true"autoDeploy="true">
<Contextpath=""docBase="/tomcat/app1"/>
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
prefix="www.kiki.com_access_log."suffix=".txt"
pattern="%h%l%u%t"%r"%s%b"/>
</Host>
根据上述配置,创建/tomcat/app1目录,在
#mkidr-p/tomcat/app1
#cd/tomcat/app1
将使用java开发的web应用放置在/tomcat/app1中即可,
为tomcat做代理:
Tomcat的Web服务器连接器支持两种协议:AJP和HTTP
使用nginx和haproxy为tomcat做代理,只能使用http/https协议进行通信,此时tomcat即是一个完全功能的HTTP服务器,前端配置使用普通的proxy_pass(nginx)和
default_backend(haproxy)即可。
使用apache为tomcat做代理则同时支持http和ajp协议,目前常用的ajp13协议是一种基于二进制格式的在web服务器和tomcat之间传输数据,效率比http更高,所以如果前端使用
apache为tomcat做代理,建议使用ajp类型的连接器。
Apache可以通过mod_jk和mod_proxy模块跟Tomcat整合,但mod_proxy只有在apache2.2.x系列的版本才直接提供,但它可以提供更丰富的功能和安全性;而对于apache1.3.x和2.0.x
来说mod_jk才更适用。
1、要使用mod_proxy与Tomcat实例连接,需要apache已经装载mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module(实现Tomcat集群时用到)、mod_slotmem_shm(
被proxy_balancer_module依赖)等模块:
#httpd-M|grepproxy
proxy_module(shared)
proxy_connect_module(shared)
proxy_ftp_module(shared)
proxy_http_module(shared)
proxy_fcgi_module(shared)
proxy_scgi_module(shared)
proxy_ajp_module(shared)
proxy_balancer_module(shared)
proxy_express_module(shared)
2、在httpd.conf的全局配置段或虚拟主机中添加如下内容:
ProxyViaOn
ProxyRequestsOff
ProxyPreserveHostOff
<Proxy*>
Requireallgranted
</Proxy>
ProxyPass/http://10.0.9.1:8080/
ProxyPassReverse/http://10.0.9.1:8080/
#ProxyPass/ajp://10.0.9.1:8009/
#ProxyPassReverse/ajp://10.0.9.1:8009/
<Location/>
Requireallgranted
</Location>
可以选择使用ajp协议或者http
关于如上apache指令的说明:
ProxyPreserveHost{On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则
需要开启此项,否则就无需打开此功能。
ProxyVia{On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;
Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。
ProxyRequests{On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设
置为Off。
ProxyPass[path]!|url[key=valuekey=value...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服
务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。
另外,mod_proxy模块在httpd2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保存至连接池中以备进一步使用。连接池大小或其它设定可以通过在ProxyPass中使用
key=value的方式定义。常用的key如下所示:
◇min:连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小。
◇max:连接池的最大容量,每个MPM都有自己独立的容量;都值与MPM本身有关,如Prefork的总是为1,而其它的则取决于ThreadsPerChild指令的值。
◇loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。
◇retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。
如果Proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示:
◇lbmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的
当前负载进行调度。
◇maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。
◇nofailover:取值为On或Off,设置为On时表示后端服务器故障时,用户的session将损坏;因此,在后端服务器不支持session复制时可将其设置为On。
◇stickysession:调度器的stickysession的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。
上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,如:
<Proxybalancer://hotcluster>
BalancerMemberhttp://www1.magedu.com:8080loadfactor=1
BalancerMemberhttp://www2.magedu.com:8080loadfactor=2
ProxySetlbmethod=bytraffic
</Proxy>
ProxyPassReverse:用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器。
基于mod_proxy实现负载均衡
在httpd.conf的全局配置中配置如下内容:
ProxyViaOn
ProxyRequestsOff
ProxyPreserveHostOff
<proxybalancer://lbcluster1>
BalancerMemberajp://10.0.9.1:8009loadfactor=10route=TomcatA
BalancerMemberajp://10.0.9.11:8009loadfactor=10route=TomcatBP
roxySetlbmethod=bytraffic</proxy>
ProxyPass/balancer://lbcluster1
ProxyPassReverse/balancer://lbcluster1/
注意,缺省的负载均衡算法是byrequests,必须加载mod_lbmethod_byrequests模块,httpd才能正常工作。
用于mod_proxy状态信息的输出
<Location/balancer-manager>
SetHandlerbalancer-manager
OrderDeny,Allow
Allowfromall
</Location>
使用mod_jk方式让apache为tomcat做代理
mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。
安装mod_jk连接器,如果系统上没有apxs,先yuminstallhttpd-devel
#tarxftomcat-connectors-1.2.37-src.tar.gz
#cdtomcat-connectors-1.2.37-src/native
#./configure--with-apxs=/usr/local/apache/bin/apxs
#make&&makeinstall
添加一个apache的子配置文件,内容如下:
LoadModulejk_modulemodules/mod_jk.so
JkWorkersFile/etc/httpd/workers.properties
JkLogFilelogs/mod_jk.log
JkLogLeveldebug
JkMount/*TomcatA
Jkmount/status/stat1
jkWorkersFile则用于指定保存了worker相关工作属性定义的配置文件,JkLogFile则用于指定mod_jk模块的日志文件,JkLogLevel则可用于指定日志的级别(info,error,debug),此外还
可以使用JkRequestLogFormat自定义日志信息格式。而JkMount(格式:JkMount<URLtomatch><Tomcatworkername>)
在/etc/httpd下创建文件workers.properties,内容如下:
worker.list=TomcatA,stat1
worker.TomcatA.host=10.0.9.1
worker.TomcatA.port=8009
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.stat1.type=status
workers.properties文件一般由两类指令组成:一是mod_jk可以连接的各worker名称列表,二是每一个worker的属性配置信息。它们分别遵循如下使用语法。
worker.list=<acommaseparatedlistofworkernames>
worker.<workername>.<property>=<propertyvalue>
其中worker.list指令可以重复指定多次,而workername则是Tomcat中engine组件jvmRoute参数的值。如:
worker.TomcatA.host=172.16.100.1
根据其工作机制的不同,worker有多种不同的类型,这是需要为每个worker定义的一项属性woker.<workname>.type。常见的类型如下:
◇ajp13:此类型表示当前worker为一个运行着的Tomcat实例。
◇lb:lb即loadbalancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。
◇status:用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。具体示例如请参见后文中的配置。
worker其它常见的属性说明:
◇host:Tomcat7的worker实例所在的主机;
◇port:Tomcat7实例上AJP1.3连接器的端口;
◇connection_pool_minsize:最少要保存在连接池中的连接的个数;默认为pool_size/2;
◇connection_pool_timeout:连接池中连接的超时时长;
◇mount:由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代;
◇retries:错误发生时的重试次数;
◇socket_timeout:mod_jk等待worker响应的时长,默认为0,即无限等待;
◇socket_keepalive:是否启用keepalive的功能,1表示启用,0表示禁用;
◇lbfactor:worker的权重,可以在负载均衡的应用场景中为worker定义此属性;
另外,在负载均衡模式中,专用的属性还有:
◇balance_workers:用于负载均衡模式中的各worker的名称列表,需要注意的是,出现在此处的worker名称一定不能在任何worker.list属性列表中定义过,并且worker.list属性中定义的
worker名字必须包含负载均衡worker。具体示例请参见后文中的定义。
◇method:可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。
◇sticky_session:在将某请求调度至某worker后,源于此址的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。默认为值为1,即启用此功能。如果后端的各
worker之间支持session复制,则可以将此属性值设为0。
配置基于mod_jk的负载均衡
httpd子配置文件
LoadModulejk_modulemodules/mod_jk.so
JkWorkersFile/etc/httpd/workers.properties
JkLogFilelogs/mod_jk.log
JkLogLeveldebug
JkMount/*lbcluster1
Jkmount/status/stat1
workers.properties文件
worker.list=lbcluster1,stat1
worker.TomcatA.host=10.0.9.1
worker.TomcatA.port=8009
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.TomcatB.host=10.0.9.11
worker.TomcatB.port=8009
worker.TomcatB.type=ajp13
worker.TomcatB.lbfactor=1
worker.lbcluster1.type=lb
#worker.lbcluster1.method=T
worker.lbcluster1.sticky_session=0
worker.lbcluster1.balance_workers=TomcatB,TomcatA
worker.stat1.type=status
其它:
应用程序目录的结构:
/WEB-INF/web.xml:包含当前webapp的deploy描述符,如所有的servlets和JSP等动态文件的详细信息,会话超时时间和数据源等;因此,其也通常用于定义当前webapp特有的资源;
/WEB-INF/classes:包含所有服务器端类及当前应用程序相关的其它第三方类等;
/WEB-INF/lib:包含JSP所用到的JAR文件;
xml文件格式:
比如
<Contextpath=""docBase="/tomcat/app1"/>闭合标志/>前必须有空格
像这种
<Servicename="Catalina">
">"前却不需空格