天天看点

Tomcat 之 tomcat安装和组件介绍

1  概述

tomcat使用java语言编写,本身自带webser,是一个简装的http server,安装后生产的文件一般放在webapp下对应目录,manager是应用程序管理,tomcat 的站点路径映射到ROOT,如定义主站点为/data/web/html/  为要定义为/data/web/html/ROOT。tomcat一般不会监听在低于1024的端口号,因为tomcat是java编程,不监听系统的端口 。tomcat一般不会直接直接处理请求,由代理调度动态请求过来处理,一般代理服务器也用来处理静态资源,实现动静结合,同时静态的资源可以用缓存服务器来实现,减去后端服务器的压力。

Tomcat是Java 2 EE技术体系的不完整实现;  JBoss是在tomcat的基础上添加很多功能

tomcat的运行实例,一个实例就是一个java进程,监听在某个套接字

连接器负责接收请求,将请求发给引擎(运行代码环境),一个server可以有多个请求。

服务是用来包含连接器和引擎的,一个服务内部只能有一个引擎,但是一个服务可以有多个连接器。一般而言,一个实例只提供一个服务(虽然可以多个服务)

这种形式实现了一个物理主机上多个主机,这个相当于通过虚拟服务器的方式来实现,根据不同的url来实现,但是这里每一个组件是有context来定义,相当于是web里的alias,jsp程序还是比较重的,因为运行前要加载类,如部署环境,把虚拟机依赖的库都加载上来。加载过程可以自己运行也可以用户手动指定tomcat的组件,java的jvm不能有效的使用大于32G的内存空间,如果物理机内存大于32G,可以分配为多个实例,背后监听在不同的套接字上。

2  安装Tomcat

tomcat可以通过官方下载包进行安装和yum源安装

2.1 官方包安装

官方链接:tomcat.apache.org,建议使用7或8的版本,下载源码安装,需要maven环境,比较麻烦,建议下载编译好的包。到官网上找到后缀为.gz的包,服务包.gz结尾的。一般是绿色服务器,解压到对应目录就可以用了。先部署jdk环境,然后在执行如下的安装

下载路径:https://tomcat.apache.org/download-80.cgi

tar xf apache-tomcat-8.0.47.tar.gz -C /usr/local
cd /usr/local/
ln -sv apache-tomcat-8.0.47/ tomcat      

添加账号tomcat,注意权限,一般需要用tomcat账号来启动,而不直接用root,所以相关文件要设置权限,使得tomcat账号具有读取或者写入权限

groupadd -g 91 tomcat
useradd -u 91 -g 91 -s /sbin/nologin tomcat
chown -R root.tomcat  /usr/local/tomcat/*
chown -R tomcat /usr/local/tomcat/{logs,temp,work,webapps}
chmod g+r /usr/local/tomcat/conf/*
vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH      

保存后执行. /etc/profile.d/tomcat.sh导出环境变量

然后执行 catalina.sh start 启动tomcat,注意,通过tar包安装的tomcat,由脚本catalina.sh来管理

默认8005,8009,8080端口都打开为启动完成,tomcat没有权限监听80端口

测试,浏览器输入如下,可以打开,则表示正常

http://172.18.50.72:8080/

2.2  yum安装

会自动安装servlet和 jsp

先部署jdk

yum install java-1.8.0-openjdk-devel      

再部署tomcat

yum install tomcat tomcat-lib tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps      

默认配置可以直接启动,命令如下

systemctl restart tomcat      

服务启动有点慢,要等8005,8009,8080端口都打开为启动完成

tomcat需要依赖jvm执行,没有主程序。/usr/sbin/tomcat是shell脚本,调用jvm实现

java运行默认监听三个端口:8009 ajp协议, 8080 http协议 ,8005管理接口

jps查看java进程

3  tomcat程序环境

3.1  tomcat的目录结构

bin:脚本,及启动时用到的类;

conf:配置文件目录;

lib:库文件,Java类库,jar;

logs:日志文件目录;

temp:临时文件目录;

webapps:webapp的默认目录;

work:工作目录,存放编译后的字节码文件;

# catalina.sh --help

debug             在调试器中启动Catalina

debug -security   用安全管理器调试Catalina

jpda start       在JPDA调试器下启动Catalina

run              在当前窗口中启动Catalina

run -security     从安全管理器的当前窗口开始

start             在另一个窗口启动Catalina

start  -security   从安全管理器的另一个窗口开始

stop            停止Catalina,等待5秒钟后进程 结束

stop n           停止Catalina,等待n秒钟后进程 结束

stop -force       停止Catalina,等待5秒钟后进程结束,如果进程还在运行,就强制终止进程。

stop n -force     停止Catalina,等待n秒钟后进程结束,如果进程还在运行,就强制终止进程。

configtest        在server.xml上运行基本语法检查 - 检查退出代码最为判断的结果

version           检查tomcat版本用的。                                

3.2  rpm包安装的程序环境

配置文件目录:/etc/tomcat

主配置文件:server.xml 

webapps存放位置:/var/lib/tomcat/webapps/

    examples

    manager

    host-manager

    docs

    Unit File:tomcat.service

环境配置文件:/etc/sysconfig/tomcat

4  tomcat的配置文件构成

server.xml:主配置文件;定义实例的初始化,为java虚拟机提供配置

web.xml:每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置;一般不需要修改,默认即可

context.xml:每个webapp都可以使用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置;一般不需要修改,默认即可

tomcat-users.xml:用户认证的账号和密码文件;角色(role),用户(User);此文件在tomcat启动时被装入内存;

例子,授权用户查看server status,Manager APP,Host Manager的界面

vim  /usr/share/tomcat/conf/tomcat-users.xml
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user username="tomcat" password="Pass123456" roles="manager-gui,admin-gui"/>      

catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策略; 

catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数;一般不需要修改,默认即可

logging.properties:日志系统相关的配置;        

通常要修改的是server.xml和tomcat-users.xml两个文件

5  Tomcat的核心组件介绍

<Server>
    <Service>
        <connector/>
        <connector/>
            ...
           <Engine>
                <Host>#这里的host需要是基于url的主机,因为ip和端口在连接器上
                    <Context/>
                    <Context/>
                        ...
                </Host>
                <Host>
                    ...
                </Host>
                ...
               </Engine>
    </Service>
</Server>      

每一个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:

顶级组件:Server,代表一个instance

服务类组件:Service

连接器组件:http, https, ajp(apache jserv protocol)

容器类:Engine, Host, Context,面向内部部署应用的

被嵌套类:valve, logger, realm, loader, manager, ...

集群类组件:listener, cluster(会话集群),...

JSP WebAPP的组织结构:部署应用程序,所依赖的类需要被装载后才能被运行,所以是重量级的。

/: webapps的根目录

index.jsp:主页;用引擎执行的代码,要以.jsp结尾,如果不需要引擎处理的文件,用.html结尾

WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件;描述当前路径的私有信息,不能让用户通过url直接访问。

较大的应用程序会有以下三个文件

META-INF/:类似于WEB-INF/;

classes/:类文件,当前webapp所提供的类;

lib/:类文件,当前webapp所提供的类,被打包为jar格式;jar为tomcat的打包文件。JVM访问这类文件,无需展开,直接访问

webapp归档格式:先打包,重启服务会自动把打包的文件展开为目录,只需要将链接指向新版本即可,可以用脚本实现。这叫脚本化发布。

有以下类型的打包文件

.war:webapp; 

.jar:EJB的类打包文件(类库);

.rar:资源适配器类打包文件;

.ear:企业级webapp;

部署(deploy)webapp的相关操作:可以通过代码实现

deploy:将webapp的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能够基于web.xml和context.xml文件中定义的路径来访问此webapp;将其特有的类和依赖的类通过class loader装载至JVM;

部署有两种方式:

    自动部署:auto deploy

    手动部署:

冷部署:把webapp复制到指定的位置,而后才启动tomcat;冷部署是最安全的部署方法

热部署:在不停止tomcat的前提下进行部署;

部署工具:manager、ant脚本、tcd(tomcat client deployer)等;                                        

undeploy:拆除(反部署),停止webapp,并从tomcat实例上卸载webapp;

start:启动处于停止状态的webapp;

stop:停止webapp,不再向用户提供服务;其类依然在jvm上;

redeploy:重新部署;

手动提供一测试类应用,并冷部署:

本例子将部署主机

mkdir -pv /usr/share/tomcat/webapps/test/{classes,lib,WEB-INF}      

创建主页文件

vim  /usr/share/tomcat/webapps/test/index.jsp 
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
    <title>Test Page</title>
</head>
<body>
    <% out.println("hello world");
    %>
</body>
</html>      

 测试,不需要重启服务,在浏览器输入如下url:http://172.18.50.73:8080/test/

tomcat的两个管理应用:

manager:管理应用程序

host-manager:管理虚拟主机

tomcat的常用组件配置:配置文件/usr/share/tomcat/conf/server.xml

Server:代表tomcat instance,即表现出的一个java进程;监听在8005端口,只接收“SHUTDOWN”。各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口; port="-1",表示不监听,或者把shutdown的命令设置为复杂,最好使用随机数。

Service:用于实现将一个或多个connector组件关联至一个engine组件;

Connector组件:

负责接收请求,常见的有三类http/https/ajp;

进入tomcat的请求可分为两类:

(1) standalone : 请求来自于客户端浏览器;用于实验环境

(2) 由其它的web server反代:来自前端的反代服务器;一般用http反向代理(AT)或者是nginx反向代理(NT),以下四类反代模型,关键是看反代用什么协议调度过来的。

nginx --> http connector --> tomcat 

httpd(proxy_http_module) --> http connector --> tomcat

httpd(proxy_ajp_module) --> ajp connector --> tomcat (这种方法,用户无法绕过代理直接访问)

httpd(mod_jk,已经过时,需要编译安装,不推荐使用) --> ajp connector --> tomcat

端口号和协议没有直接关系,因为端口号可以用户直接定义,maxthreads是接收请求的并发数量,一般不会再tomcat上部署https,一般是在反代上部署https。tomcat一般只监听本地和反代

属性:

port="8080" 

protocol="HTTP/1.1"

connectionTimeout="20000"

 address:监听的IP地址;默认为本机所有可用地址;

maxThreads:最大并发连接数,默认为200;rpm安装默认为150

enableLookups:是否启用DNS查询功能;建议关闭,加快速度

acceptCount:等待队列的最大长度;

secure:

sslProtocol:TLS 1.1或TLS 1.2

Engine组件:

Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点; 通常需要通过defaultHost来定义默认的虚拟主机;

name=

defaultHost="localhost"

jvmRoute=   #做集群的时候,基于cookie的会话粘性才需要启用jvmRoute

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;

(3) unpackWARs是自动展开打包的服务包

示例:

      <Host name="tc1.magedu.com" appBase="/appdata/webapps" unpackWARs="true" autoDeploy="true">
</Host>
# mkdir -pv /appdata/webapps
# mkdir -pv /appdata/webapps/ROOT/{lib,classes,WEB-INF}      

提供一个测试页即可;

例子,把以下配置放到Engine段里,独立的host段

<Host name="www.sunnytc.com" appBase="/sunny/webapps" 
            unpackWARs="true" autoDeploy="true" />      

#其中,斜线表示闭合,为配置段结束

mkdir  -pv   /sunny /webapps/ROOT/{lib,classes,WEB-INF}
vim  /sunny /webapps/ROOT/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
    <head>
        <title>sunnytc Test Page</title>
    </head>
    <body>
        <% out.println("hello sunnytc world");
        %>  
    </body>
</html>      
systemctl restart tomcat      

测试,在hosts里做好www.sunnytc.com的解析,用elinks测试如下

elinks -dump http://www.sunnytc.com:8080/      

Context组件:监听的地址和端口使用监听器来设置

<Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/>      

Valve组件:

<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" />

Valve存在多种类型:

定义访问日志:org.apache.catalina.valves.AccessLogValve

定义访问控制:org.apache.catalina.valves.RemoteAddrValve 

<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.16\.100\.67"/>

例子

valve定义过滤器,相对路径是相对catalina.sh定义而言,pattern定义日志格式。

<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" #prefix日志文件名的前缀,suffix日志后缀
pattern="%h %l %u %t &quot;%r&quot; %s %b" />  #pattern定义日志格式,可以查看官方文档里logging  valve定义
<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 &quot;%r&quot; %s %b" />
</Context>
</Host>