Tomcat
Web站点架构中属于后端应用程序服务器阶段,并且是运行 *.jsp代码的平台,基于Java编写实现
Java是可以写应用程序的一个实用的编程语言,其中后端应用程序与前端服务器或者之间通过固定的CGI(Common Gateway Interface)协议进行交互
Java是一个纯面向对象的编程语言,使用JDK(Java Development Kit)Java开发调试工具进行编译,然后在JVM(Java Virtual Machine)上运行
通过servlet类库来提高Java程序的快速开发,实现运行动态服务器网站的应用
通过JSP(Java Server Page)类库实现将代码嵌入到web服务html语言中使用,实现分离管理
Java技术分为三个方向:(基于JDK)
SE(Standard Edition):标准版
EE(Enterprise Edition):升级版
ME(Mobile Edition):手机端(不常用)
Tomcat的基础
需要能够使用tomcat,前提是需要部署JDK
安装方法:(注意需要另外安装JDK)
1.Base Repo:
# yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel(通过依赖关系下载安装其他组件)
# 安装需要使用的tomcat相关包,会自动解决依赖性关系
tomcat-admin-webapps 提供管理tomcat的应用程序
tomcat-webapps 提供应用程序
tomcat-docs-webapp 提供一些应用程序文档
2.网站下载
# http://www.oracle.com/technetwork/java/javase/downloads/index.html
# 此网站是下载jdk工具包,可下载“.rpm”结尾的包直接安装,为便于命令行使用,可将二进制程序文件路径加入PATH变量
# http://tomcat.apache.org/ 网站下载tomcat安装包
# tar xf apache-tomcat-VERSION.tar.gz -C /usr/local/
# cd /usr/local
# ln -sv apache-tomcat-VERSION tomcat (可便于后续版本的升级)
# 所有相关配置文件,二进制程序,都会在/usr/local/tomcat目录下
# 因为需要普通用户身份运行,需要修改用户、数组信息:
chown -R USER.GROUP /usr/local/tomcat
# 此安装模式下启动tomcat 的方式:
需要切换普通用户
/usr/local/tomcat/bin/catalina.sh start
Tomcat的配置(基于Base Repo安装环境下)
1.配置文件的基本构成:(/etc/tomcat/目录下)
server.xml: 主配置文件
web.xml: 每个webapp只有“部署”后才能被访问,此文件为所有的webapps提供默认部署相关的配置;每个webapp的部署方式通常由自定义的web.xml进行定义,其存放位置为每个webapp的WEB-INF/目录中
context.xml: 此文件为所有的webapps提供默认配置;每个webapp都可以由专用的配置文件context.xml来定义,其存放位置为每个webapp的WEB-INF/目录中
tomcat-users.xml: 设定用户认证的账号和密码文件
catalina.policy: 当使用-security选项启动tomcat时,用于为tomcat设置安全策略
catalina.properties: Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数
logging.properties: 日志系统相关的配置
2.主配置文件,也就是核心组件/etc/tomcat/server.xml的基本格式如下:
<Server>
<Service>
<connector/>
<connector/>
...
<Engine>
<Host>
<Context/>
<Context/>
...
</Host>
<Host>
...
</Host>
...
</Engine>
</Service>
</Server>
tomcat依赖于不同组件的集合,具体分为以下几个类型:
顶级组件:Server
表现为一个Java进程,监听在8005端口,默认是可接收“SHUTDOWN”指令来关闭tomcat服务(为其他用户联机进入串改,可自定义),各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口
服务类组件:Service
用于实现将一个或多个connector组件关联至一个engine组件
连接器组件:Connector
主要负责接收请求,主要有三类:http、https、ajp(apache jserv protocol)
容器类组件:Engine、Host、Context(用来存放动态站点代码的配置段)
Engine组件:Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点; 通常需要通过defaultHost属性来定义默认的虚拟主机
Host组件:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机,常用属性说明:
(1) appBase:此Host的webapps的默认存放目录,指存放非归档的web应用程序的目录或归档的WAR文件目录路径;可以使用基于$CATALINA_BASE变量所定义的路径的相对路径;
(2) autoDeploy:在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat;
Context组件:当应用程序的文件不在Host组件内设定的站点内时,可用此组件进行设置,实现URL的映射,格式如下:
<Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/>
/PATH:表示应用程序名
/PATH/TO/SOMEDIR:表示应用程序映射后的路径地址,一把情况下,为了便于管理,通常此路径是应用程序的软连接
被嵌套类组件:Valve、Logger、Realm, Loader、Manager, ...
集群类组件:listener、cluster, ...
3.tomcat服务是默认监听在8080端口,因为tomcat内部运行的都是应用程序,不需要特权,为避免影响安全,所以是以普通用户的方式运行(普通用户默认是不可以监听1023以下的端口的)
4.默认的站点根路径:/usr/share/tomcat/webspps/(是/var/lib/tomcat/webapps的链接)
在根路径下存放着各类应用程序,每个应用程序有独立的组织结构,结构如下:
index.jsp, index.html:主页;
WEB-INF/:当前应用程序的私有资源路径;通常用于存储当前应用程序的web.xml和context.xml配置文件;
META-INF/:类似于WEB-INF/;
classes/:类文件,当前应用程序所提供的类;
lib/:类文件,当前应用程序所提供的类,被打包为jar格式;
需要注意的是,区别于其他的web服务器,tomcat默认的主网页会另外存放在根路径下的ROOT子目录中
其中有两个管理应用程序:
manager:管理webapps应用程序,可网页界面进行操作
host-manager:管理虚拟主机
都需要在/etc/tomcat/tomcat-users.xml文件中,建立对应的管理账号
deploy:部署应用程序
含义是将应用程序的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能够基于web.xml和context.xml文件中定义的路径来访问此应用程序;将其特有的类和依赖的类通过class loader装载至JVM
部署有两种方式:
1.自动部署:auto deploy
2.手动部署:
冷部署:把webapp复制到指定的位置,而后才启动tomcat
热部署:在不停止tomcat的前提下进行部署
手动部署工具:manager、ant脚本、tcd(tomcat client deployer)等
undeploy:反部署,停止webapp,并从tomcat实例上卸载webapp
start:启动处于停止状态的webapp
stop:停止webapp,不再向用户提供服务;其类依然在jvm上
redeploy:重新部署
Tomcat添加反代服务
1.通过nginx实现反代服务,设置简单,在虚拟主机server{……}语句块下设置URL转发即可,示例如下:
location / {
proxy_pass http://www.a.com:8080; (假设此主机名是tomcat主机)
}
2.利用httpd服务的proxy_module模块配置相关虚拟主机信息,其中:
proxy_http_module:适配http协议客户端
proxy_ajp_module:适配ajp协议客户端
在httpd服务器上设置的proxy_http_module代理配置的示例如下:(ajp协议只需将下面“http”换为“ajp”)
<VirtualHost *:80>
ServerName www.a.com (假设此主机名是tomcat主机)
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On (保留客户端发送的请求中访问的主机名)
<Proxy *> (对代理服务的授权)
Require all granted
</Proxy>
ProxyPass / http://www.a.com:8080/ (将所有内容都代理到tomcat上)
ProxyPassReverse / http://www.a.com:8080/
<Location /> (对URL的授权)
Require all granted
</Location>
</VirtualHost>
<LocationMatch "\.(jsp|do)$> (只代理动态页面到tomcat上)
ProxyPass / http://tc1.magedu.com:8080/
</LocationMatch>
Tomcat的负载均衡的实现
1.基于nginx作为负载调度器时,则是需要通过配置upstream {…}语句块和server{…}语句块,进行相关配置
2.基于haproxy作为负载调度器时,则是通过frontend配置段和backend配置段进行性设置
3.还有少数会使用httpd作为负载调度器,基本的配置示例如下:
<proxy balancer://NAME>
BalancerMember http://TomcatServer1_IP:8080 (当时用ajp协议时,则将端口号改为默认的8009即可实现)
BalancerMember http://TomcatServer2_IP:8080
ProxySet lbmethod=byrequests
</Proxy>
<VirtualHost *:80>
ServerName www.a.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://NAME/
ProxyPassReverse / balancer://NAME/
<Location />
Require all granted
</Location>
<Location /balancer-manager> (启用自带的页面管理接口)
SetHandler balancer-manager
ProxyPass !
Require all granted
</Location>
</VirtualHost>
tomcat主机一般情况下都是需要做会话保持功能,方法有如下三种:
1.session sticky(会话粘性)
通过Source_IP的调度算法或者Cookie实现 (此方法可能存在单点失败的问题)
2.sesssion cluster
在tomcat主机上启用集群配置 (不适用于大规模环境)
3.session server
利用专门主机,存储会话,常用的存储系统:memcached、redis
memcached
高性能、分布式的内存对象缓存系统
基于最简单的Key---Value键值对来进行存储,并且所有数据都是存储在内存中,一旦memcached进程关闭,则存储就会丢失