Tomcat
Java 的三个方向 :
J2SE : Standard Edition 标准版
J2EE : Enterprise Edition 企业版
J2ME : Mobile Edition 移动版
代表性技术 : EJB Java Plugin, Swing, JIT (java 即时编译器)
Java 的体系结构规范 :
- Java 编程语言
- Java Class 文件格式
- Java API
- Java VM
-
- JVM 的核心组件 :
-
- Class Loader
-
- 执行引擎
- Java 编程语言的主要特性 :
-
- 面向对象的编程, 多线程, 结构化错误处理, 自动垃圾收集, 动态链接, 动态扩展
GC : garbage collector
JVM 的运行时区域 :
- 方法区 : 线程共享, 用于存储别JVM加载的class 信息, 常量, 静态变量, 方法等, 持久代
- 堆 : 是JVM 所管理的内在的最大一部分, 格式GC管理的主要区域, 主流的垃圾收集算法基于分代收集
- Java栈 : 线程私有, 存储线程和自己的局部变量
- PC 寄存器 : 线程私有的内存空间, 程序的指令指针
- 本地方法栈 :
JSP
将JSP文件放在java虚拟机上运行
index.jsp ---> jasper ---> index.java ---> index.class ---> JVM
Web Container
Serviet Container :
Java Web Server : JWS
开源实现 : Tomcat (使用Java实现)
Tomcat 的组成
<Server>
<Service>
<Connector/>
<Connector/>
<Engine>
<Host>
<Context/>
...
</Host>
</Engine>
</Service>
</Server>
组件都由”类”实现
- 顶级组件 : Server
- 服务组件 : Service
- 连接器组件 : http, https, ajp
- 容器类 : Engine, Host, Context
- 被嵌套组件 : value, logger, realm, loader, manager
- 集群类组件 : listener, …
安装 :
JDK
- rpm 安装 : 添加JAVA_HOME 变量
- 配置/etc/profile.d/java.sh
JAVA_HOME=/usr/java/
export JAVA_HOME
OpenJDK
- rpm 安装 :
- 配置/etc/profile.d/java.sh
JAVA_HOME=/usr
Tomcat
- rpm 安装
yum install tomcat tomcat-admin-webapp tomcat-webapp
- 二进制包安装:
CATALILNA_BASE=/usr/local/tomcat
PATH=$CATALINA_BASE/bin:$PATH
export CATALINA_BASE PATH
Tomcat 的目录结构
- bin : 脚本, 及启动时用到的类
- lib : 类库;
- conf : 配置文件
- logs : 日志文件
- webapps : webapp 默认部署目录
- work : 工作目录
- temp : 临时工作目录
Tomcat 的配置文件
- server.xml : 主配置文件
- context.xml : 每个webapp都可以有专属的配置文件, 其配置文件存放于WEB-INF目录下,为其他webapp提供默认配置
- web.xml : 每个webapp只有在被部署后才能被访问, 这些配置文件通常位于webapp应用程序自己的目录下的WEB-INF 目录中, 用于定义其他webapp的默认部署方式
- tomcat-user.xml : 用户认证账号和密码文件
- catalina.policy : 当使用-security 选项来启动tomcat 实例时, 会读取此配置文件来实现基于安全策略的运行方式
- catalina.properties : Java 属性的定义文件, 用于设定类加载路径, 以及一些JVM的调优相关的参数
- logging.propeties : 日志系统相关的配置
JSP WebAPP 组织结构:
- : webapps 的根目录
- index.jsp : 主页
- WEB-INF/ : 当前webapp的私资源的目录通常存放当前webapp自用的web.xml
- META-INF/ : 当前的webapp的私资源目录, 通常存放当前webapp自用的context.xml文
- classes/ : 类文件, 当前webapp的私有类
- lib/当前webapp的私有类, 但被打包成jar格式
webapp 的归档模式
- .war : webapp
- .jar : EJB的类
- .rar : 资源适配器
- .ear : 企业级应用程序
部署(deploy) webapp 的相关操作 :
- deploy : 将webapp的源文件放置于目标目录, 配置tomcat 服务器能够基于context.xml文件中定义的路径来访问此webapp
-
- 有两种方式 : 自动部署和手动部署
-
-
- 手动部署 :
- 冷部署 : 把webapp复制到指定位置, 而后启动tomcat
- 热部署 : 在不停止tomcat的前提下进行的部署 (使用部署工具manager app, ant脚本, tcd)
- 手动部署 :
-
- undeploy : 反部署, 停止webapp, 并从tomcat示例上拆除其部署文件和部署名
- stop : 停止, 不再向用户提供服务
- start : 启动处于停止状态的webapp
- redeploy : 重新部署
Tomcat 常用组件
每个组件都是通过特有的类来实现的, 有的组件还不止一种实现方式
- Server : tomcat示例, 即运行的一个JVM进程, 监听与8005 端口接收”SHUTDOWN”, 各Server 监听的端口不能相同, 因此一个物理机上启动多个Server实例应该使用不同的端口
- Service : 用于实现将一个或多个connector 关联至一个engine
- Connector 组件 : 进入tomcat 的请求可分为两类
- - tomcat 作为独立的应用程序服务器 : standalone, 次数,请求来自于浏览器
- - http, https
- - tomcat 作为应用程序服务器 : 请求来自于前面反代主机
- - - httpd : http, https, ajp
- - - nginx : http, https
- - 属性 :
- - - address : 监听的IP地址
- - - maxThreads : 最大并发连接数
- - - port : 监听的端口
- - - protocol : 连接器使用的协议, HTTP/1.1 AJP/1.3
- - - redirecPort : 重定向端口
- - - connectionTimeout : 连接的超时时长, 单位为毫秒, 默认为60000ms(60s)
- - - enableLookups : 设置关闭
- - - acceptCount : 定义等待队列的长度
- - - scheme : 映射的协议类型
- - - debug : 是否开启调试模式
- - - secure : 安全模式
- - - clientAuth : 认证客户端证书
- - - sslProtocol : 使用ssl协议
- Engine : Servlet 的一个实例(默认示例为catalina), 其内部可以有一个或多个Host组件来定义站点, 通常需要通过defaultHost的属性定义默认的虚拟主机
- 属性 :
- - name=
- - defaultHost= 当传递过来的主机名不在虚拟主机列表里的时候, 使用默认虚拟主机返回结果
- - jvmRoute=
- Host : 位于Engine容器中用于接收请求并进行处理的主机或虚拟主机, 如前面示例中定义
- - name=定义虚拟主机的名称
- - appBase=定义虚拟主机资源文件所存放的路径, 存放的路径可为相对路径和绝对路径, 两个虚拟主机不能在同一个目录下. 将ROOT目录下的文件作为资源文件.
- - autoDeploy=在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
- Context : 用于定义一个url(路径别名类似), 一个Context 定义表示tomcat实例中的一个web应用程序
在这里的docBase 是jsp文件所在路径, 不是项目文件夹所在路径,
不需要放置或创建ROOT目录, 放在baseDoc 定义的目录下就能读取
补充 : Context 的目录结构
- path
|- lib
|- classes
|- WEB-INF
|- MATE-INF
|_ index.jsp
<Context path="/bbs" docBase="/webapp/test3"
reloadable="true">
每一个context 定义也可以使用一个单独的xml文件进行, 其文件的目录为$CATALINA_HOMA/conf/Engine/Host
- valve 组件 : 访问日志和访问控制功能
- 示例 :
Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
-
- className : 定义日志的类型
-
- directory : 日志所在目录
-
- prefix : 日志文件名
-
- suffix : 日志后缀名
Tomcat的非独立模式运行
动静分离机制, 把Tomcat 直接响应来自浏览器的请求使用httpd或nginx 进行反代
LNMT :
客户端发出的请求发送到 http服务器, http服务器由nginx 承担, 将用户请求的动态内容反代至tomcat.
- 首先, 安装nginx和Tomcat, 正好手上有现成的装好nginx的虚拟机, 我就直接拿来用了
- 修改nginx 配置项, 将http请求全部代理至后端Tomcat 主机.
location / {
root /usr/share/nginx/html;
proxy_pass http://tc2.nextkara.net:8080/;
index index.html index.htm;
}
- 修改修改配置后启动Tomcat 和nginx
结果如图所示
桌面1图
补充 : 进行模式匹配时, proxy_pass 后定义的后端主机的URL最后不能加/ , 加了则为语法错误
对于, 将动态请求和静态文件请求分离
location ~* \.(jsp| do) {
proxy_pass http://tc.nextkara.net:8080/
}
LAMT
将Tomcat的保持回话的功能转交给Httpd 进行处理, 后端的Tomcat 只进行内容的处理
- 安装httpd 和 Tomcat
- 修改httpd 的配置文件, 注释掉httpd.conf 文件中的DocumentRoot 项
新建文件/etc/httpd/conf.d/tomcat.conf 内容如下
<VirtualHost *:80> ServerName tc2.nextkara.net DocumentRoot "/webapp/tomcat" ProxyRequests Off ProxyVia On ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ <Location "/webapp/tomcat"> Require all granted </Location> </Virtualhost>
- 启动httpd 和Tomcat , 显示结果如下图
图2
使用proxy_ajp_module 进行反代
将上述的tomcat.conf 文件中的内容进行修改为如下内容即可完成使用proxy_ajp_module 进行反代的功能
需要在server.xml 中定义connector
<connector port="8009" protocol="AJP/1.3" />
<VirtualHost *:80>
ServerName tc2.nextkara.net
DocumentRoot "/webapp/tomcat"
ProxyRequests Off
ProxyVia On
ProxyPreserveHost Off
<Proxy *>
Require all granted
</Proxy>
ProxyPass / ajp://tc2.nextkara.net:8009
ProxyPassReverse / ajp://tc2.nextkara.net:8009/
<Location "/webapp/tomcat">
Require all granted
</Location>
</Virtualhost>
后端tomcat 能够根据前端主机传递客户端请求的主机名进行解析到其他不同的虚拟主机上.
Tomcat Cluster
根据需求对主机进行扩展和收缩
Session Cluster : 不适用于集群节点规模较大的场景
实验一 LNAMT
基于nginx 对tomcat 集群进行调度, 每一个tomcat 主机, 使用httpd 服务器对请求进行反代, 然后使用nginx 对服务进行调度, 将会话保存到后端的session cluster 中, 在进行灰度发布时, 不会丢失会话
使用虚拟主机为
- nginx
- test-7-1 with tomcat
- test-7 with tomcat
- basic 进行访问目标页面
- 1.