1、JAVA相关介绍 2、Tomcat介绍及安装部署 3、Tomcat配置 4、tomcat自带工具使用 5、tomcat架构 7、部署LNMT 8、部署LAMT 9、实现Tomcat负载均衡的实现 1、Nginx负载均衡Tomcat 2、Apache负载均衡Tomcat 1、Apache作为负载均衡器的构建方案 2、Apache负载均衡配置指令解释 3、Apache作为负载均衡器(第一种方法 --> http协议) 1、Tomcat节点配置(两个节点都进行配置) 2、Apache配置 3、实现session绑定 4、mod_proxy_balancer模块的管理功能 5、配置文件示例(Apache完整配置示例) 4、Apache作为负载均衡器(第二种方法 --> ajp协议) 5、Apache作为负载均衡器(第三种方法 --> 使用mod_jk模块) 10、Tomcat实现Session Cluster 11、编译memcached php使用memecached Nginx使用memecached (马哥文档) 12、Tomcat将会话保存到memcached (session server) 13、JVM java虚拟机 14、tomcat优化(马哥文档) ================================================================================================================================================ JAVA 相关介绍 1、Tomcat是Apache软件基金会的一个项目,实现了对JavaServer Page的支持,由于其本身具有独立HTTP服务功能,所以Tomcat可被视为一个独立的Web服务器。 2、Servlet Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内 容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。 3、JAVA编程语言 特点:跨平台、面向对象、范型编程。 发展简介: 1990年 詹姆斯·高斯林开发出JAVA的雏形Oak,1995年5月以JAVA命名正式发布。JAVA不同于编译型语言,在JAVA中,先将代码编译为字节码,然后依靠运行于 不同平台的JAVA虚拟机进行运行。即可以"一处编译,到处运行。",是一种应用级的开发语言。 1996年 JDK(Java Development Kit)JAVA开发工具箱,其中包含一个能够运行JAVA的虚拟机JVM 1997年 JDK 1.0,JAR文档格式、JDBC、JavaBeans 1998年 JDK 1.2,Sun将Java分拆为三个方向:J2SE{Java2 Standard Edition}、J2EE{Enterprise Edition}、J2ME{Mobile Edition} SE、EE、ME之间只是包含的类库的不同。 JIT编译器,Just In Time,即时编译器 1999年 JDK 1.3 HostSpot虚拟机 2002年 JDK 1.4 2006年 SUN 在 JavaOne 公布 Java 开放源代码项目,{JDK6}并推出OpenJDK7项目。Java虚拟机、Java编译器和Java类库以GNU通用公共许可证公开。 ..... 2016年 JDK1.9 4、JAVA虚拟机 运行JAVA字节码(JAVA Bytecode)的的虚拟机,最早由太阳微系统所研发并实现第一个实现版本。是JAVA平台的一部分,能够运行编程语言开发 的程序。 事实上并不是只有JAVA语言开发的应用程序运行在JAVA虚拟机上,只要生成的编译文件格式满足虚拟机对载入文件的文件格式,就可以执行。 JVM PVM 5、ABI(application binary interface),ABI包含的信息包含: 数据类型的size, layout和对齐等 调用约定() 应用程序调用system call的方式 如果是完成的操作系统ABI,还要包括object 文件的二进制格式、程序library等 6、动态站点 开发语言: asp jsp (JAVA编程语言中的一个类) Python (Django) PHP 程序运行方式: 客户端动态 服务器端动态 7、JAVA体系结构 JAVA编程语言 JAVA Class文件格式 JAVA API JAVA VM:类加载器、执行引擎 8、JDK Java Development Kit,提供了JAVA编程的API、JAVA编译器、JAVA虚拟机,是一组软件开发工具包(SDK,Software development kit)。其开源 版本有OpenJDK、Harmony。 9、JSP Java Server Pages,使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。JSP被JSP编译器编译成Java Servlets。一个JSP编译器可以把JSP编译成JAVA代码写的servlet然后再由JAVA编译器来编译成机器码,也可以直接编译成二进制码。 10、JAVA 2 EE J2EE{Enterprise Edition},J2EE中包含了J2SE,此外还有Servlet、JSP、EJB、JMS、JMX、JAVAMail JAVA 2 EE 中包括的组件和技术: Applet # Java Applet EJB # 企业级JavaBean(Enterprise Java Beans)JAVA相关的诸多高级功能的实现,如RMI(Remote Method Invocation), 对象/关系映射,跨越多个数据源的分布式事务等 JAAS # Java Authentication and Authorization Service JACC # J2EE Authorization Contract for Containers JAF # Java Beans Activation Framework JAX-RPC # Java API for XML-Based Remote Procedure Calls JAX-WS # Java API for XML Web Services JAXM # Java API for XML Messaging JAXP # Java XML解析API(Java API for XML Processing) JAXR # Java API for XML Registries JCA # J2EE连接器架构(J2EE Connector Architecture) JDBC # Java数据库联接(Java Database Connectivity) JMS # Java消息服务(Java Message Service)高性能异步消息服务,实现JAVA EE应用程序与非JAVA程序的"透明"通信 JMX # Java Management 在程序运行时对其进行交互式监控和管理的机制 JNDI # Java名称与目录接口(Java Naming and Directory Interface) JSF # Java Server Faces *JSP # Java服务器页面(Java Server Pages) JSTL # Java服务器页面标准标签库(Java Server Pages Standard Tag Library) JTA # Java事务API(Java Transaction API)允许应用程序在自身的一个或多个组件中平滑地处理错误的机制 JavaMail # 通过工业标准的POP/SMTP/IMAP协议发送和接收邮件的机制 *Servlet # Java Servlet API StAX # Streaming APIs for XML Parsers WS # Web Services 11、Servlet Contaier JSP是Servlt的前端,JSP是JAVA编程语言的一个特殊类库,能够让JAVA代码内嵌到HTML文件中。Servlet能够理解客户端发来的http请求, 并调用JDK运行代码。 Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数 据,生成动态Web内容。Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。 Servlet 与 JSP 的关系: 12、Web Contaier JDK、Servlet{类库}、JSP 13、Web Contaier的实现 WebSphere WebLogic Oc4j Glassfish Geronimi JonAS JBoss 开源实现: Tomcat Jetty Resin ================================================================================================================================================ Tomcat介绍及安装部署 1、Sun公司创建了第一个Servlet容器,即Java Web Server,但JWS只是为了演示Servlet的相应功能,所以其很不稳定。与此同时,ASF创建了JServ项目,一个 能够与apache整合起来的servlet容器。1999年,Sun把JWS捐给了ASF,于是两个项目合二为一,即今天Tomcat的前身。第一个tomcat版本是Tomcat 3.x系列, 而发布于2001年Tomcat4.0则是在此前基础上进行了重新设计和实现,其代码项目被命名为Catalina。 2、Tomcat实现了JACA 2 EE 众多 API 当中的 Servlet、JSP、JMX。是JAVA 2 EE平台的一个不完整实现。Tomcat也是可以作为一个独立的WEB服务器。Tomcat也 是使用JAVA语言开发。 3、Tomcat核心组件 Catalina 是Tomcat的servlet容器,实现了Sun Microsystems对Servlet和JavaServer Pages(JSP)的规范。 Coyote 这允许Catalina,名义上是一个Java Servlet或JSP容器,也可以作为一个简单的Web服务器,它将本地文件作为HTTP文档提供服务。 Jasper JSP引擎,Jasper检测到对JSP文件的更改并重新编译它们 Cluster 集群负载均衡 High availability 高可用性。通过在主端口上升级主服务器时将实时流量请求分派到不同端口上的临时服务器来完成的。在处理高流量Web应用程序的用户请求时非常有用。 Web application 用户以及基于系统的Web应用程序增强功能 4、Tomcat组成结构 Server 一个tomcat实例。Tomcat Instance,运行中的tomcat进程 Engine tomcat核心组件,用于运行jsp或servlet代码。一个engine内可以有多个主机 Connector 连接器,接受并解析用户请求,将请求映射为Engine中运行的代码,之后将运行结果构建为响应报文。支持http、ajp协议。连接器 可以有多个,接收不同的请求,或者接收不同端口发来的请求。 Service 将连接器和引擎关联起来。将连接器关联至engine,一个service只能包含一个engine组件,可以包含一个或多个连接器 Host 类似于httpd中的虚拟主机。只可以基于主机名的 "虚拟主机" context 主机上下文 Tomcat的核心组件:server.xml # tomcat容器 # 定义服务 ... ... ... ... 每一个组件都由一个Java"类"实现,这些组件大体可分为以下几个类型: 顶级组件:Server 服务类组件:Service 连接器组件:http, https, ajp(apache jserv protocol) 容器类:Engine, Host, Context 被嵌套类:valve, logger, realm, loader, manager, ... 集群类组件:listener, cluster, ... 5、Tomcat运行模式 Standalone # 单独接受请求。通过内置的Web server (http connector)来接收客户端请求 反向代理模型 # 由专用的web服务器httpd或者nginx接收请求,web服务器再将请求代理到tomcat。反向代理服务器可以实现动静分离的效果 web和tomcat分离运行模型 # web和tomcat分离 6、Tomcat和JDK安装 1、yum安装 yum install java-1.8.0-openjdk yum install tomcat {tomcat-admin-webapps.noarch 管理工具 tomcat-docs-webapp.noarch tomcat帮助手册 tomcat-webapps.noarch tomcat示例应用} 2、包安装 apache-tomcat-8.5.23.tar.gz jdk-8u152-linux-x64.rpm 1、Oracle JDK安装 # 下载安装相应的安装包 # 安装jdk rpm -ivh jdk-8u152-linux-x64.rpm # 查看安装文件 ls -l /usr/java/jdk1.8.0_152 /usr/java/jdk1.8.0_152/bin/ # 二进制程序目录 /usr/java/jdk1.8.0_152/bin/javac # java编译器 /usr/java/jdk1.8.0_152/bin/java # java虚拟机 /usr/java/jdk1.8.0_152/db/ # 数据库访问相关的脚本或类库 /usr/java/jdk1.8.0_152/db/lib # 类库 /usr/java/jdk1.8.0_152/include # 头文件 /usr/java/jdk1.8.0_152/jre # 运行时环境 /usr/java/jdk1.8.0_152/lib # 类库 # 要配置JAVA_HOME环境变量,指向java的安装路径 vim /etc/profile.d/java.sh export JAVA_HOME=/usr/java/latest export PATH=$JAVA_HOME/bin:$PATH # 查看JAVA版本信息 java -version 2、编译好的 tomcat 包安装 # 解压至指定目录 tar -xf apache-tomcat-8.5.23.tar.gz -C /usr/local/ # 创建软链接 ln -sv apache-tomcat-8.5.23/ tomcat # tomcat程序环境:tomcat的目录结构 bin:脚本,及启动时用到的类 conf:配置文件目录 lib:库文件,Java类库,jar logs:日志文件目录 temp:临时文件目录 webapps:webapp的默认目录 work:工作目录,存放编译后的字节码文件 # 导出tomcat环境变量 vim /etc/profile.d/tomcat.sh export CATALINT_HOME=/usr/local/tomcat export PATH=$CATALINT_HOME/bin:$PATH # /usr/local/tomcat/bin/catalina.sh脚本 debug Start Catalina in a debugger debug -security Debug Catalina with a security manager jpda start Start Catalina under JPDA debugger run 当前窗口运行,而不在后台运行 run -security 使用安全管理器启动 start Start Catalina in a separate window start -security Start in a separate window with security manager stop Stop Catalina, waiting up to 5 seconds for the process to end stop n 等待n秒后,停止tomcat stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running stop n -force 等待n秒后,将强制停止tomcat configtest 检查server.xml配置文件有没有语法错误 version What version of tomcat are you running? # useradd tomcat chown -R root.tomcat ./* chown -R tomcat:tomcat ./{conf,log.....} # 启动 ./catalina.sh start # 访问tomcat 172.18.26.1:8080 ================================================================================================================================================ Tomcat配置 1、配置文件 server.xml # 主配置文件。tomcat实例的配置文件 web.xml # 每个webapp只有"部署"后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps 提供默认部署相关的配置。 context.xml # 每个webapp都可以使用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所 有的webapps提供默认配置 tomcat-users.xml # 用户认证的账号和密码文件;角色(role),用户(User);此文件在tomcat启动时被装入内存 catalina.policy # 当使用-security选项启动tomcat时,用于为tomcat设置安全策略 catalina.properties # Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数 logging.properties # 日志系统相关的配置 tomcat.conf # tomcat在JVM中运行的一些参数配置。{或者在 /etc/sysconfg/tomcat文件中 },二进制安装的配置在catalina.sh文件中 2、JAVA WebAPP的组织结构 有特定的组织形式,层次型的目录结构,主要包括了servlet代码文件,JSP页面文件、类文件、部署描述符文件等。 /usr/local/tomcat/webapps/app # webapps/app 是webapp的根目录 WEB-INF / # 当前webapp的私有资源目录,通常存放当前webapp自用的web.xml META-INF/ # 当前webapp的私有资源目录,通常存放当前webapp自用的context.xml classes/ # 此webapp的私有类 lib/ # 此webapp的私有类,被打包为jar格式类 index.jsp # webapp的主页 ROOT/ # 主站点应用文件放置目录 webapp归档格式: .war # webapp格式 .jar # EJB的类 .rar # 资源适配器 .ear # 企业级应用程序 3、server.conf 配置文件 # Server实例的管理端口,使用 telnet 127.0.0.1 8005 执行SHUTDOWN可以关闭实例 # 侦听器,侦听资源是否发生改变 # 定义全局命名格式 # 定义service组件 # 另外一个连接器AJP Apache Jserv protocol,二进制协议 # 定义引擎段及虚拟主机 # autoDeploy="true"表示是否支持自动部署 4、各组件配置 1、Tomcat实例配置 [Server] 这会让Tomcat6启动一个server实例(即一个JVM),它监听在8005端口以接收shutdown命令。各Server的定义不能使用同一个端口,这意味着如果在同一个 物理机上启动了多个Server实例,必须配置它们使用不同的端口。这个端口的定义用于为管理员提供一个关闭此实例的便捷途径,因此,管理员可以直接 telnet至此端口使用SHUTDOWN命令关闭此实例。不过,基于安全角度的考虑,这通常不允许远程进行。 Server的相关属性: className: 用于实现此Server容器的完全限定类的名称,默认为org.apache.catalina.core.StandardServer port: 接收shutdown指令的端口,默认仅允许通过本机访问,默认为8005,-1表示不监听端口 shutdown:发往此Server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN,建议将shutdown的值设置为随机字符 2、将连接器和引擎关联起来 [Service] Service主要用于关联一个引擎和与此引擎相关的连接器,每个连接器通过一个特定的端口和协议接收入站请求交将其转发至关联的引擎进行处理。 困此,Service要包含一个引擎、一个或多个连接器。 如上面示例中的定义: 这定义了一个名为Catalina的Service,此名字也会在产生相关的日志信息时记录在日志文件当中。 Service相关的属性: className: 用于实现service的类名,一般都是org.apache.catalina.core.StandardService。 name:此服务的名称,默认为Catalina; 3、连接器配置 [Connector] 进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类: 1.Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等; 2.Tomcat作为独立服务器:请求来自于web浏览器; Tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个引擎可以有一个或多个连接器,以适应多种请求方式。 定义连接器可以使用多种属性,有些属性也只适用于某特定的连接器类型。一般说来,常见于server.xml中的连接器类型通常有4种: 1) HTTP连接器 2) SSL连接器 3) AJP 1.3连接器 4) proxy连接器 如上面示例server.xml中定义的HTTP连接器: 定义连接器时可以配置的属性非常多,但通常定义HTTP连接器时必须定义的属性只有"port",定义AJP连接器时必须定义的属性只有"protocol",因为默认的协议为HTTP。 以下为常用属性的说明: 1) address:指定连接器监听的地址,默认为所有地址,即0.0.0.0; 2) maxThreads:支持的最大并发连接数,默认为200; 3) port:监听的端口,默认为0; 4) protocol:连接器使用的协议,默认为HTTP/1.1,定义AJP协议时通常为AJP/1.3; 5) redirectPort:如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口; 6) connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为60000,即1分钟; 7) enableLookups:是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名;默认为true; 8) acceptCount:设置等待队列的最大长度;通常在tomcat所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中; 9) sslProtocol="TLS" 使用的SSL协议 下面是一个定义了多个属性的SSL连接器: 4、核心组件执行JSP代码的 [Engine] Engine是Servlet处理器的一个实例,即servlet引擎,默认为定义在server.xml中的Catalina。Engine需要defaultHost属性来为其定义一个接收所有发往 非明确定义虚拟主机的请求的host组件。如前面示例中定义的: 常用的属性定义: defaultHost:Tomcat支持基于FQDN的虚拟主机,这些虚拟主机可以通过在Engine容器中定义多个不同的Host组件来实现;但如果此引擎的连接器收到一个发往 非非明确定义虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此,在Engine中定义的多个虚拟主机的主机名称中至少要有一个跟 defaultHost定义的主机名称同名; name:Engine组件的名称,用于日志和错误信息记录时区别不同的引擎; Engine容器中可以包含Realm、Host、Listener和Valve子容器。 5、虚拟主机 Host 位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面示例中的定义: 常用属性说明: 1) appBase:此Host的webapps目录,即存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可以使用基于$CATALINA_HOME的相对路径; 2) autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true; 3) unpackWars:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true; 虚拟主机实例配置: 主机别名定义: 如果一个主机有两个或两个以上的主机名,额外的名称均可以以别名的形式进行定义,如下: magedu.com 6、Context组件 Context在某些意义上类似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个Web应用程序;如下面的定义: 在Tomcat6中,每一个context定义也可以使用一个单独的XML文件进行,其文件的目录为$CATALINA_HOME/conf//。可以用于Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。 常用的属性定义有: 1) docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;切记,docBase的路径名不 能与相应的Host中appBase中定义的路径名有包含关系,比如,如果appBase为deploy,而docBase绝不能为deploy-bbs类的名字; 2) path:相对于Web服务器根路径而言的URI;如果为空" ",则表示为此webapp的根路径;如果context定义在一个单独的xml文件中,此属性不需要定义; 3) reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false; 7、Valve组件: Valve类似于过滤器,它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器内可以建立多个Valve, 而且Valve定义的次序也决定了它们生效的次序。Tomcat6中实现了多种不同的Valve: AccessLogValve:访问日志Valve ExtendedAccessValve:扩展功能的访问日志Valve JDBCAccessLogValve:通过JDBC将访问日志信息发送到数据库中; RequestDumperValve:请求转储Valve; RemoteAddrValve:基于远程地址的访问控制; RemoteHostValve:基于远程主机名称的访问控制; SemaphoreValve:用于控制Tomcat主机上任何容器上的并发访问数量; JvmRouteBinderValve:在配置多个Tomcat为以Apache通过mod_proxy或mod_jk作为前端的集群架构中,当期望停止某节点时,可以通过此Valve将用记请求定 向至备用节点;使用此Valve,必须使用JvmRouteSessionIDBinderListener; ReplicationValve:专用于Tomcat集群架构中,可以在某个请求的session信息发生更改时触发session数据在各节点间进行复制; SingleSignOn:将两个或多个需要对用户进行认证webapp在认证用户时连接在一起,即一次认证即可访问所有连接在一起的webapp; ClusterSingleSingOn:对SingleSignOn的扩展,专用于Tomcat集群当中,需要结合ClusterSingleSignOnListener进行工作; RemoteHostValve和RemoteAddrValve可以分别用来实现基于主机名称和基于IP地址的访问控制,控制本身可以通过allow或deny来进行定义,这有点类似于Apache的 访问控制功能;如下面的Valve则实现了仅允许本机访问/probe: 访问日志记录: 其中相关属性定义有: 1) className:相关的java实现的类名,相应于分别应该为org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve; 2) allow:以逗号分开的允许访问的IP地址列表,支持正则表达式,因此,点号“.”用于IP地址时需要转义;仅定义allow项时,非明确allow的地址均被deny; 3) deny: 以逗号分开的禁止访问的IP地址列表,支持正则表达式;使用方式同allow; 8、Realm 组件 一个Realm表示一个安全上下文,它是一个授权访问某个给定Context的用户列表和某用户所允许切换的角色相关定义的列表。因此,Realm就像是一个用户和组相 关的数据库。定义Realm时惟一必须要提供的属性是classname,它是Realm的多个不同实现,用于表示此Realm认证的用户及角色等认证信息的存放位置。 JAASRealm:基于Java Authintication and Authorization Service实现用户认证; JDBCRealm:通过JDBC访问某关系型数据库表实现用户认证; JNDIRealm:基于JNDI使用目录服务实现认证信息的获取; MemoryRealm:查找tomcat-user.xml文件实现用户信息的获取; UserDatabaseRealm:基于UserDatabase文件(通常是tomcat-user.xml)实现用户认证,它实现是一个完全可更新和持久有效的MemoryRealm,因此能够跟标准的 MemoryRealm兼容;它通过JNDI实现; 下面是一个常见的使用UserDatabase的配置: 下面是一个使用JDBC方式获取用户认证信息的配置: ================================================================================================================================================ 手动添加一个测试应用程序 1、创建webapp的目录结构 cd /usr/local/tomcat/webapps mkdir myapp mkdir myapp/{lib,classes,WEB-INF,META-INF} -pv 2、创建测试页 vim index.jsp <%@ page language="java" %> <%@ page import="java.util.*" %> JSP Test Page <% out.println("Hello World."); %> 3、部署webapp deploy:将webapp的源文件放置于目标目录,配置tomcat服务器能够基于context.xml文件中定义的路径来访问此webapp 两种方式: 自动部署: 手动部署: 冷部署:将服务停止,将wepapp的复制到指定位置,然后启动tomcat 热部署:部署工具,manager、tcp(tomcat client deployer)等工具 undeploy:反部署,停止webapp,并从tomcat示例中拆除文件和部署名 stop:停止,不提供服务。但没有拆除web应用,仅仅是不提供服务 start:启动处于停止状态的webapp redeplay:重新部署 ================================================================================================================================================ tomcat自带工具使用 实时修改,tomcat重启,配置全部失效。 1、Manage APP使用 {应用程序管理器} 1、管理角色 请注意,对于Tomcat 7,使用管理器应用程序所需的角色已从单个管理器角色更改为以下四个角色。您将需要分配您希望访问的功能所需的角色: manager-gui 允许访问HTML GUI和状态页面 manager-script 允许访问文本界面和状态页面 manager-jmx 允许访问JMX代理和状态页面 manager-status 仅允许访问状态页面 2、启用管理权限 # 添加角色 vim /usr/local/tomcat/conf/tomcat-users.xml # 配置允许访问 vim /usr/local/tomcat/webapps/manager/META-INF/context.xml # 允许访问 # 重新启动tomcat catalina.sh stop catalina.sh start 2、Host Manager 管理虚拟主机 1、配置允许访问权限 vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml 2、添加角色 vim /usr/local/tomcat/conf/tomcat-users.xml 3、重新启动tomcat catalina.sh stop catalina.sh start ================================================================================================================================================ tomcat架构(马哥文档) Tomcat的架构: Tomcat 6支持Servlet 2.5和JSP 2.1的规范,它由一组嵌套的层次和组件组成,一般可分为以下四类: 顶级组件:位于配置层次的顶级,并且彼此间有着严格的对应关系; 连接器:连接客户端(可以是浏览器或Web服务器)请求至Servlet容器, 容器:包含一组其它组件; 被嵌套的组件:位于一个容器当中,但不能包含其它组件; 各常见组件: 1、服务器(server):Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。 2、服务(service):一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。给服务命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情下只为一个service指派一个server。 连接器类组件: 3、连接器(connectors):负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2连接器。 容器类组件: 4、引擎(Engine):引擎通是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。 5、主机(Host):主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件。 6、上下文(Context):Context组件是最内层次的组件,它表示Web应用程序本身。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。 被嵌套类(nested)组件: 这类组件通常包含于容器类组件中以提供具有管理功能的服务,它们不能包含其它组件,但有些却可以由不同层次的容器各自配置。 7、阀门(Valve):用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。Valve可以定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。 8、日志记录器(Logger):用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。日志记录的功能可被继承,因此,一个引擎级别的Logger将会记录引擎内部所有组件相关的信息,除非某内部组件定义了自己的Logger组件。 9、领域(Realm):用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过Realm来实现。Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍及整个引擎或顶级容器,因此,一个容器内的所有应用程序将共享用户资源。同时,Realm可以被其所在组件的子组件继承,也可以被子组件中定义的Realm所覆盖。 引擎(Engine):引擎是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它从HTTPconnector接收请求并响应请求。它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。 Tomcat连接器架构: 基于Apache做为Tomcat前端的架构来讲,Apache通过mod_jk、mod_jk2或mod_proxy模块与后端的Tomcat进行数据交换。而对Tomcat来说,每个Web容器实例都有一个Java语言开发的连接器模块组件,在Tomcat6中,这个连接器是org.apache.catalina.Connector类。这个类的构造器可以构造两种类别的连接器:HTTP/1.1负责响应基于HTTP/HTTPS协议的请求,AJP/1.3负责响应基于AJP的请求。但可以简单地通过在server.xml配置文件中实现连接器的创建,但创建时所使用的类根据系统是支持APR(Apache Portable Runtime)而有所不同。 APR是附加在提供了通用和标准API的操作系统之上一个通讯层的本地库的集合,它能够为使用了APR的应用程序在与Apache通信时提供较好伸缩能力时带去平衡效用。 同时,需要说明的是,mod_jk2模块目前已经不再被支持了,mod_jk模块目前还apache被支持,但其项目活跃度已经大大降低。因此,目前更常用 的方式是使用mod_proxy模块。 如果支持APR: 1、HTTP/1.1:org.apache.coyote.http11.Http11AprProtocol 2、AJP/1.3:org.apache.coyote.ajp.AjpAprProtocol 如果不支持APR: HTTP/1.1: org.apache.coyote.http11.Http11Protocol AJP/1.3: org.apache.jk.server.JkCoyoteHandler 连接器协议: Tomcat的Web服务器连接器支持两种协议:AJP和HTTP,它们均定义了以二进制格式在Web服务器和Tomcat之间进行数据传输,并提供相应的控制命令。 AJP(Apache JServ Protocol)协议: 目前正在使用的AJP协议的版本是通过JK和JK2连接器提供支持的AJP13,它基于二进制的格式在Web服务器和Tomcat之间传输数据,而此前的版本AJP10和AJP11则使用文本格式传输数据。 HTTP协议:诚如其名称所表示,其是使用HTTP或HTTPS协议在Web服务器和Tomcat之间建立通信,此时,Tomcat就是一个完全功能的HTTP服务器,它需要监听在某端口上以接收来自于商前服务器的请求。 ================================================================================================================================================ 测试配置示例 1、配置虚拟主机 1、提供配置 vim /usr/local/tomcat/conf/server.conf 2、提供应用文件 # 创建目录 mkdir -pv /data/{webapps,logs} mkdir webmyapps/{lib,classes,WEB-INF,META-INF} -pv # 创建测试页 vim index.jsp <%@ page language="java" %> <%@ page import="java.util.*" %> JSP Test Page <% out.println("Hello World."); %> 2、一个虚拟主机内配置多个context,商城站点应用实践 $ cd /data/webapps $ mkdir ROOT $ mv classes/ index.jsp lib/ META-INF/ WEB-INF/ ROOT/ $ vim /usr/local/tomcat/conf/server.xml $ cp -a shopxx-3.0Beta/ /data/webapps/ $ ln -sv shopxx-3.0Beta/ shopabc $ http://web1.xuekaixin.com:8080/shopabc/install/ # 安装MariaDB systemctl start mariadb # 创建数据库用户 GRANT ALL ON shopxx.* TO shopuser@'127.0.0.1' IDENTIFIED BY 'shopuserpadd'; FLUSH PRIVILEGES; 3、控制某个IP禁止访问某个webapp ================================================================================================================================================ 部署LNMT 1、安装Nginx yum install nginx 2、修改配置 location / { proxy_pass http://172.18.26.1:8080/; } 3、动静分离 server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; index index.jsp index.html include /etc/nginx/default.d/*.conf; index index.jsp index.html; location / { } location ~* \.(jsp|do)$ { proxy_pass http://web1.xuekaixin.com:8080; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } ================================================================================================================================================ 部署LAMT 1、Apache作为代理,可以使用http connector 和 ajp connector 和 Tomcat 通信。 2、Apache支持的模块 proxy_module (shared) # 代理主模块 proxy_ajp_module (shared) # 基于ajp协议和后端服务器通信 proxy_balancer_module (shared) proxy_connect_module (shared) proxy_express_module (shared) proxy_fcgi_module (shared) proxy_fdpass_module (shared) proxy_ftp_module (shared) proxy_http_module (shared) # 基于http协议和后端服务器通信 proxy_scgi_module (shared) proxy_wstunnel_module (shared) 3、创建apache虚拟主机 ServerName web1.xuekaixin.com #DocumentRoot /path/to/file ProxyVia On # 是否返回给客户端告知请求是由apache代理的头部信息。On表示启用。添加一个首部例如:via: web1.xuekaixin.com ProxyRequests Off # 是否开启正向代理 ProxyPreserveHost On # 是否在向后端服务器请求时添加请求的主机名(基于主机名代理) Require all granted ProxyPass /status ! # 对/status的URL不进行反向代理 ProxyPass / http://172.18.26.1:8080/ ProxyPassReverse / http://172.18.26.1:8080/ Require all granted 4、使用ajp协议进行反向代理 ServerName web1.xuekaixin.com ProxyVia On # {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off, 即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号 信息;Block表示每个代理请求报文中的Via:都会被移除 ProxyRequests Off # 是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置 了ProxyPass,则必须将ProxyRequests设置为Off ProxyPreserveHost On # 如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反 向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。 Require all granted ProxyPass / http://172.18.26.1:8009/ # 将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务 器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设 置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。 ProxyPassReverse / http://172.18.26.1:8009/ Require all granted ================================================================================================================================================ 实现Tomcat负载均衡的实现 1、Nginx负载均衡Tomcat 2、Apache负载均衡Tomcat 1、Apache作为负载均衡器的构建方案 2、Apache负载均衡配置指令解释 3、Apache作为负载均衡器(第一种方法 --> http协议) 1、Tomcat节点配置(两个节点都进行配置) 2、Apache配置 3、实现session绑定(基于coolie绑定的方式调度) 4、mod_proxy_balancer模块的管理功能 5、配置文件示例(Apache完整配置示例) 4、Apache作为负载均衡器(第二种方法 --> ajp协议) 5、Apache作为负载均衡器(第三种方法 --> 使用mod_jk模块) 1、Nginx负载均衡Tomcat 1、安装JDK 2、导出tomcat环境变量 3、tomcat配置虚拟主机 $ mkdir -pv /data/webapps/ROOT $ mkdir /data/logs $ vim /usr/local/tomcat/conf/server.conf $ mkdir -pv /data/webapps/ROOT/{lib,classes,META-INF,WEB-INF} $ vim /data/webapps/ROOT/index.jsp vim index.jsp <%@ page language="java" %> <%@ page import="java.util.*" %> JSP web1 Test Page <% out.println("Hello World."); %> $ curl http://node1.xuekaixin.com:8080 4、同样的步骤配置另外一个tomcat节点 5、修改tomcat的默认主机为ModeN.xuekaixin.com 6、配置Nginx upstream tomcatser { server node1.xuekaixin.com:8080; server node2.xuekaixin.com:8080; } server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } location ~* \.(jsp|do)$ { proxy_pass http://tomcatser; } } 7、修改反向代理服务器主机名解析 172.18.26.2 node1.xuekaixin.com 172.18.26.3 node2.xuekaixin.com 8、实现会话绑定 upstream tomcatser { ip_hash; server node2.xuekaixin.com:8080; server node1.xuekaixin.com:8080; } 2、Apache负载均衡Tomcat 1、使用Apache的mod_proxy_balancer模块作负载均衡。Apache作为负载均衡器的构建方案: 1、Apache:mod_proxy、mod_proxy_http、mod_proxy_balancer Tomcat:http connector 2、Apache:mod_proxy、mod_proxy_ajp、mod_proxy_balancer Tomcat:ajp connector 3、Apache:mod_jk TOmcat:ajk connector 代理、负载均衡、会话保持 2、Apache负载均衡配置指令解释 ServerName web1.xuekaixin.com ProxyVia On # {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off, 即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号 信息;Block表示每个代理请求报文中的Via:都会被移除 ProxyRequests Off # 是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置 了ProxyPass,则必须将ProxyRequests设置为Off ProxyPreserveHost On # 如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反 向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。 Require all granted ProxyPass / http://172.18.26.1:8009/ # 将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务 器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设 置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。 ProxyPassReverse / http://172.18.26.1:8009/ # 用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL, 在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器。 Require all granted 配置指令含义: ProxyPass [path] !|url [key=value key=value] 2.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:调度器的sticky session的名字,根据web程序语言的不同,其值为 JSESSIONID 或 PHPSESSIONID。 status: 示例:status=D D表示标记为不可用 H表示备用模式 上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,如:ProxySet lbmethod=bytraffic 3、Apache作为负载均衡器(第一种方法 --> http协议) 1、Tomcat节点配置(两个节点都进行配置) $ vim /usr/local/tomcat/conf/server.conf # jvmRoute="TomcatA",后端服务器的ID标识 $ vim /data/webapps/ROOT/index.jsp <%@ page language="java" %> TomcatA

node1.xuekaixin.com

<% session.setAttribute("xuekaixin.com","xuekaixin.com"); %>
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>
2、Apache配置 1、vim /etc/httpd/conf.d/vistualhost.conf BalancerMember http://172.18.26.2:8080 loadfactor=10 route=TomcatA BalancerMember http://172.18.26.3:8080 loadfactor=10 route=TomcatB ServerName web1.xuekaixin.com ProxyVia On ProxyRequests Off ProxyPreserveHost On Require all granted ProxyPass / balancer://lbcluster1/ ProxyPassReverse / hbalancer://lbcluster1/ Require all granted 3、实现session绑定(基于coolie绑定的方式调度) vim /etc/httpd/conf.d/vistualhost.conf Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED # 给Set-Cookie首部的值替换为调度的后端服务器的唯一ID BalancerMember http://172.18.26.2:8080 loadfactor=10 route=TomcatA # route表示映射到后端的那个服务器 BalancerMember http://172.18.26.3:8080 loadfactor=10 route=TomcatB ProxySet stickysession=ROUTEID ServerName web1.xuekaixin.com ProxyVia On ProxyRequests Off ProxyPreserveHost On Require all granted ProxyPass / balancer://lbcluster1/ ProxyPassReverse / balancer://lbcluster1/ Require all granted 4、mod_proxy_balancer模块的管理功能 SetHandler balancer-manager Proxypass ! Order Deny,Allow Allow from all X.X.X.X 5、配置文件示例(Apache完整配置示例) Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED BalancerMember http://172.18.26.2:8080 loadfactor=10 route=TomcatA BalancerMember http://172.18.26.3:8080 loadfactor=10 route=TomcatB ProxySet stickysession=ROUTEID ServerName web1.xuekaixin.com ProxyVia On ProxyRequests Off ProxyPreserveHost On Require all granted ProxyPass / balancer://lbcluster1/ ProxyPassReverse / balancer://lbcluster1/ Require all granted SetHandler balancer-manager Proxypass ! # 表示不反向代理 Require all granted 4、Apache作为负载均衡器(第二种方法 --> ajp协议) 使用ajp模块进行负载均衡并实现session绑定 BalancerMember ajp://172.18.26.2:8009 loadfactor=10 route=TomcatA BalancerMember ajp://172.18.26.3:8009 loadfactor=10 route=TomcatB ProxySet stickysession=ROUTEID ServerName web1.xuekaixin.com ProxyVia On ProxyRequests Off ProxyPreserveHost On Require all granted ProxyPass / balancer://lbcluster1/ ProxyPassReverse / balancer://lbcluster1/ Require all granted 5、Apache作为负载均衡器(第三种方法 --> 使用mod_jk模块) 1、模块介绍 mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。 2、下载模块源码包 tomcat-connectors-1.2.42-src.tar.gz 3、编译安装模块 tar -xf tomcat-connectors-1.2.42-src.tar.gz cd tomcat-connectors-1.2.42-src/native/ yum install httpd-devel ./configure --with-apxs=/usr/bin/apxs make && make install 4、配置httpd(只做反向代理) 1、vim mod_jk.conf LoadModule jk_module modules/mod_jk.so JkWorkersFile /etc/httpd/conf.d/workers.properties JkLogFile logs/mod_jk.log JkLogLevel debug JkMount /* TomcatA JkMount /status/ stat1 2、vim workers.properties worker.list=TomcatA,stat1 worker.TomcatA.port=8009 worker.TomcatA.host=172.18.26.2 worker.TomcatA.type=ajp13 worker.TomcatA.lbfactor=1 worker.stat1.type=status 3、重新启动httpd 4、查看jk模块自带的管理界面 http://172.18.26.1/status/ 5、配置负载均衡 1、vim mod_jk.conf LoadModule jk_module modules/mod_jk.so JkWorkersFile /etc/httpd/conf.d/workers.properties JkLogFile logs/mod_jk.log JkLogLevel debug JkMount /* lbcluster1 JkMount /status/ stat1 2、vim workers.properties worker.list = lbcluster1,stat1 worker.TomcatA.type = ajp13 worker.TomcatA.host = 172.18.26.2 worker.TomcatA.port = 8009 worker.TomcatA.lbfactor = 5 worker.TomcatB.type = ajp13 worker.TomcatB.host = 172.18.26.3 worker.TomcatB.port = 8009 worker.TomcatB.lbfactor = 5 worker.lbcluster1.type = lb worker.lbcluster1.sticky_session = 0 # 值为1则进行会话绑定 worker.lbcluster1.balance_workers = TomcatA, TomcatB worker.stat1.type = status 6、配置文件解释 1、mod_jk.conf 除了需要使用LoadModule指令在apache中装载模块外,mod_jk还需要在apache的主配置文件中设置其它一些指令来配置其工作属性。如: JkWorkersFile 用于指定保存了worker相关工作属性定义的配置文件 JkLogFile 用于指定mod_jk模块的日志文件 JkLogLevel 可用于指定日志的级别(info, error, debug),此外还可以使用JkRequestLogFormat自定义日志信息格式 JkMount 格式: JkMount 指定则用于控制URL与Tomcat workers的对应关系。 2、workers.properties 对于apache代理来说,每一个后端的Tomcat实例中的engine都可以视作一个worker,而每一个worker的地址、连接器的端口等信息都需要 在apache端指定以便apache可以识别并使用这些worker。约定俗成,配置这些信息的文件通常为workers.properties,其具体路径则是使 用前面介绍过的JkWorkersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。比如,我们这里使用 /etc/httpd/extra/workers.properties。 workers.properties文件一般由两类指令组成:一是mod_jk可以连接的各worker名称列表,二是每一个worker的属性配置信息。它们分别 遵循如下使用语法: worker.list = < a comma separated list of worker names > worker.. = 其中worker.list指令可以重复指定多次,而worker name则是Tomcat中engine组件jvmRoute参数的值。如:worker.TomcatA.host=172.16.100.1 根据其工作机制的不同,worker有多种不同的类型,这是需要为每个worker定义的一项属性woker..type。常见的类型如下: ajp13:此类型表示当前worker为一个运行着的Tomcat实例。 lb:lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型 为ajp13的worker。 status:用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。 worker其它常见的属性说明: host:Tomcat 7的worker实例所在的主机; port:Tomcat 7实例上AJP1.3连接器的端口; connection_pool_minsize:最少要保存在连接池中的连接的个数;默认为pool_size/2; connection_pool_timeout:连接池中连接的超时时长; mount:由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代; retries:错误发生时的重试次数; socket_timeout:mod_jk等待worker响应的时长,默认为0,即无限等待; socket_keepalive:是否启用keep alive的功能,1表示启用,0表示禁用; lbfactor:worker的权重,可以在负载均衡的应用场景中为worker定义此属性; ================================================================================================================================================ Tomcat实现Session Cluster 1、会话保持方式 1、session sticky 会话粘性,在调度器上实现。使用到一致性哈希算法。 静态映射 动态映射 {对比HAproxy中的hash_type,map-based、consistent} cookie: Nginx:sticky cookie Haproxy:[cookie SERVERID insert nocache indirect] source IP: Nginx:ip_hash [consistent] Haproxy:source (hash_type: map-based、consistent) lvs:sh 2、session cluster session 复制 构建为会话的集群,每个集群节点都存有相同的用户会话信息。通过多播的方式将会话信息复制到会话集群中的每一个节点上。任意一个节点 宕机,都有完整的会话信息存在。基于多播的方式对会话信息进行复制和同步。 此种方式不使用集群规模较大的场景,(网络带宽) 3、session server memcached、redis作为session server。 2、session manager 会话管理器,能够自动实现管理tomcat的会话管理。会话管理包括:标准会话管理器和持久会话管理器。定义在Tomcat中的Host或者Context中。 1、标准会话管理配置(StandardManager): 默认保存于$CATALINA_HOME/work/Catalina///下的SESSIONS.ser文件中。 maxActiveSessions:最多允许的活动会话数量,默认为-1,表示不限制; maxInactiveInterval:非活动的会话超时时长,默认为60s; pathname:会话文件的保存目录; 2、持久会话管理(PersistentManager): 将会话数据保存至持久存储中,并且能在服务器意外中止后重新启动时重新加载这些会话信息。持久会话管理器支持将会话保存至文件存储 (FileStore)或JDBC存储(JDBCStore)中。 保存至文件中的示例: 每个用户的会话会被保存至directory指定的目录中的文件中,文件名为.session,并通过后台线程每隔一段时间(checkInterval参数定义,默认为60秒)检查一次超时会话。 保存至JDBCStore中的示例: DeltaManager: 实现Session Cluster的管理器。通过多播信道的方式将自己创建的会话多播到每一个节点,tomcat的每一个节点也监听在特定的端口, 接收会话信息,并加载到自己节点的内存中。每个主机都有全部的会话信息。任意主机宕机,会话都不会丢失。缺点是每个节点都得 保存会话,而且会话不具有持久保存的特性。不适应大规模场景。每次都更新变化的部分的会话信息。 BackupManager: 局部范围的复制会话信息,两两节点复制session。 3、配置示例 (使用DeltaManager) 1、给tomcat节点添加Cluster相关配置信息 {可以针对每个应用配置 Host或者Engine中都可以添加} vim server.conf # 主题:在官方文档找到Apache Tomcat Clustering 页面,复制相对应版本的配置段 # 定义集群 # 判定不可用时长 # 最大线程数 # 官方文档中此处有语法错误 2、提供web.conf配置文件 cp /usr/local/tomcat/conf/web.xml /data/webapps/ROOT/WEB-INF/ 添加配置: 为需要使用session cluster的webapps开启session distrubution功能 {注:此web.conf配置文件要放置于web应用所对应的WEB-INF目录下。} 5、If you are using mod_jk, make sure that jvmRoute attribute is set at your Engine and that the jvmRoute attribute value matches your worker name in workers.properties 4、同一个用户每一次请求都会调度到不同的tomcat服务器,但会话信息依然是同一个 ================================================================================================================================================ memcached 1、介绍 memcached是一套高速存储的分布式缓存系统,memcached的API使用三十二比特的循环冗余校验(CRC-32)计算键值后,将数据分散在不同的机器上。当表格满了 以后,接下来新增的数据会以LRU机制替换掉。由于memcached通常只是当作缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的数据 库)需要额外的代码更新memcached内的数据。 高性能的key/value数据缓存。 仅支持存储可流式化的数据 2、数据 结构化数据:RDBMS 半结构化数据:例如日志数据 组织为JSON(Documentation)格式的文档存放到NoSQL数据库中 非结构化数据:图片、流媒体数据 通常存放到文件系统中。可以存放到[分布式文件系统]中高效的存取数据,分布式文件系统可挂载。 3、使用场景 MySQL读取数据的代价是非常大的,为了增加读取数据的速度,可以将查询的结果缓存到memcached中,memcached中key为查询语句的 哈希值,value为查询的结果。 数据多次的使用场景,都可以使用memcached。 4、memcached特性 协议简单: Memcached 的服务端客户端通信使用简单的文本协议,而不是笨重的 XML 等格式,因此,通过 telnet 也能在 memcached 上存取数据 官方还提供二进制协议(Binary Protocol)。 基于libevent的事件处理: libevent 是个程序库,它将 Linux 的 epoll、BSD 类操作系统的 kqueue 等事件处理功能封装成统一的接口。即使对服务器的连接数 增加,也能发挥 O(1)的性能。 内置内存存储方式: memcached保存的数据都保存在内存中,使用最近最少使用算法LRU(Least Recently Used),替换旧的缓存数据。 memcached互不通信的集群: 每个节点缓存一部分节点的缓存对象。一致性哈希环算法 5、安装生成文件列表 rpm -ql memcached /etc/sysconfig/memcached # 环境配置文件 /usr/bin/memcached # 二进制程序 /usr/bin/memcached-tool # 查看统计数据,以及实现memcached服务器的组件 /usr/lib/systemd/system/memcached.service # memcached服务脚本 6、监听端口 memcached服务监听在tcp、udp的11211端口。 7、memcached配置启动 man memcached 查看启动 memcached 时可以传递的参数。可以将参数配置到/etc/sysconfig/memcached中的OPTION字段中。作为启动的参数传递给 memcached。 8、启动参数 -p 监听的端口 -l 连接的 IP 地址, 默认是本机 -d start 启动 memcached 服务 -d restart 重起 memcached 服务 -d stop|shutdown 关闭正在运行的 memcached 服务 -d install 安装 memcached 服务 -d uninstall 卸载 memcached 服务 -u 以的身份运行 (仅在以 root 运行的时候有效) -m 最大内存使用,单位 MB。默认 64MB -M 内存耗尽时返回错误,而不是删除项 -c 最大同时连接数,默认是 1024 -f 块大小增长因子,默认是 1.25 -n 最小分配空间,key+value+flags 默认是 48 -h 显示帮助 9、Memcache常用命令 模拟操作缓存。 [ root@node3 ~ ]# telnet 172.18.26.4 11211 Trying 172.18.26.4... Connected to 172.18.26.4. Escape character is '^]'. set mykey 0 60 11 hello world STORED append mykey 0 60 1 a STORED get mykey VALUE mykey 0 12 hello worlda END 10、连接MySQL的模块 PHP:memcache、memcached C:libmemcached 11、内存存储 尽管memcached中内存缓存数据可以使用最近最少使用算法可去除陈旧的缓存数据,但可能会造成内存碎片,浪费内存空间。memcached使用slab allocation 禁止整理内存易进行复用,将内存分成固定大小的chunk块,在将chunk块组成组。每一组chunk的大小的可能是多种尺寸的,为了容纳不同大小的数据,有数据 缓存时,将降到最适合数据大小的chunk块中。 Page:分配给slab用于在促分割为chunk的内存空间 chunk:用于特定大小的chunk组成而成的组 memcached中的数据缓存对象不能超过1M 12、memcached的参数 -s # 如果使用本地Socket套接字通信,此处定义Socket文件的大小 -f # 增长因子,The default is 1.25。定义chunk 块大小之间的距离 13、memcached管理工具 memcached-tool 127.0.0.1 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 1 96B 6s 1 1 yes 0 0 0 # # slab class的编号 Item_Size # chuck大小 Max_age # 最大生存时长 Pages # 分配给slab的内存页数 Count # slab的即可数 Full? # slab中是否拥有空闲chunk Evicted Evict_Time OOM 14、使用LRU最近最少使用算法,但memcached有一个特点就是惰性清理清理机制,当缓存过期后,不进行清理动作,而是将缓存标记为"透明",当再有缓存加入时, 而是覆盖原有的过期的缓存项。 15、专用memcached的客户端 yum install libmemcached 16、memecached默认没有认证机制,可借用与SASL进行认证。 SASL:Simple Authentication Secure Layer ================================================================================================================================================ 编译memcached php使用memecached Nginx使用memecached (马哥文档) Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。 memcached是以LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在 已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。 Memcached是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要反映在如下方面: 1. 简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成; 2. 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期; 3. 各服务器间彼此无视:不在服务器间进行数据同步; 4. O(1)的执行效率 5. 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长; Memcached提供了为数不多的几个命令来完成与服务器端的交互,这些命令基于memcached的协议实现。 存储类命令:set, add, replace, append, prepend 获取数据类命令:get, delete, incr/decr 统计类命令:stats, stats items, stats slabs, stats sizes 清理命令: flush_all 一、安装libevent memcached依赖于libevent API,因此要事先安装之,项目主页:http://libevent.org/,读者可自行选择需要的版本下载。本文采用的是目前最新版本的源码包libevent-2.0.21-stable.tar.gz。安装过程: # tar xf libevent-2.0.21-stable.tar.gz # cd libevent-2.0.21 # ./configure --prefix=/usr/local/libevent # make && make install # echo "/usr/local/libevent/lib" > /etc/ld.so.conf.d/libevent.conf # ldconfig 二、安装配置memcached 1、安装memcached # tar xf memcached-1.4.15.tar.gz # cd memcached-1.4.15 # ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent # make && make install 2、memcached SysV的startup脚本代码如下所示,将其建立为/etc/init.d/memcached文件: #!/bin/bash # # Init file for memcached # # chkconfig: - 86 14 # description: Distributed memory caching daemon # # processname: memcached # config: /etc/sysconfig/memcached . /etc/rc.d/init.d/functions ## Default variables PORT="11211" USER="nobody" MAXCONN="1024" CACHESIZE="64" OPTIONS="" RETVAL=0 prog="/usr/local/memcached/bin/memcached" desc="Distributed memory caching" lockfile="/var/lock/subsys/memcached" start() { echo -n $"Starting $desc (memcached): " daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE -o "$OPTIONS" RETVAL=$? [ $RETVAL -eq 0 ] && success && touch $lockfile || failure echo return $RETVAL } stop() { echo -n $"Shutting down $desc (memcached): " killproc $prog RETVAL=$? [ $RETVAL -eq 0 ] && success && rm -f $lockfile || failure echo return $RETVAL } restart() { stop start } reload() { echo -n $"Reloading $desc ($prog): " killproc $prog -HUP RETVAL=$? [ $RETVAL -eq 0 ] && success || failure echo return $RETVAL } case "$1" in start) start ;; stop) stop ;; restart) restart ;; condrestart) [ -e $lockfile ] && restart RETVAL=$? ;; reload) reload ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|condrestart|status}" RETVAL=1 esac exit $RETVAL 使用如下命令配置memcached成为系统服务: # chmod +x /etc/init.d/memcached # chkconfig --add memcached # service memcached start 3、使用telnet命令测试memcached的使用 Memcached提供一组基本命令用于基于命令行调用其服务或查看服务器状态等。 # telnet 127.0.0.1 11211 add命令: add keyname flag timeout datasize 如: add mykey 0 10 12 Hello world! get命令: get keyname 如:get mykey VALUE mykey 0 12 Hello world! END 4、memcached的常用选项说明 -l :指定进程监听的地址; -d: 以服务模式运行; -u :以指定的用户身份运行memcached进程; -m :用于缓存数据的最大内存空间,单位为MB,默认为64MB; -c :最大支持的并发连接数,默认为1024; -p : 指定监听的TCP端口,默认为11211; -U :指定监听的UDP端口,默认为11211,0表示关闭UDP端口; -t :用于处理入站请求的最大线程数,仅在memcached编译时开启了支持线程才有效; -f :设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因子; -M:当内存空间不够使用时返回错误信息,而不是按LRU算法利用空间; -n: 指定最小的slab chunk大小;单位是字节; -S: 启用sasl进行用户认证; 三、安装Memcached的PHP扩展 ①安装PHP的memcache扩展 # tar xf memcache-2.2.5.tgz # cd memcache-2.2.5 /usr/local/php/bin/phpize # ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache # make && make install 上述安装完后会有类似以下的提示: Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/ ②编辑/usr/local/php/lib/php.ini,在“动态模块”相关的位置添加如下一行来载入memcache扩展: extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/memcache.so 而后对memcached功能进行测试,在网站目录中建立测试页面test.php,添加如下内容: connect("127.0.0.1", 11211) or die("Could not connect"); $version = $mem->getVersion(); echo "Server's version: ".$version."
\n"; $mem->set('hellokey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server"); echo "Store data in the cache (data will expire in 600 seconds)
\n"; $get_result = $mem->get('hellokey'); echo "$get_result is from memcached server."; ?> 如果有输出“Hello World is from memcached.”等信息,则表明memcache已经能够正常工作。 四、使用libmemcached的客户端工具: 访问memcached的传统方法是使用基于perl语言开发的Cache::memcached模块,这个模块在大多数perl代码中都能良好的工作,但也有着众所周知的性能方面的问题。libMemcached则是基于C语言开发的开源的C/C++代码访问memcached的库文件,同时,它还提供了数个可以远程使用的memcached管理工具,如memcat, memping,memstat,memslap等。 1) 编译安装libmemcached # tar xf libmemcached-1.0.2.tar.gz # cd libmemcached-1.0.2 # ./configure # make && make install # ldconfig 2) 客户端工具 # memcat --servers=127.0.0.1:11211 mykey # memping # memslap # memstat 五、Nginx整合memcached: server { listen 80; server_name www.magedu.com; #charset koi8-r; #access_log logs/host.access.log main; location / { set $memcached_key $uri; memcached_pass 127.0.0.1:11211; default_type text/html; error_page 404 @fallback; } location @fallback { proxy_pass http://172.16.0.1; } } ================================================================================================================================================ Tomcat将会话保存到memcached (session server) 实验架构 两个tomcat节点:172.18.26.2(node1.xuekaixin.com),172.18.26.3(node2.xuekaixin.com) 两个memcached节点:172.18.26.4, 172.18.26.4 一个负载均衡节点:172.18.26.1 注意:本次实现使用tomcat7,负载均衡使用nginx 1、memcached-session-manager Tomcat中使用的一个java类,能够借助memcached-session-manager将tomcat自身的会话保存到memcached服务器中。msm可以自动的将缓存数据保存到两个 memcached服务器上,其中一个服务器当活动节点,另一个memcached充当备用节点。当tomcat将会话保存到其中一个节点的同时,也会将会话数据保存到 另外一个memcached服务器上。 2、下载部署memcached-session-manager 下载如下jar文件至各[tomcat节点的tomcat安装目录下的lib目录中],其中的${version}要换成你所需要的版本号,tc${6,7,8}要换成与tomcat版本相同 的版本号: memcached-session-manager-${version}.jar memcached-session-manager-tc${6,7,8}-${version}.jar spymemcached-${version}.jar msm-javolution-serializer-${version}.jar # 序列化管理工具 javolution-${version}.jar # 流式化工具类库 使用库版本: javolution-5.4.3.1.jar memcached-session-manager-1.8.3.jar memcached-session-manager-tc7-1.8.3.jar msm-javolution-serializer-1.8.3.jar spymemcached-2.11.1.jar 3、配置tomcat server.xml配置文件 分别在两个tomcat上的某host{也可以配置与engine段}上定义一个用于测试的context容器,并在其中创建一个会话管理器,如下所示: 4、分别为两个context提供测试页面 tomcatA: # mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib} # vim /usr/local/tomcat/webapps/test/index.jsp 添加如下内容: <%@ page language="java" %> TomcatA

TomcatA.magedu.com

<% session.setAttribute("magedu.com","magedu.com"); %>
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>
tomcatB: # mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib} # vim /usr/local/tomcat/webapps/test/index.jsp 添加如下内容: <%@ page language="java" %> TomcatB

TomcatB.magedu.com

<% session.setAttribute("magedu.com","magedu.com"); %>
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>
5、测试 测试结果,在浏览器中访问http://172.16.100.6/test,结果如下所示,其session ID在负载均衡环境中保持不变。 memcached-tool 127.0.0.1 # 查看memcached中是否有缓存存入 memcached-tool 10.0.0.5:11211 display # shows slabs memcached-tool 10.0.0.5:11211 # same. (default is display) memcached-tool 10.0.0.5:11211 stats # shows general stats memcached-tool 10.0.0.5:11211 dump # dumps keys and values ================================================================================================================================================ JVM java虚拟机 1、垃圾回收算法 Minor GC Young Generation,新生代垃圾回收算法 新声代的垃圾回收是及时的 Major GC (FULL GC)Old Generation,Mark and compact 标记清除算法 1、遍历整个堆,标记不在使用的对象 2、清除不在被引用的对象 Stop the world 2、启动JVM虚拟机时可以传递的参数 。格式 -Xms256m -Xmx # 新生代和老年代总共可占用的空间 -Xms # 去除给新生代和老年代保留的空间后,新生代和老年代还剩多少内存空间 -XX:NewSize # 新生代初始时的占用空间 -XX:MaxNewSize # 整个新生代占用空间 -XX:MaxpermSize # 持久代最大空间 -XX:PermSize # 持久代初始化空间 3、传递方式参数 1、catalina.sh 脚本中的环境变量 CATALINA_OPTS 仅对启动运行的tomcat实例中的java虚拟机有效 JAVA_OPTS 对本机山的所有java虚拟机有效 4、JVM性能监控工具 可能存在问题: 内存不足(OutOfMemoryError) 线程死锁 锁竞争(Lock Contention) Java消耗过多的CPU 使用yum安装的JDK中没有java-1.8.0-openjdk-devel包,所以需要手动安装此rpm包。 1、jps (java virtual machine process status tool) 监控jvm进程状态信息 jps [-q] [-mlvV] [] -q # 静默模式 -v # 显示传递给jvm的命令行参数 -m # 输出传入main方法的参数 -l # 输出main类或jar完全限定名称 -V # 显示通过flag文件传递给jvm的参 []:主机id,默认为localhost 2、jstack 查看某个java进程内的线程堆栈信息 jstack [options] pid -l # 输出完整的锁信息 -m # 混合模式。即输出java堆栈即C/C++堆栈信息 -F # 当使用"jstack -l PID"无响应,可以使用-F强制输出信息 3、jmap jhat 查看JVM堆内存的使用情况 jmap [option] -heap pid # 详细输出堆内存状态。to print java heap summary jmap -histo[:live] # 显示堆内存中的每一个内存对象的。jmap -histo:live 2231 jhat [-stack ] [-refs ] [-port ] [-baseline ] [-debug ] [-version] [-h|-help] 4、jstat jvm统计监测工具 jstat -help|-options jstat -