JAVA与Tomcat(续一)

简介:

realm组件

一个realm表示一个安全上下文,它是一个授权访问某个给定context的用户列表和某用户所允许切换的角色相关定义的列表。因此,realm就像是一个用户和组相关的数据库,定义realm时唯一必须要提供的属性就是classname,他是realm的多个不同实现,用来表示此realm认证的用户及角色等认证信息的存放位置。

jaasrealm:基于java authintication and authorization service实现用户认证

jdbcrealm:通过jdbc访问某个关系型数据库表实现用户认证。

jndirealm:基于jndi使用目录服务实现用户认证。

memoryrealm:查找tomcat-user.xml文件实现用户认证。

userdatabaserealm:基于userdatabase文件实现认证(通常是tomat-user.xml文件),它实现的是一个完全可更新和持久有效的memoryrealm,因此能够跟标准memoryrealm兼容,它通过jndi实现。

实例:

<realm classname=“org.apache.catalina.realm.jdbcrealm” debug=“99”

drivername=“org.gjt.mm.mysql.driver”

connectionurl=“jdbc:mysql://localhost/authority

usertable=“users” usernamecol=“user_name”

usercredcol=“user_pass”

userroletable=“user_roles” rolenamecol=“role_name”/>



manager组件

manager组件用于实现http会话管理的功能(会话持久连接),tomcat6中有5manager的实现

1、standardmanager

默认的会话管理器,用于非集群环境中对单个进入运行状态的tomcat实例会话进行管理,当tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名为session.ser的文件中,并在tomcat下次启动时读取此文件。

2、persistentmanager

当一个会话长时间处于空闲状态时会被写入到swap会话对象,这对于内存资源比较吃紧的应用环境来说比较有用。

3、deltamanager

用于tomcat集群的会话管理器,它通过将改变了会话数据同步给集群中的其他节点实现会话复制,这种实现会将所以会话的改变同步给集群中的每一个节点,也是在集群环境中用的最多的一种实现方式。

4、backupmanager

用于tomcat集群的会话管理器,于deltamanager不同的是,某节点会话的改变只会同步给集群中的另一个而非所有节点。

5、simpletcpreplicationmanager


过时废弃了

server.xml

    <Resource name="UserDatabase" auth="Container"

              type="org.apache.catalina.UserDatabase"

              description="User database that can be updated and saved"

              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

              pathname="conf/tomcat-users.xml" /> 定义账户认证的文件

  </GlobalNamingResources>


   <Connector port="80" protocol="HTTP/1.1” 定义连接器

               connectionTimeout=“20000"

               redirectPort="8443" />


    <Engine name="Catalina" defaultHost="localhost”> 定义引擎名称及默认的host主机


      <!--For clustering, please take a look at documentation at:

          /docs/cluster-howto.html  (simple how to)

          /docs/config/cluster.html (reference documentation) -->

      <!--

      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

      -->


      <!-- Use the LockOutRealm to prevent attempts to guess user passwords

           via a brute-force attack -->

      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <!-- This Realm uses the UserDatabase configured in the global JNDI

             resources under the key "UserDatabase".  Any edits

             that are performed against this UserDatabase are immediately

             available for use by the Realm.  -->

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

               resourceName="UserDatabase"/>

      </Realm>


      <Host name="localhost"  appBase=“webapps" 定义主机信息,app程序位置,此位置相对于安装目录而言

            unpackWARs="true" autoDeploy="true">


        <!-- SingleSignOn valve, share authentication between web applications

             Documentation at: /docs/config/valve.html -->

        <!--

        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

        -->


        <!-- Access log processes all example.

             Documentation at: /docs/config/valve.html

             Note: The pattern used is equivalent to using pattern="common" -->

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory=“logs" 定义阀门,classname定义的内容是域名反过来写

               prefix="localhost_access_log" suffix=".txt"

               pattern="%h %l %u %t &quot;%r&quot; %s %b" />



三、连接器


1、连接器类型

apache反向连接tomcat的方法:

mod_proxy模块

基于ajp连接器方式向后代理

基于http连接器方式向后代理

mod_jk模块

基于ajp连接器方式向后代理

mod_jk2 废弃

2、mod_jk

mod_jk是ASF的一个项目,是一个工作在Apache端基于AJP协议与tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务器端是TOMCAT的AJP连接器)

1、下载安装tomcat-connectors软件包,需要依赖包httpd-devel

2、编译软件包,./configure —with-apxs=/usr/local/apache/bin/apxs


apache要使用mod_jk连接器,需要在启动时加载此连接器模块,为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/extra/http-jk.conf来保存相关指令和设置,内容如下:

#Load the mod-jk

loadmodule jk_module modules/mod_jk.so

jkworkersfile /etc/httpd/extra/workers.properties

jklogfile logs/mod_jk.log

jkloglevel debug

jkmount /* TomcatA url转发设置(也可以理解为重定向)

jkmount /status stat1


workers.properties文件一般由两类指令组成:一个是mod_jk可以连接的各个worker名称列表,二是每个worker的属性配置信息,他们分别遵循如下语法:

worker.list = < a comma separated list of worker names >

worker. <worker name> . <property> = <property value>

其中worker.list可以重复指定多次,而worker name 是tomcat中engine组件jvmroute参数的值。如:


根据前文的指定,这里使用/etc/httpd/extra/workers.properties来定义一个名为TOMCATA的worker,并指定几个属性:

worker.list=tomcata stat1

worker.tomcata.port=8009

worker.tomcata.host=10.40.0.227

worker.tomcata.type=ajp13

worker.tomcata.lbfactor=1

worker.stat1.type = status


为了避免用户之间访问后端tomcat实例,影响负载均衡效果,建议在tomcat7 的各个实例上禁用http/1.1连接器。

为每个tomcat 7 实例的引擎添加jvmroute参数,并通过其为当前引擎设置全局唯一标识符。如下所示,需要注意的是,每个实例的jvmroute的值均不能相同

<engine name=“standalone” defaulthost=“localhost” jvmroute=“tomcata”>


而后去配置apache,修改/etc/httpd/extra/httpd-jk.conf文件:

loadmoudle jk_moudle modules/mod_jk.so

jkworkersfile /etc/httpd/extra/workers.properties

jklogfile logs/mod_jk.log

jkloglevel debug

jkmount /* lbcluster1

jkmount /jkstatus stat1


编辑/etc/httpd/extra/workers.properties,添加一下内容:

worker.list=lbcluster1,stat1

worker.tomcata.type=ajp13

worker.tomcata.host=10.40.0.227

worker.tomcata.port=8009

worker.tomcata.lbfactor = 5

worker.tomcatb.type=ajp13

worker.tomcatb.port=8009

worker.tomcatb.host=10.40.0.226

worker.tomcatb.lbfactor= 6

worker.lbcluster1.type = lb

worker.lbcluster1.sticky_session =  1

worker.lbcluster1.balance_workers = tomcata,tomcatb

worker.stat1.type = status


balance_workers:用于负载均衡模式中的各worker的名称列表,在此处出现的worker名称一定不能在任何worker.list属性列表中定义过,并且worker.list属性中定义的worker名称必须包含负载均衡worker

method:可以设定为R、T、B。默认是R,即根据请求的个数进行调度(roundrobin),T表示根据已经发送给worker的实际流量大小进行调度,B表示根据实际负载情况进行调度。

sticky_session(持久会话,建议不要和method一起使用):在将某请求调度至某worker后,源于此地的所有后续请求都将直接调度至此worker,实现将用户session和某worker绑定,默认值是1,即启用此功能,如果后端的各worker之间支持session复制,则可以将此属性设置为0.

2、mod_proxy

mod_proxy实现反向代理的方法,只需要在httpd.conf的全局配置段或者虚拟主机中添加如下内容:

前提:(加载了proxy_module、proxy_http_module、proxy_ajp_module、proxy_balancer_module)


配置apache代理tomcat(mod_proxy模块方式)


第一种方法基于proxy-http

proxypass /my-webapp http://www.magedu.com:8080/my-webapp

proxypassreverse /my-webapp http://www.magedu.com:8080/my-webapp

proxyvia on


proxyvia on

proxyrequests off

proxypreservehost on

<proxy *>

order deny,allow

allow from all

</proxy>

proxypass / http://10.40.0.229:80

proxypasserverse / http://10.40.0.229:80

<location />

order allow ,deny

all from all

</location>


实现负载均衡效果:必须加装proxy_balancer_module模块

如果proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示:

lbmethod:apache实现负载均衡的调度算法,默认是byrequests(R,轮询),即基于权重将统计请求个数进行调度,bytraffic(T调度)则执行基于权重的流量计数调度,bybusyness(B调度,least_connt,最小连接数调度)通过考量每个后端服务器的当前负载进行调度。

maxattempts:放弃请求前实现故障转移的次数,默认是1,其最大值不应该大于总的节点数

nofailover:取值为on或者off,设置为on时表示后端服务器故障时,用户的session将损坏,因此,在后端服务器不支持session复制时可将其设置为on,所以要想实现会话保持就应该使用off。

stickysession:调度器的sticky session的名字,根据web程序语言的不同,其值为jsessionid或者phpsessinid。是否支持将来自于同一个客户端的请求定向到相同的服务器。要支持就应该依据应用程序开发的语言来设定,如果是java就用jssessionid,如果是php就用phpsessionid。


上述指令除了能在balancer://或者proxypass中设定外,也可以使用proxyset指令直接进行设定,并且要定义在虚拟主机之外。如:

<proxy balancer://hotcluster>

balancermember http://www1.megedu.com:8080 loadfactor=1

balancermember http://www2.megedu.com:8080 loadfactor=2

proxyset lbmethod=bytraffic

</proxy>


实例:

proxyvia on

proxyrequests off

proxypreservehost off

<location /lbmanager-test>

        sethandler balancer-manager

        proxypass !

        order deny,allow

        allow from all

</location>


<proxy balancer://hotcluster>

        balancermember http://10.40.0.229:80 loadfactor=1

        balancermember http://10.40.0.226:80 loadfactor=1

        proxyset lbmethod=byrequests

</proxy>


proxypass / balancer://hotcluster

proxypassreverse / balancer://hotcluster


<proxy * >

        order deny,allow

        allow from all

</proxy>

<location / >

        order allow,deny

        allow from all

</location>


proxypassreverse:用于让apache调整http重定向响应报文中的location、content-location及uri标签所对应的rul,在反向代理中必须使用此指令避免重定向报文绕过proxy服务器。



第二种方法proxy-ajp

proxypass /my-webapp ajp://www.magedu.com:8009/my-webapp

proxypassserverse /my-webapp ajp://www.magedu.com:8009/my-webapp

proxyvia on


proxyvia on

proxyrequests off

proxypreservehost on

<proxy *>

order deny,allow

allow from all

</proxy>

proxypass / ajp://10.40.0.229:8009

proxypasserverse / ajp://10.40.0.229:8009

<location />

order allow ,deny

all from all

</location>


指令说明:

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=value key=value….]:将后端服务器某url与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务上某url路径,使用此指令时必须将proxyrequests的值设置为off,需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。

另外,mod_proxy模块在http2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保存至连接池中以备进一步使用,连接池大小或者其他设定可以通过在proxypass中使用keyvalue的方式定义,常用的可以包括:

min:连接池的最小容量,此值与实际连接个数无关,仅宝石连接池最小要初始化的空间大小

max:连接池的最大容量,每个mpm都有自己独立的容量,此值都与mpm有关,如prefork的总是1,而其他的则取决于threadsperchild指令的值。

loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围是1-100

retry:当apache将请求发送至后端服务器得到错误响应时等待多久以后重试,单位是秒钟。


用于mod_proxy状态信息的输出:此配置需要设置在反向代理配置的前面才行。

<location /lbmanager-test>

sethandler balancer-manager

proxypass !

order deny,allow

allow from all

</location>



本文转自 blackstome 51CTO博客,原文链接:http://blog.51cto.com/137783/1968800,如需转载请自行联系原作者

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3月前
|
Java 关系型数据库 MySQL
Windows用Tomcat发布Java项目
对于云服务器,程序员一般不会陌生,如果项目需要发布到现网,那么服务器是必不可缺的一项硬性条件,那么如何在云服务器上部署一个项目,需要做哪些配置准备,下面就由本文档为大家讲解,本篇以Tomcat服务器发布J2EE项目为例。
47 0
Windows用Tomcat发布Java项目
|
2月前
|
Java 关系型数据库 应用服务中间件
阿里云RDS购买Linux完整过程——安装java环境并跑起来tomcat
阿里云RDS购买Linux完整过程——安装java环境并跑起来tomcat
41 0
|
2月前
|
JavaScript Java 应用服务中间件
centos部署vue项目(java,tomcat环境的搭建)
centos部署vue项目(java,tomcat环境的搭建)
37 0
|
7月前
|
Java 应用服务中间件
《深入理解java虚拟机》——Tomcat类加载器体系结构
《深入理解java虚拟机》——Tomcat类加载器体系结构
|
21小时前
|
Web App开发 Java 应用服务中间件
【Java Web】在 IDEA 中部署 Tomcat
【Java Web】在 IDEA 中部署 Tomcat
7 0
|
1月前
|
Java 应用服务中间件
解决tomcat启动报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对的url [http:java.sun.com/jsp/jstl/core]
解决tomcat启动报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对的url [http:java.sun.com/jsp/jstl/core]
92 1
|
3月前
|
监控 应用服务中间件
idea debug模式启动Tomcat报错:Error running ‘tomcat8‘: java.net.SocketException “socket closed“
idea debug模式启动Tomcat报错:Error running ‘tomcat8‘: java.net.SocketException “socket closed“
|
4月前
|
jenkins Java 应用服务中间件
Jenkins【部署 01】两种方式+两种环境部署最新版本 Jenkins v2.303.2 WAR包(直接使用 java -jar+使用Tomcat的Web端部署)
Jenkins【部署 01】两种方式+两种环境部署最新版本 Jenkins v2.303.2 WAR包(直接使用 java -jar+使用Tomcat的Web端部署)
67 0
|
4月前
|
Java 应用服务中间件 容器
3:Tomcat部署Web项目-Java Web
3:Tomcat部署Web项目-Java Web
57 0
|
4月前
|
缓存 前端开发 安全
细究Java类加载机制和Tomcat类加载机制
细究Java类加载机制和Tomcat类加载机制
24 0