简介

Tomcat 是 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 软件会的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些及个人共同开发而成。
Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。一般来说,Tomcat 虽然和 Apache 或者 这些 Web 服务器一样,具有处理 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端。
Tomcat核心组件
Web 容器:完成 Web 服务器的功能。
Servlet 容器:名字为 catalina,用于处理 Servlet 代码。
JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码。
因此 Tomcat 是 Web 应用服务器,也是一个 Servlet/JSP 容器。Tomcat 作为 Servlet 容器,负责处理客户请求,把请求传送给 Servlet,并将 Servlet 的响应传送回给客户。
Web容器
web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如JAVA中的Tomcat容器,ASP的IIS或PWS都是这样的容器。一个服务器可以有多个容器。
什么是 servlet?
Servlet 是Java Servlet 的简称,可以理解为是一个服务连接器,是用 Java 编写的服务器端程序,具有独立于平台和协议的特性, 简单的理解:servlet 就是一个中间件,包含了接口和方法,将客户端和数据库连接,从而实现动态网页的创建。
什么是 JSP?
JSP 全称 Java Server Pages,是一种动态网页开发技术。它使用 JSP 标签在HTML网页中插入 Java 代码。
标签通常以 <% 开头,以 %> 结束。
JSP 是一种 Java servlet,主要用于实现 Java web 应用程序的用户界面部分。
JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
Container 结构分析
每个 Service 会包含一个 Container 容器。在 Container 内部包含了 4 个子容器:
4个子容器的作用分别是:
Engine:引擎,用来管理多个虚拟主机,一个 Service 最多只能有一个 Engine;
Host:代表一个虚拟主机,也可以叫站点,通过配置 Host 就可以添加站点;
Context:代表一个 Web 应用,包含多个 Servlet 封装器;
Wrer:封装器,容器的最底层。每一 Wrapper 封装着一个 Servlet,负责对象实例的创建、执行和销毁功能。
Engine、Host、Context 和 Wrapper,这四个容器之间属于父子关系。 容器 由一个引擎可以管理多个虚拟主机。每个虚拟主机可以管理多个 Web 应用。每个 Web 应用会有多个 Servlet 封装器。
Tomcat 请求过程:
用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得;
Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;
请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等。
执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端。
在部署 Tomcat 之前必须安装好 jdk,因为 jdk 是 Tomcat 运行的必要环境。
这里选择手动搭建tomcat环境.JDK选择yum仓库的openJDK,大家也可以在官网下载RPM包安装 http://www.oracle.com/tecwork/java/javase/downloads/jdk8-downloads-2133151.html
一:安装JDK
1:检查yum仓库中openjdk的版本
[root@localhost ~]# yum list |grep ^java
这里选择安装java-1.8.0-openjdk
[root@localhost ~]# yum install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64 -y
2:查看Java-Openjdk是否安装成功
[root@localhost ~]# java -version
显示已经安装成功
二:安装配置Tomcat
1:检查yum仓库中tomcat的相关包
[root@localhost ~]# yum list |grep tomcat
[root@localhost ~]# yum install tomcat -y 直接选择在线安装
也可以在官网下载源码包 wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.83/bin/apache-tomcat-8.5.83.tar.gz
如果是下载源码安装就需要配置:配置 Tomcat 环境变量配置 Tomcat pid 文件和相关参数配置 Tomcat 服务脚本
Tomcat 环境变量
| [root@localhost ~]# wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.83/bin/apache-tomcat-8.5.83.tar.gz [root@localhost ~]# tar xf apache-tomcat-8.5.83.tar.gz -C /usr/local [root@localhost ~]# cd /usr/local/ [root@localhost java]# ln -sv apache-tomcat-8.5.83/ tomcat ‘tomcat’ -> ‘apache-tomcat-8.5.83/’ 配置变量: [root@localhost local]# vim /etc/profile.d/tomcat.sh # TOMCAT export CATALINA_HOME=/usr/local/tomcat # PATH export PATH=$PATH:$CATALINA_HOME |
配置 Tomcat pid 文件和相关参数
| [root@localhost local]# vim /usr/local/tomcat/bin/setenv.sh # add tomcat pid CATALINA_PID="$CATALINA_HOME/tomcat.pid" # add java opts JAVA_OPTS="-server -XX:PermSize=256M -XX:MaxPermSize=512m -Xms512M -Xmx512M -XX:MaxNewSize=256m" |
配置 Tomcat 服务脚本
| [root@localhost]# vim /usr/lib/systemd/system/tomcat.service [Unit] Description=Apache Tomcat Web Application ContainerAfter=syslog.target network.target [Service] Type=forking PIDFile=/usr/local/tomcat/tomcat.pid ExecStart=/usr/local/tomcat/bin/catalina.sh start ExecReload=/bin/kill -s HUP MAINPID ExecStop=/bin/kill−s QUIT MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target 启动服务: [root@localhost]# systemctl daemon-reload [root@localhost]# systemctl status tomcat.service [root@localhost]# systemctl enable tomcat.service [root@localhost]# systemctl is-enabled tomcat.service enabled [root@localhost]# systemctl start tomcat.service # 查看 Tomcat 开启端口状态 [root@localhost ~]# netstat -lnutp | grep :8080 tcp6 0 0 :::8080 :::* LISTEN 3060/java |
2:这里我选择的是在线安装:
[root@localhost ~]# yum install tomcat -y
[root@localhost ~]# systemctl start tomcat 启动tomcat
[root@localhost ~]# rpm -ql tomcat 查看yunm安装的tomcat生成文件的路径
tomcat默认端口是8080,接下来浏览输入地址:http://ip:8080/。这个页面暂时是无法访问
由于tomcat的web页面是需要安装插件的,这里继续用 tomcat-webapps 和 tomcat-admin-webapps 两个插件包
[root@localhost ~]# yum install tomcat-webapps tomcat-admin-webapps -y
[root@localhost ~]# systemctl restart tomcat 重启服务
在浏览器中输入http://10.0.0.101:8080/
3:提升 Tomcat 启动速度
●tomcat 启动慢的原因是随机数产生遭到阻塞,遭到阻塞的原因是 熵池大小 。
●/dev/random:阻塞型,读取它就会产生随机数据,但该数据取决于熵池噪声,当熵池空了,对/dev/random 的读操作也将会被阻塞。
●/dev/urandom:非阻塞的随机数产生器,它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。
# 查看是否有足够的熵来用于产生随机数
[root@localhost ~]# cat /proc/sys/kernel/random/entropy_avail
1418
# 安装rngd服务(熵服务,增大熵池)
[root@localhost ~]# yum install rng-tools
# 开机自启动服务
[root@localhost ~]# systemctl enable --now rngd
# 再次查看
[root@localhost ~]# cat /proc/sys/kernel/random/entropy_avail
2835
我们也可以在编辑/etc/tomcat/tomcat-users.xml配置文件来查看跟详细的状态页面,但是这种配置不要使用在生产环境中
[root@localhost ~]#vim /etc/tomcat/tomcat-users.xml
| # 添加如下内容 [root@localhost local]# vim /etc/tomcat/tomcat-users.xml <role rolename="admin-gui"/> <role rolename="admin-script"/> <role rolename="manager-gui"/> <role rolename="manager-jmx"/> <role rolename="manager-script"/> <role rolename="manager-status"/> <user username="tomcat" pass="tomcat" roles="admin-gui,manager-gui,managerjmx,manager-script,manager-status,admin-script"/> # 允许访问 Manager App [root@localhost local]# vim /var/lib/tomcat/webapps/host-manager/META-INF/context.xml <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" /> # 允许访问 Host Manager [root@localhost local]# vim /var/lib/tomcat/webapps/manager/META-INF/context.xml <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" /> # 重启 Tomcat 服务 [root@node01 local]# systemctl restart tomcat |
4:Tomcat 虚拟主机配置
修改 server.xml
[root@localhost ~]# systemctl stop tomcat
[root@localhost /]# cd /etc/tomcat
[root@localhost ]# cp server.xml{,.bak}
# 添加虚拟主机配置
| [root@localhost]# vim server.xml </Host> <Host name="www.a.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context docBase="/web/a" path="" reloadable="flase" /> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="www.a.com_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Host name="www.b.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context docBase="/web/b" path="" reloadable="flase" /> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="www.b.com_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> |
虚拟主机目录及文件准备
| [root@localhost]# mkdir -p /web/{a,b} [root@localhost]# vim /web/a/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP a page</title> </head> <body> <% out.println("Welocome to test site,http://www.a.com");%> </body> </html> [root@localhost]# vim /web/b/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP a page</title> </head> <body> <% out.println("Welocome to test site,http://www.b.com");%> </body> </html> |
配置 hosts 解析
[root@localhost]# vim /etc/hosts
# 添加:
10.0.0.101 www.a.com www.b.com
重启 Tomcat
[root@localhost]# systemctl restart tomcat.service
测试
[root@localhost]# curl www.a.com
5:Tomcat 配置文件参数优化
常用的优化相关参数如下:
【redirectPort】如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的 8443 端口。
【maxThreads】Tomcat使用线程来处理接收的每个请求,这个值表示Tomcat可创建的最大的线程数,即支持的最大并发连接数,默认值是 200。
【minSpareThreads】最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是 10。
【maxSpareThreads】最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值是-1(无限制)。一般不需要指定。
【processorCache】进程缓冲器,可以提升并发请求。默认值是200,如果不做限制的话可以设置为-1,一般采用maxThreads的值或者-1。
【URIEncoding】指定 Tomcat 容器的 URL 编码格式,一般采用UTF-8作为默认编码。
【connnectionTimeout】网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常默认 20000 毫秒就可以。
【enableLookups】是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为 false,则直接返回 IP 地址,为了提高处理能力,应设置为 false。
【disableUploadTimeout】上传时是否使用超时机制。应设置为 true。
【connectionUploadTimeout】上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。
【acceptCount】指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为 100 个。
【maxKeepAliveRequests】指定一个长连接的最大请求数。默认长连接是打开的,设置为1时,代表关闭长连接;为-1时,代表请求数无限制
【compression】是否对响应的数据进行GZIP压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为 off,压缩数据后可以有效的减少页面的大小,一般可以减小 1/3 左右,节省带宽。
【compressionMinSize】表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是 2048。
【compressableMimeType】压缩类型,指定对哪些类型的文件进行数据压缩。
【noCompressionUserAgents="gozilla, traviata"】对于以下的浏览器,不启用压缩
胜象大百科









