tomcat2----基础配置
基础配置
https://tomcat.apache.org/tomcat-8.5-doc/introduction.html
CATALINA_HOME:代表您的 Tomcat 安装的根目录。如:/usr/local/tomcat
CATALINA_BASE:表示特定 Tomcat 实例的运行时配置的根。如果您想在一台机器上拥有多个 Tomcat 实例,请使用该CATALINA_BASE 属性
如果将属性设置为不同的位置,则 CATALINA_HOME 位置包含静态源,例如.jar文件或二进制文件。CATALINA_BASE 位置包含配置文件、日志文件、部署的应用程序和其他运行时要求
默认情况下,CATALINA_HOME 和 CATALINA_BASE 指向同一目录。当您需要在一台机器上运行多个 Tomcat 实例时,手动设置 CATALINA_BASE。这样做有以下好处:
- 更轻松地管理升级到更新版本的 Tomcat。因为具有单个 CATALINA_HOME 位置的所有实例共享一组 .jar文件和二进制文件,所以您可以轻松地将文件升级到更新版本,并将更改传播到使用相同 CATALIA_HOME 目录的所有 Tomcat 实例。
- 避免重复相同的静态.jar文件。
- 共享某些设置的可能性,例如setenvshell 或 bat 脚本文件(取决于您的操作系统)
tomcat目录结构
bin:脚本及启动时用到的类(查找顺序:先检查 CATALINA_BASE;回退提供给 CATALINA_HOME)
lib:类路径上添加更多资源的目录(查找顺序:先检查 CATALINA_BASE;CATALINA_HOME 第二次加载)
conf:配置文件
logs:目录实例特定的日志文件
webapps:自动加载的 Web 应用程序的目录,默认部署目录
work:包含用于部署的 Web 应用程序的临时工作目录目录
temp:临时文件使用的 JVM 目录
配置文件说明
server.xml:主配置文件
context.xml:每个 webapp 都可以有专用的配置文件,这些配置文件通常位于 webapp 应用程序目录下的 WEB-INF 目录中,用于定义会话管理器、JDBC 等;conf/context.xml 是为各 webapp 提供默认配置;
web.xml:每个 webapp “部署” 之后才能被访问:此文件则用于为所有的 webapp 提供默认部署相关的配置:
tomcat-users.xml:用户认证的账号和密码配置文件:
catalina.policy:当使用 - security 选项启动 tomcat 实例时会读取此配置文件来实现其安全运行策略;
catalina.properties:Java 属性的定义文件,用于设定类加载器路径,以及一些与 JVM 调优相关参数;
logging.properties:日志相关的配置信息:
index.jsp --> jasper --> index.jsp.java转换后java代码 --> javac --> index.jsp.class编译后的字节码 --> jvm
都存放在work目录下
日志管理log4j类库来生成日志信息,保存记录
tomcat核心组件 server.xml
<Server>
<Service>
<connector/>
<connector/>
...
<Engine>
<Host>
<Context/>
<Context/>
...
</Host>
<Host>
...
</Host>
...
</Engine>
</Service>
</Server>
每一个组件都由一个JAVA类实现,这些组件大体可分为以下几个类型
*组件:Server
服务类组件:Service
连接器组件:http,https,sjp(cpache jserv protocol)
容器类:Engline,Host,Context 内部部署应用程序,应用程序内部的运行的组件,范围越小,优先级越高,
被嵌套类:valve,logger,realm,loader,manager,... 辅助性组件,嵌套在上面某个组件的内部
集群类组件:listener,cluster,... 调度器上解决session sick,上游主机解决,session复制集群 session service存储服务器,共享分发多播的集群,或工作方式
DocumentRoot root 起始根目录
uri / <-> Directiory 与chroot效果
CATALINA_BASE/webapps/
JSP webapp的组织结构
有特定的组织形式、层次型的目录结构;主要包含了 servlet 代码文件、JSP 页面文件、类文件、部署描述符文件等;
/:webapp的根目录
index.jsp index.html:webapp的首页
WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和contest.xml配置文件
META-INF/:类似于WEB-INF/
classes/:类文件,当前webapp所提供的类
lib/:类文件,当前webapp所提供的类,被打包为jar模式
WEB-INF META-INF功能是相似的,可以有任意一种,WEB-INF是私有的
webapp归档格式
.war: webapp
.jar:EJB的类打包文件
.rar:资源适配类打包文件
.ear:企业级webapp
研发 --> 测试 --> 上线
deploying
没有装入相关的类库,JAVA会运行失败
部署(deployment)webapp 相关的操作:
deploy:部署,将 webapp 的源文件旋转于目标目录、配置 tomcat 服务器能够基于 context.xml 文件中定义的路径来访问此 webapp;将其特有类通过 class loader 装载至 tomcat;
有两种方式:
- 自动部署:auto deploy
-
手动部署:
1、冷部署:把 webapp 复制到指定位置,而后才启动 tomcat;
2、热部署:在不停止 tomcat 的前提下进行的部分;
部署工具:manager、ant 脚本、tcd(tomcat client deployer)等;
undeploy:反部署,停止 webapp,并从 tomcat 实例拆除其部分文件和部署名
stop:停止,不再向用户提供服务
start:启动处于 “停止” 状态的 webapp
redeploy:重新部署
示例:安全加固
不建议关闭Port,关闭会影响tomcat脚本关闭tomcat服务
新版本的tomcat,8005仅主机可以访问,可以修改下随机字符串
注意流程,先停止tomcat在修改此值
生成10位随机字符串
tr -dc ‘a-zA-Z0-9‘ < /dev/urandom |head -c 10
vim server.xml
<Server port="8005" shutdown="SHUTDOWN"> 将shutdown中的值修改为随机一段字符串
远程登录输入SHUTDOWN,则关闭tomcat 服务
telnet 127.1 8005
SHUTDOWN
server.xml配置文件:默认端口8080
默认是8080端口,而普通用户不能使用1-1024之内的端口
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
一般tomcat做为后端服务,不需要开启HTTPS,可以使用反代做HTTPS,这样层次就分开了,工具如nginx或者haproxy
server.xml配置文件:AJP请求协议
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
server.xml配置文件:修改引擎默认虚拟主机
一个引擎有多个虚拟主机,修改默认主机名称,defaultHost==Host name
<Engine name="Catalina" defaultHost="localhost">
虚拟主机仅使用主机名FQDN格式
appBase根目录
upackWARs如果文件是war格式是否自动展开
autoDeploy自动部署,热部署,热部署 autoDeploy 建议关闭,特别是某些文件更新,可以启停tomcat,也不是绝对,可根据应用场景
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
server.xml配置文件:修改日志功能
请求过滤功能,此功能是设置日志功能的
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
示例:定义一组虚拟主机
主站一定要定义ROOT目录名
配置文件主目录设置为/data/webapps注意,用户访问首页为/data/webapps/ROOT/
<Host name="node1.final.com" appBase="/data/webapps/"
uppackWARs="true" autoDeploy="flase">
</Host>
站点页面放入在/data/webapps/ROOT/index.jsp
实例:定义别名URL
path指的是URL路径,docBase表示网页文件目录,相对路径是基于<Host中的appBase路径,支持自动重载,不定义为默认值
在默认虚拟主机下添加Context,用户请求IP:PORT/test,访问/data/myapp目录
<Context path="/test" docBase="/data/myapp" reloadable=""/>
用户请求:http://IP:PORT/test --> /data/myapp目录下的内容
示例:Context添加日志
对某个Context定义日志名称
localhost_test.log
<Context path="/test" docBase="/data/myapp" reloadable="">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_test" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
</Context>
示例:Context中添加访问控制
<Context path="/test" docBase="/data/myapp" reloadable="">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_test" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1"/>
</Context>
示例:版本迭代
建议使用软链接的方式,便于管理
rm -f myapp && ln -sv myapp-v0.2/ myapp
./catalina.sh stop
./catalina.sh start
示例:启动用角色,让用户扮演角色对tomcat进行管理(此配置仅tomcat才会生效,注意语法格式)
查看认证文件tomcat-users.xml
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
tomcat管理页面
vim tomcat-users.xml 只有在tomcat启动才会生效,启动时才会被加载
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat123" roles="manager-gui"/>
客户端访问:http://192.168.10.2/manager
服务状态信息
JVM相关的运行时环境,可以进行调优
http://192.168.10.2/manager/status
tomcat虚拟主机管理
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat123" roles="manager-gui,admin-gui"/>
http://192.168.10.2/host-manager/html
示例:反代方式
1、独立运行tomcat,此方法不推荐
2、一台主机运行nginx --> tomcat(http协议),使用反代,本地tomcat
3、一台主机运行httpd --> tomcat(http协议),
4、一台主机运行httpd --> tomcat(ajp协议)
是否能做动静分离,需要看站点当时设计规划
若没有这样设计,最后全部反代,而不是只做动态反代
示例1 nginx --> tomcat
1、nginx配置
如果是模式匹配后面加URL后面加/
location / {
proxy_pass http://127.1:8080;
}
做动静分离,注意:tomcat有些静态图片功能会有问题,静态文件和功能不在同一个路径下,
location ~* "\.(jsp|do)$" {
proxy_pass http://127.1:8080/;
}
2、nginx和tomcat在本机,tomcat可直接监听127.1地址即可
在端口选项后添加address地址即可
vim server.xml
<Connector port="8080" address="127.0.0.1" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
示例2 http --> tomcat
查看模块
[root@final ~]# httpd -M | grep proxy
proxy_ajp_module (shared)
proxy_http_module (shared)
vim /etc/httpd/conf.d/http-tomcat.conf
<VirtualHost *:80>
ServerName node1.final.com
ProxyRequests Off
ProxyVia On
#ProxyPreserveHost Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://127.0.0.1:8080/
<Location />
Require all granted
</Location>
</VirtualHost>
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypreservehost
启用后,此选项会将来自传入请求的 Host: 行传递给代理主机,而不是ProxyPass行中指定的主机名
通常应打开此选项Off。它在特殊配置中最有用,例如基于代理的大众名称虚拟主机,其中原始主机标头需要由后端服务器评估
https://www.bocchi.tokyo/2019/05/27/ProxyPreserveHost-when-should-be-on/
当我们设置ProxyPass /images https://mybackend/images的时候,通过myfrontend服务器发往mybackend的request的Host Header应该是Host: mybackend(后端)
而如果ProxyPreserveHost on,则我们的request的header则回变成Host: myfrontend(前端)
当ProxyPreserveHost on 时,浏览器使用IP和访问主机名结果都是一样的
响应报文,代理取得信息头部,插入一个新的首部,并把值当前主机信息
ProxyVia On
控制代理对 Via: HTTP Headers 的使用,它的预期用途是控制沿着代理服务器链的代理请求的流。有关 Via:Headers 行的说明,请参见 RFC 2616(HTTP/1.1),第 14.45 节
如果设置为off,这是默认值,则不执行任何特殊处理。如果请求或回复包含 Via:标头,则它会原封不动地通过。
如果设置为on,则每个请求和回复都会Via:为当前主机添加一个 标题行。
如果设置为full,则每个生成的 Via:标题行都会另外将 Apache 服务器版本显示为Via:注释字段。
如果设置为block,则每个代理请求都将Via:删除其所有标题行。不会Via:生成新的 标题
使用jsp代理方式
tomcat启动ajp功能
<Connector protocol="AJP/1.3"
secretRequired=""
address="127.1"
port="8009"
redirectPort="8443" />
AJP相关报错
SEVERE [main] org.apache.catalina.core.StandardService.startInternal Failed to start connector [Connector[AJP/1.3-8009]]
Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.
解决方法有二种
Connector标签添加其中一项即可,都加上也可以
secret="TOMCAT_AJP_SECRET6567"
secretRequired=""
配置http
<VirtualHost *:80>
ServerName node1.final.com
ProxyRequests Off
ProxyVia On
#ProxyPreserveHost Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / ajp://127.1:8009/
<Location />
Require all granted
</Location>
</VirtualHost>
小结
热部署 autoDeploy 建议关闭,特别是某些文件更新,可以启停tomcat,也不是绝对,可根据应用场景
是否能做动静分离,需要看站点当时设计规划
若没有这样设计,最后全部反代,而不是只做动态反代