tomcat2----基础配置

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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %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,也不是绝对,可根据应用场景

是否能做动静分离,需要看站点当时设计规划
若没有这样设计,最后全部反代,而不是只做动态反代

posted @ 2021-09-08 09:54  Final233  阅读(182)  评论(0编辑  收藏  举报