一、 Tomcat简介
Tomcat服务器是Apache组织开发的一种JSP引擎,同时支持Servlet,是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,可以作为独立的Web服务器来使用。Tomcat 服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
Tomcat 是一种具有JSP环境的Servlet容器,Servlet容器是代替用户管理和调用 Servlet的运行时外壳。JSP(Java Server Pages)是一种运行于服务器端的动态网页开发技术,它基于Java技术,执行JSP时需要在Web服务器上架设一个编译JSP网页的引擎。Servlet容器,负责处理客户请求,当客户请求来到时,Servlet容器获取请求,然后调用某个Servlet,并把Servlet的执行结果返回给客户。
Tomcat作为Web服务器方面,Tomcat处理静态HTML页面时不如Apache迅速,也没有Apache健壮,所以我们一般将Tomcat与Apache配合使用,让Apache对网站的静态页面请求提供服务,而Tomcat作为专用的JSP引擎,提供JSP解析,以得到更好的性能。
Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。Tomcat以面向对象的方式运行,它可以在运行时动态加载配置文件中定义的对象结构。
1.1 Tomcat运行环境
Tomcat使用java语言来编写,tomcat和php一样都是用来处理动态程序的(也可以解析静态资源)。tomcat可以处理.jsp或者.do结尾的动态文件,处理时并不是tomcat本身去处理,而是交给后端的jvm来处理,也就是java虚拟机来处理,处理之前先装入tomcat的类文件,然后由jvm来处理,所以安装tomcat必须先安装JDK(Java Development Kit)。JDK有两种开源的软件可以安装,OpenJDK和Oracle JDK.
OpenJDK: java-VERSION-openjdk;java-VERSION-openjdk-headless;java-VERSION-openjdk-devel ;
CentOS 7: VERSION:1.6.0, 1.7.0, 1.8.0
Oracle JDK :jdk-12_linux-x64_bin.rpm
1.1.1 OpenJDK的安装
#yum install java-1.8.0-openjdk-devel.x86_64
#java -version
1.1.2 Oracle JDK的安装
在oracle官方网站上下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html
#rpm -ivh jdk-12_linux-x64_bin.rpm
二 、配置tomcat 服务器
2.1 安装jdk软件
#yum provides openjdk
#yum install java-1.8.0-openjdk-devel.x86_64
#rpm -ivh jdk-12_linux-x64_bin.rpm
]# cd /usr/java/
]#ll #有两个软链接文件,一个指向的是默认的,一个指向的是最新的
总用量 4
lrwxrwxrwx. 1 root root 16 5月 19 2017 default -> /usr/java/latest
drwxr-xr-x 10 root root 111 6月 15 17:32 jdk-12
drwxr-xr-x. 9 root root 4096 5月 19 2017 jdk1.8.0_77
lrwxrwxrwx 1 root root 16 6月 15 17:32 latest -> /usr/java/jdk-12
定义PATH变量:
]# echo KaTeX parse error: Expected 'EOF', got '#' at position 7: PATH
]#̲ export PATH=/…PATH ##临时定义
]# vim /etc/profile ##添加下面一行
export PATH=/usr/java/latest/bin/:$PATH
设置完PATH变量,java虚拟机自动开启,查看:
]# java -version
java version “12” 2019-03-19
2.2 安装tomcat
#yum install tomcat tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps
#rpm -q tomcat ##查看版本
#rpm -qc tomcat
/etc/logrotate.d/tomcat
/etc/sysconfig/tomcat
/etc/tomcat/catalina.policy
/etc/tomcat/catalina.properties
/etc/tomcat/context.xml
/etc/tomcat/log4j.properties
/etc/tomcat/logging.properties
/etc/tomcat/server.xml
/etc/tomcat/tomcat-users.xml
/etc/tomcat/tomcat.conf
/etc/tomcat/web.xml
]# cat /usr/sbin/tomcat //tomcat 是一个脚本文件,通过脚本文件调用java程序。
]# tomcat version ##查看版本信息
Server version: Apache Tomcat/7.0.76
Server built: Jun 8 2017 20:39:14 UTC
Server number: 7.0.76.0
OS Name: Linux
OS Version: 3.10.0-327.el7.x86_64
Architecture: amd64
JVM Version: 12+33
JVM Vendor: Oracle Corporation
]# tomcat start ##启动tomcat服务
]# systemctl status tomcat
]# ps -aux | grep tomcat ##发现tomcat启动的是一个java虚拟机程序
]# jps -v ##启动过程,先装载tomcat的类文件完成自启,然后运行java虚拟机程序,所以tamcat真正运行的是一个java程序。
]# netstat -antulp | grep java
##监听端口有三个:8080为http协议的接口,8009为ajp协议的接口,8005为管理接口
tcp6 0 0 :::8009 ::😗 LISTEN 23662/java
tcp6 0 0 :::8080 ::😗 LISTEN 23662/java
tcp6 0 0 127.0.0.1:8005 ::😗 LISTEN 23662/java
#yum -y install telnet
#telnet 127.0.0.1 8005
2.3 进行安全设置:
]# vim /etc/tomcat/server.xml
修改成port=-1,就表示关闭端口,或者openssl rand -hex 10 生成一个随机数来当shuntdown。
]# firefox http://192.168.4.254:8080/ ##访问http协议的接口可以看到web站点
2.4 Tomcat binary release
下载地址 :http://tomcat.apache.org/, apache-tomcat-7.0.94.tar.gz
#tar -xvf apache-tomcat-7.0.94.tar.gz -C /usr/local/
#ln -s apache-tomcat-7.0.94/ tomcat
#useradd tomcat ##运行tomcat时最好以普通用户的身份运行,创建一个tomcat用户
#cat /etc/passwd | grep tomcat
#vim /etc/passwd 将tomcat中/sbin/nologin 改为/bin/bash //让用户能登录系统
#cd /usr/local/apache-tomcat-7.0.94
#ls
#chown -R root:tomcat ./* ##修改tomcat目录下的文件的所有者和所属组
#chown -R tomcat ./{logs,temp,work,webapps,conf} ##将这些目录的所有者修改为tomcat
#export PATH=/usr/local/tomcat/bin/:KaTeX parse error: Expected 'EOF', got '#' at position 6: PATH
#̲vim /etc/prof…PATH
#echo KaTeX parse error: Expected 'EOF', got '#' at position 7: PATH
]#̲ pwd
/usr/local… cd /usr/local/apache-tomcat-7.0.94/bin/
bash-4.2$ pwd
/usr/local/apache-tomcat-7.0.94/bin
bash4.2$ ./catalina.sh
-bash-4.2$ catalina.sh version
-bash-4.2$ ./startup.sh ##tomcat 启动
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/latest
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
2.5 Tomcat程序环境
#rpm -ql tomcat
/etc/sysconfig/tomcat ##特殊服务配置文件
/etc/tomcat ##配置文件目录
/etc/tomcat/server.xml ##主配置文件
/etc/tomcat/tomcat.conf ##全局配置文件
/etc/tomcat/tomcat-users.xml ##用户认证的账号和密码文件;角色(role),用户(User),此文件在tomcat启动时被装入内存
/usr/share/tomcat/webapps ##webapp的默认根目录
/var/log/tomcat ##日志文件
/var/log/tomcat/catalina.out
#/usr/local/tomcat/ ##tomcat的目录结构
bin conf lib logs temp webapps work
bin :脚本目录,及启动时用到的类
catalina.sh,用于启动和关闭tomcat服务器
configtest.sh,用于检查配置文件
startup.sh,启动Tomcat脚本
shutdown.sh,关闭Tomcat脚本
conf:配置文件目录:
server.xml,Tomcat 的全局配置文件
web.xml,为不同的Tomcat配置的web应用设置缺省值的文件
tomcat-users.xml,Tomcat用户认证的配置文件
Tomcat的配置文件是xml格式的,不能使用#进行注释
lib:库文件,Java类库,jar:
包含被Tomcat使用的各种各样的jar文件,在Linux/UNIX上任何这个目录中的文件将被附加到Tomcat的classpath中。
logs:日志文件目录:
localhost_access_log 访问日志;
localhost.2013-09-18.log,错误和其它日志
manager.2013-09-18.log,管理日志
catalina.2013-09-18.log,Tomcat启动或关闭日志文件
temp:临时文件目录;
webapps:webapp的默认目录,即Tomcat的主要Web发布目录。含Web应用的程序 (JSP、Servlet和JavaBean等)
work:工作目录,存放编译后的字节码文件,即Tomcat将翻译JSP文件得到的Java文件和class文件放在这里。由Tomcat自动生成,这是Tomcat放置它运行期间的中间(intermediate)文件(诸如编译的JSP文件)地方。如果当Tomcat运行时,你删除了这个目录那么将不能够执行包含JSP的页面。
2.6 Tomcat组件
Tomcat是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的给件是CATALINA SERVLET容器,其他的组件按照一定的格式要求配置在这个顶层容器中。
组件大体可分为以下几个类型:
顶级组件:Server
服务类组件:Service
连接器组件:http, https, ajp(apache jserv protocol)
容器类:Engine, Host, Context
被嵌套类:valve, logger, realm, loader, manager, …
集群类组件:listener, cluster, …
Tomcat中真正处理客户请求与生成响应的三个组件是Engine 、Host、 Context。
-
Server组件
通常一个JVM只能包含一个Tomcat实例,一台物理服务器上可以启动多个JVM,每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口,各server监听的端口不能相同。
相关属性:
className: 用于实现此Server容器的完全限定类的名称,默认为org.apache.catalina.core.StandardServer;
port: 接收shutdown指令的端口,默认仅允许通过本机访问,默认为8005;
shutdown:发往此Server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN; -
Service组件
一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。一个server可以包含多个service组件,但通常情下只为一个service指派一个server。
给服务命名可以方便管理员在日志文件中识别不同服务产生的日志,
相关属性:
className: 用于实现service的类名,一般都是org.apache.catalina.core.StandardService。
name:此服务的名称,默认为Catalina; -
Connector组件
负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,默认的连接器是基于HTTP/1.1的Coyote。
负责接收请求,连接内部的Engine,常见的有三类http/https/ajp;
相关属性:
port=“8080”,监听端口,默认为0;
protocol=“HTTP/1.1”,连接器使用的协议,默认为HTTP/1.1,定义AJP协议时通常为AJP/1.3;
connectionTimeout=“20000”,等待客户端发送请求的超时时间,单位为毫秒,默认为60000,即1分钟;
address:监听的IP地址;默认为本机所有可用地址;
maxThreads:最大并发连接数,默认为200;
enableLookups:是否启用DNS查询功能,即是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名,默认为true;
acceptCount:等待队列的最大长度,通常在tomcat所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中;
secure=“TRUE” :一般tomcat不会使用https,因为tomcat本身运行起来已经很慢了,加上https就更慢了
sslProtocol:ssl协议类型;
redirectPort:如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口;Tomcat连接器架构:基于Apache做为Tomcat前端的架构来讲,Apache通过mod_jk、mod_jk2或mod_proxy模块与后端的Tomcat进行数据交换。
常见于server.xml中的连接器类型通常有4种:HTTP连接器; SSL连接器; AJP 1.3连接器 ; proxy连接器
连接器协议:
Tomcat的Web服务器连接器支持两种协议: AJP(Apache JServ Protocol)协议; HTTP协议 ; -
Engine组件
引擎是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。 -
Host组件
在Tomcat中只支持基于FQDN的“虚拟主机”, 主机组件位于engine内部用于接收请求并进行相应处理的主机或虚拟主机。
相关属性:
appBase:设置默认网页文件的存放路径,也就是根目录,相当于httpd的document root
unpackWARs:如果我们拿到的一个程序是.war格式的,把它放到网页文件存放的目录下会自动展开。
autoDeploy: 是否启动自动部署功能
6) Context组件
Context组件是最内层次的组件,它表示Web应用程序本身。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。
相关属性:
path:表示访问的uri,代表的是个别名
docBase: 指定Web应用的文件路径 ,绝对路径,或者相对于的appBase属性的相对路径。
reloadable: 如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。在开发阶段将reloadable属性设为true,有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷,建议在Web应用的发布阶段将reloadable设为false。
7) Valve组件
用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。
一个容器内可以建立多个Valve,而且Valve定义的次序也决定了它们生效的次序。
相关属性:
AccessLogValve:访问日志Valve
ExtendedAccessValve:扩展功能的访问日志Valve
JDBCAccessLogValve:通过JDBC将访问日志信息发送到数据库中;
RequestDumperValve:请求转储Valve;
RemoteAddrValve:基于远程地址的访问控制;
RemoteHostValve:基于远程主机名称的访问控制;
SemaphoreValve:用于控制Tomcat主机上任何容器上的并发访问数量;
JvmRouteBinderValve:在配置多个Tomcat为以Apache通过mod_proxy或mod_jk作为前端的集群架构中,当期望停止某节点时,可以通过此Valve将用户请求定向至备用节点;使用此Valve,必须使用JvmRouteSessionIDBinderListener;
8) Logger组件
用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。
9) realm组件
用于用户的认证和授权。Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。
一个Realm表示一个安全上下文,它是一个授权访问某个给定Context的用户列表和某用户所允许切换的角色相关定义的列表。定义Realm时惟一必须要提供的属性是classname,用于表示此Realm认证的用户及角色等认证信息的存放位置。