您的位置:首页 > 运维架构 > 反向代理

tomcat原理及安装及反向代理、会话保持、session集群和session共享服务器的实现(一)

2015-11-03 23:47 996 查看
JDK(java development kit)叫做java开发工具包,是整个java的核心,包括JRE(java runtime environment,叫做java运行是环境),一堆java的工具和java的基本类库。
JDK包含的组件包括:
javac:编译器,将源程序转换成字节码,即。java程序转换成。class文件,然后才能java虚拟机上运行。class文件
jar:打包工具,将相关的类文件打包成一个文件
javadoc:文档生成器,从源码注释中提取文档
jdb:debuger,差错工具
java:运行编译后的java程序(.clsss后缀的文件,java文件在编译后生成。class文件,叫做字节码文件)
appletviewer:小应用程序浏览器,一种执行html文件上的java小程序浏览器
javap:java的反编译器,将字节码反编译为java程序
jconsole:java进行系统调试和监控的工具

JVM架构:jvm叫做java虚拟机,是通过软件模拟的方式模拟出来的的能够运行java程序的虚拟机器,是java代码运行的平台,java的源程序运行在jvm上时需要进行系统调用是由jvm自动执行,因此实现了代码和真实机器的隔离,所以java程序可夸平台指的就是只要系统上运行一个jvm,java源程序就能够在jvm上运行,而与操作系统的相关的操作是由jvm自己定制的,而不需要程序员考虑。




JVM的核心组成部分:1、class loader,叫做类加载器,用来加载java基础类和自定义的类2、执行引擎方法区:线程共享的,用于存放被虚拟机加载的类信息、常量、静态变量等。或称为永久代,堆:堆内存是共享的,java堆是对java所管理的内存中最大的一部分,也是GC管理的主要区域,主流的算法都基于分代方式进行收集,如新生代和老年代。java栈:线程私有的,用来存放线程自己的局部变量等信息pc寄存器 :program counter register,也叫程序计数器,用来记录程序代码运行时的指针所指向的地址空间,线程独占的内存空间。本地方法栈:native
GC:叫做垃圾回收器,是面向堆来工作的。
Jave EE标准则包含了一组适用于创建企业级Web应用程序的API。Jave EE建立在Java SE的基础上,并依赖于Java SE才能正常工作。当然,任何级别的应用程序均能从Java EE中获益,但Jave EE却更适合解决大型软件系统设计中的问题。

JAVA 2 EE包含多个独立的API,Servlet和JSP就是其中的两个,而JAVA EE中著名的API中还包含如下的几个:

JAVA 2 EE APIs:
EJB(Enterprise JavaBeans):JAVA相关的诸多高级功能的实现,如RMI(Remote MethodInvocation), 对象/关系映射,跨越多个数据源的分布式事务等;

JMS(Java Message Service):高性能异步消息服务,实现JAVA EE应用程序与非JAVA程序的“透明”通信;

JMX(Java Management Extensions):在程序运行时对其进行交互式监控和管理的机制;

JTA(Java Transaction API):允许应用程序在自身的一个或多个组件中平滑地处理错误的机制;

JavaMail:通过工业标准的POP/SMTP/IMAP协议发送和接收邮件的机制;java 2 EE 包括的技术:servlet,JSP ,EJB ,JMX ,javamail

applet:小应用程序,客户端程序
servlet:服务器应用程序,称之为 servlet contaier
客户端浏览器只能理解html语言,但是java程序在sever服务器运行后的结果没有html的标签等,为了输出这些html的标签,则必须使用java程序输出,如println(<h1>),这种方式就是html标签要硬编码在应用程序中,为简化这种问题,出现了JSP语言,能够类似于php语言可以直接嵌套在html标签中,在程序运行时,java会自动将这些html标签硬编码为java语言。也可以将jsp看做java中的一个特殊的类,能够实现自动将html格式的标签转换为java代码的输出格式,然后在运行java程序。
如html标签要硬编码在应用程序中,为了解决这种问题,出现了JSP语言,这就类似于php的语法了。使得java代码能够直接内嵌在html代码中,简化了程序的 jdk只提供了java 2 EE的标准,而没有提供jsp的功能,jsp能够利用jasper在前端将html和java互相嵌套的代码翻译成servlet程序(全java代码个格式),然后在JVM上运行。jsp程序运行的过程: jsp程序—由jasper engine翻译成.java程序(也就是servlet能够识别的代码)---然后由javac将以.java结尾的程序文件编译成.class文件(字节码程序),最后由java真正运行字节码程序,因此一个能够运行jsp程序的架构平台必须包括JDK, SERVLET,JSP,而这种平台称之为web container。web container:要包括JDK, Servlet,JSP要部署jsp应用程序服务器,前提必须部署JDK,然后在部署servlet和jsp,而JDK软件中只有jdk组件,servlet和jsp的组件需要其他软件来提供,能够实现这些的功能的web container有:
商业实现:websphere(IBM)weblogic(原属于BEA,后被oracle收购)oc4jglassfishgeronimoJOnASJBoos开源实现:Tomcatjettyresin而JDK的提供者有: sun开发的jdk,开源软件openJDK,IBM开发的jdk等。

tomcat仅实现了jsp和servlet的功能,而没有实现java EE的其他功能
tomcat的核心组件:1、catalina:提供servlet container容器2、coyote:是一个http connection链接器3、Jasper: 是jsp engine,负责将jsp文件中的html语言标签转换为能够被servle识别的java格式代码。
tomcat的主配置文件中各组件包括
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的两种方法和基于httpd和nginx做反向代理tomcat以及实现tomcat负载均衡和session绑定。
第一种方法:
手动安装jdk
[root@localhost src]# rpm -ivhjdk-7u79-linux-x64.rpm



jdk安装后的文件,



由于jdk可以并存在一个主机上,因此需要导出新安装的jdk的环境变量方便系统能够识别。
[root@localhost java]# vim/etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
[root@localhost java]# ./etc/profile.d/java.sh
[root@localhost java]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build24.79-b02, mixed mode)

然后解压tomcat文件包
[root@localhost ~]# tar -xvfapache-tomcat-8.0.15.tar.gz -C /usr/local
[root@localhost ~]# cd /usr/local
[root@localhost local]# ln -svapache-tomcat-8.0.15 tomcat



tomcat运行时需要读取其catalina脚本,因此需要再系统上为其指定环境变量
[root@localhost bin]# vim/etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
然后重读此脚本
[root@localhost java]# ./etc/profile.d/tomcat.sh
然后就可以启动tomcat了
[root@localhost bin]# catalina.sh start



关闭tomcat
[root@localhost bin]# catalina.sh stop







手动安装tomcat完毕。
注意:java程序运行不需要特权,因此要以普通用户来运行tomcat,所以tomcat的监听端口默认是8080,如果设置tomcat监听端口小于1024,那么必须以root身份来运行tomcat,因为小于1024的端口要想使用必须使用root身份。

第二种方法:
使用yum安装tomcat,在centons系统上光盘默的有java-openjdk和tomcat,因此可以直接安装tomcat
yum install tomcat-7.0.54-1.el7.noarch
[root@localhost tomcat]# yum installtomcat-webapps.noarch
使用yum安装后需要额外安装tomcat-webapps.noarch才有默认的tomcat页面

配置文件在/etc/tomcat目录下,主配置文件server.xml
工程文件目录在/var/lib/tomcat
启动tomcat并查看
[root@localhost tomcat]# systemctl starttomcat.service








后续实例见第二个博客
nginx+tomcat实现反向代理、会话保持,httpd+tomcat实现反向代理、会话保持,tomcat实现session集群以及session服务器的实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息