JAVA与Tomcat(续一)

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介:

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,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
11月前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
734 26
|
关系型数据库 Java MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【9月更文挑战第6天】在Linux环境下安装JDK 1.8、Tomcat和MariaDB是搭建Java Web应用的关键步骤。本文详细介绍了使用apt-get安装OpenJDK 1.8、下载并配置Tomcat,以及安装和安全设置MariaDB(MySQL的开源分支)的方法。通过这些步骤,您可以快速构建一个稳定、高效的开发和部署环境,并验证各组件是否正确安装和运行。这为您的Java Web应用提供了一个坚实的基础。
217 0
|
缓存 前端开发 Java
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
164 0
|
Java 应用服务中间件 Windows
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
158 0
|
网络协议 Java 应用服务中间件
Tomcat源码分析 (一)----- 手撕Java Web服务器需要准备哪些工作
本文探讨了后端开发中Web服务器的重要性,特别是Tomcat框架的地位与作用。通过解析Tomcat的内部机制,文章引导读者理解其复杂性,并提出了一种实践方式——手工构建简易Web服务器,以此加深对Web服务器运作原理的认识。文章还详细介绍了HTTP协议的工作流程,包括请求与响应的具体格式,并通过Socket编程在Java中的应用实例,展示了客户端与服务器间的数据交换过程。最后,通过一个简单的Java Web服务器实现案例,说明了如何处理HTTP请求及响应,强调虽然构建基本的Web服务器相对直接,但诸如Tomcat这样的成熟框架提供了更为丰富和必要的功能。
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
246 1
|
jenkins 持续交付 开发工具
"引爆效率革命!Docker+Jenkins+GIT+Tomcat:解锁持续集成魔法,一键部署Java Web应用的梦幻之旅!"
【8月更文挑战第9天】随着软件开发复杂度的增加,自动化变得至关重要。本文通过实例展示如何结合Docker、Jenkins、Git与Tomcat建立高效的持续集成(CI)流程。Docker确保应用环境一致性;Jenkins自动化处理构建、测试和部署;Git管理源代码版本;Tomcat部署Web应用。在Jenkins中配置Git插件并设置项目,集成Docker构建Tomcat应用镜像并运行容器。此外,通过自动化测试、代码质量检查、环境隔离和日志监控确保CI流程顺畅,从而显著提高开发效率和软件质量。
212 3
|
Java 关系型数据库 MySQL
杨校老师课堂之Java项目部署到云端服务器之安装MySQL、Jdk、Tomcat
杨校老师课堂之Java项目部署到云端服务器之安装MySQL、Jdk、Tomcat
199 0
杨校老师课堂之Java项目部署到云端服务器之安装MySQL、Jdk、Tomcat
|
Java 应用服务中间件 Apache
安装和配置Apache Tomcat是部署Java Web应用程序的常见任务
安装和配置Apache Tomcat是部署Java Web应用程序的常见任务
374 7
|
Java 应用服务中间件 Linux
什么是tomcat, tomcat该如何使用?(java)
什么是tomcat, tomcat该如何使用?(java)
330 1