tomcat server。xml中的常用组建
instance 实例
tomcat的常用组件配置:
Server:代表tomcat instance,即表现出的一个java进程;监听在8005端口,只接收“SHUTDOWN”。
各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口;
开启了,太危险,就可以把端口,或者命令修改
port="-1",
shutdown="RANDOM_CHARCTER"
Service:用于实现将一个或多个connector组件关联至一个engine组件;/
**
Connector组件:
负责接收请求,常见的有三类http/https/ajp;
一般部署环境的不同 到达tomcat的请求可分为两类:
(1) standalone (工作再独立模式下): 请求来自于客户端浏览器;(tomncat直接面向客户端,)
(2) 由其它的web server反代:来自前端的反代服务器;(tomcat被反代服务器代理请求)
(nginx只支持http协议反代,tomcat也仅能使用http连接器)
nginx --> http connector --> tomcat
(如果要使用httpd反代,就有两种选择
httpd(proxy_http_module) (htto连接器)–> http connector --> tomcat
httpd(proxy_ajp_module)(ajp连接器) --> ajp connector --> tomcat
非标准模式:(需要装载第三方模块)
httpd(mod_jk) --> ajp connector --> tomcat(这个模块不是自带的,得去编译这个模块才可以,官方不推荐使用)**
定义connector ,是一个xml格式的
对于连接器来讲,常用的属性有很多
默认使用本地所有地址,所以下面两个都没有指定address
connectiontimeout 超时时间
max threads 最大线程数(并发链接数,默认为200)
enablelookups 是否启用dns查询功能(一旦启用,就有可能不断地反解客户端的ip地址,如果有必要就关了来提升性能)
acceptcount 等待队列最大长度(很多服务器有并发上限,超出上限后,排队等待,不能无限制,因为每一个排队的成员都会占用内存的)
secure=true 代表这个链接必须使用ssl会话链接
ssl enable也要启动起来
scheme指定协议,
ajp只有用httpd反代才会用到
一般都是两级反代的,本地的也有反代,每个主机上都有一个反代tomcat,构建的服务叫lnat
改成1000个,等待队列为200,端口可以改成80,但是是普通用户,启动不了80端口
可以再ipvs上加规则redirect规则,用户访问80时都ipvs重定向到本机的8080端口,ldirect
engine 是用来定义容器组建,只有这三个属性
jvmroot jvm的路由标识符,做会话粘性是会有用,负载均衡
haproxy可以给用户请求强行插入一个cookie属性指明 web server等于哪个server服务器地址,这样下次请求来的时候,就可以根据cookie判曾经被调度到哪个主机上
每个用户请求时都回插入一个jvm引擎的标识符,这个标识符,如果后端有多个tomcat主机实例,每一个都应该不同
host组建
Host组件:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机,示例:
<Host name=“localhost” appBase=“webapps”
unpackWARs=“true” autoDeploy=“true”
</Host
常用属性说明:
(1) appBase:此Host的webapps的默认存放目录,指存放非归档的web应用程序的目录或归档的WAR文件目录路径;
可以使用相对路径,相当于使用基于$CATALINA_BASE(当前实例运行的根目录,程序根目录不是页面文件根目录)
当前变量所定义的路径的相对路径;
(2) autoDeploy(自动部署):在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,
是否自动将其部署至tomcat;
示例:
<Host name=“tc1.magedu.com” appBase="/appdata/webapps"
unpackWARs=“true” 是否自动产开war文件
autoDeploy=“true”
</Host
可以在这之上定义一个虚拟主机
# mkdir -pv /appdata/webapps
# mkdir -pv /appdata/webapps/ROOT/{lib,classes,WEB-INF}
提供一个测试页即可;
name 名字
appbase Host的webapps的默认存放目录
unpackWARs=“true” 是否自动产开war文件
autodeploy 自动部署
systemct restart tomcat 重启服务
当时的站点时部署在root下的
假如这个主机上还要部署其他的应用程序,做软连接方便以后更新
没有做部署其实也可以被访问
现在要可写
对于host组建里面还可以定义一个context组建
Context组件:
示例:
<Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/
url 路径 映射到哪个文档路径下,极其类似alias
1.path url 路径是什么
2.docbase 文档路径是什么
3.reloadable 是否可以自动装载的
(两个后面都不带斜线,要带就都带)
综合示例:
<Host name=“node1.magedu.com” appBase="/web/apps" unpackWARs=“true” autoDeploy=“true”》
<Valve className=“org.apache.catalina.valves.AccessLogValve” directory=“logs”
prefix=“node1_access” suffix=".log"
pattern="%h %l %u %t “%r” %s %b" /》
<Context path="/test" docBase=“test” reloadable=""》
<Valve className=“org.apache.catalina.valves.AccessLogValve” directory=“logs”
prefix=“node1_test_access_” suffix=".log"
pattern="%h %l %u %t “%r” %s %b" /》
</Context》
</Host》
删除刚才的目录
现在就找不到了
现在想通过/eshop来访问
编辑配置文件
在host内部加一个组件context
path 定义url /eshop
docbase 文档跟路径 /e-shop/shopxx
reloadable 是否自动重新装载
重启tomcat systemct restart
就成功了
context完全类似于alias
docbase使用相对路径就放在了host的appbase下,如果就使用默认名访问可以不定义context,如果想要别名进行访问,也可以照样定义context,就算使用相对路径也没有任何问题
组建内部还有种叫valve的组件(种 类很多,需要定义是哪一种类
accesslogvalve 基于日志访问控制的,remoteaddrvalve 基于地址访问控制的)
**一般定义的机会不太多,定义访问日志的机会还是有的,在配置文件中默认就有一个访问日志
复制valve 贴到host中
每一个host都可以使用自己的访问呢日志
prefix 日志前缀 suffix 后缀
pattern 指的是日志格式
"表示引号
%r请求方法,协议,url **
再次重启tomcat
访问主站,查看日志
rpm安装,默认在这
解压包的在下面
将来用的最多的就是配置host和context
经常需要配置自己的虚拟主机
只能基于主机名的虚拟主机
因为address 和port都是定义在connector上的,而不是定义在host上的
对于tomcat来讲基本配置没问题的,但是前面需要反代用户请求
如何去组合三种形式的反代
1.nt
2.at(基于http,ajp连接器)
为了能完整配置,换个主机来做,从头到尾如何配置反代,应用程序如何构建
第一台主机是反代服务器(两接口)
n2 tomcat
n3 tomcat
n1做两个接口,作为nginx反代服务器
n2内网主机
第一步先同步时间
还需要配置javahome catalinahome,内网主机需要访问管理接口,最好要设置好用户,基于admingui访问两个管理程序之前配置过可以复制过去
编辑server。xml
额外加一个虚拟主机,不再是默认的
配置内网地址
启动内网tomcat
可以使用内网地址来访问 了
n1服务器使用反代服务器
rm .ssh/khnownhosts
nginx做反代只需要加locaton
就全部反代过来
默认主机监听的是80端口,其他主机就只能用其他主机名来区别的
为了便捷,在conf.d/下进行修改
客户端机器加解析
现在访问其实就是这个就界面
可以在后端n2上创建一个测试应用,在它的默认网页下创建即可
示例程序:
演示效果,在TomcatA上某context中(如/test),提供如下页面
<%@ page language=“java” %>
TomcatA.magedu.com
<% session.setAttribute(“magedu.com”,“magedu.com”); %>
Session ID | <%= session.getId() %> |
Created on | <%= session.getCreationTime() %> |

不重启服务,直接访问试试
只要主机是同一个session是不变的

我们的访问其实都到达nginx,由nginx反代到后端主机
这样的话tomcat既要处理静态内容,还要处理动态内容
在nginx上.jsp的调度到后端主机上去,其他的调度到另外的主机上去
java有些文件是以do结尾的
现在不保存,
现在看看http如何反代,停止nginx服务
使用httpd做反代时配置方法稍微麻烦点,因为要考虑 到底用的是哪一种连接器来连接的
对httpd来讲,由三个模块
现在需要配置之httpd的虚拟主机
httpd -M 查看模块
proxy模块是主反代功能的,必须要启动起来
反代http协议模块 proxy,确认是安装的
proxyrequests off关闭正向代理
proxyvia 是否在响应报文中加via
proxypreservehost 是否把请求报文中的host首部一并转到后端去
反代主机由两个virtual host
如果后端主机也有虚拟主机,那么proxypath反代如果写的ip地址,该是反代到哪个主机上
应该是默认的,如果要对应
那么由两种方式,proxypath跟主机名,在不然可以保留主机头,传递给后端,让后端用主机头来判断
**require all granted 能够被哪些用户访问
prioxypass 写了/ 后面也一定要加/
**
关闭正向代理
能够把主机头传递给后端去
是否在响应报文中加一个via首部
所有的proxy功能
proxypass /代理到 192.168.10.11:8080/
proxypassreverse 如果后端主机返回一个重定向,这个url重定向结果响应给客户端
前面只是定义proxy功能能被谁使用
location / 定义哪些url能被访问
require all granted
路径无效,注释掉
启动服务
能够访问
查看日志
甚至可以访问test的url,加一行
httpd -t检查语法
重启httpd服务
可以访问了
如果把test映射成前端站点配置也可以
httpd -t检查语法重启服务
如果要使用ajp只需要把后面的链接改一下就可以了
**主机名改成iunix,连接器协议是ajp,端口不是8080,是8009
使用此功能一定是ajp模块要存在的 **
重启服务,没有问题能够访问
用ajp协议的时候,tomcat和反代服务器中间通讯用的是ajp的二进制协议,可以把端口注释掉,直接链接ajp连接器,后面的用户就不会直接访问tomcat8080端口了,可以避免用户绕过前端代理而直接访问后端服务器
提醒,如果后端主机上有多个虚拟主机,期望反代指向一个特定的虚拟主机而不是默认的,就不能使用ip地址来反代、
http上给的应该是主机名,并确保前端主机能够解析这个主机名
有可能httpd处于安全会隐藏这个首部
表示响应报文中加上via,表示由谁来代理 的
第一种方式
第二张at机制
mod_jk属于第三方模块,需要编译安装