Tomcat服务器简介及常见问题处理

1、服务器概述

1.1、什么是服务器?

服务器:分为服务器硬件服务器软件。在硬件服务器(一台计算机)安装了服务器软件,就可以对外界提供服务,比如:让其他计算机上的浏览器来进行访问。

  • 服务器硬件是一台在互联网上具有独立IP地址的计算机,比如我们面前的计算机也可以作为服务器使用。
  • 服务器软件是一个计算机程序(软件), 比如在mysql服务器软件、tomcat服务器软件等。

1.2、什么是Web服务器?

  • Web服务器是可以向“发出请求的浏览器提供文档”的程序。 比如在访问百度时,其实就是在访问百度的服务器。
  • Web服务器是指驻留于因特网上某种类型计算机的程序。当浏览器(客户端)连接到服务器,请求服务器上的文件时,服务器将处理该请求并将文件发送到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。

2、tomcat下载、安装、启动、配置

2.1、下载tomcat服务器

下载地址:http://tomcat.apache.org/
tomcat有很多版本,有解压版和安装版,还分windows (还分为32位和64位班)和 x版,根据自己的需求,选择对应的版本下载。
tomcat服务器运行需要jdk的支持,版本对应为:

  • tomcat5 需要jdk4以上支持
  • tomcat6 需要jdk5以上支持
  • tomcat7 需要jdk6以上支持
  • tomcat8 需要jdk7以上支持

2.2、安装、启动tomcat服务器

  • 安装tomcat服务器
    绿色版解压之后就可以使用
    在这里插入图片描述
  • 配置环境变量
    解压后还需要配置JAVA_HOME环境变量,指向jdk的根目录,指定tomcat启动时使用哪个jdk
    变量名:JAVA_HOME (注意中间是下划线)
    变量值:JDK的根目录, 例如: C:\Program Files\Java\jdk1.8.0_161 (注意最后没有分号)
    在这里插入图片描述
    检查JAVA_HOME环境变量是否配置成功:
    在这里插入图片描述
  • 启动tomcat
    通过bin/startup.bat启动tomcat
    通过bin/shutdown.bat关闭tomcat
    在这里插入图片描述
    测试:
    通过访问 http://localhost:8080 如果能够看到tomcat的首页就证明tomcat安装配置成功
  • 修改tomcat默认端口
    tomcat服务器默认监听的端口号为 8080,每次访问时都需要在主机名或IP地址后跟上端口号,如果想省略不写,将端口号修改为80即可!
    找到 [tomcat安装目录]/conf/server.xml文件(tomcat服务器的核心配置文件),修改文件中的如下配置:
    在这里插入图片描述
    将port改为80即可……
    修改完后需要重启服务器才可以生效。

3、tomcat目录结构

tomcat服务器软件安装之后会生成一些目录和文件,下面分别来介绍这些目录的作用:
在这里插入图片描述

  • bin:tomcat批处理文件的存放目录
  • conf:tomcat配置文件所在的目录,其中server.xml是tomcat的核心配置文件
  • lib:tomcat运行时所依赖的jar包存放的目录
  • logs:tomcat日志文件所在的目录
  • temp:tomcat运行时产生的临时文件存放的目录
  • webapps:是localhost虚拟主机管理的目录,放在这个目录下的web应用可以通过浏览器访问localhost主机来访问,在服务器上bai部署duweb项目时,直接将项目war包放zhi入tomcat中的webapps文件下后重启tomcat后,war包会自动解压,这时用ip+端口+项目名称就可以访问项目,如:localhost:8080/web项目名称/servlet路径……
    简单说,webapps目录就是服务器资源的存放目录,我们可以将一些网页(html,css,js)或图片等资源放在该目录下,让外界通过浏览器来访问。
  • work:tomcat运行时产生的工作文件存放目录,是tomcat的工作目录

4、虚拟主机和Web应用

4.1、虚拟主机:

在tomcat服务器中,默认提供了一个站点,就是localhost,这个站点也叫作虚拟主机。
在这里插入图片描述

4.2、Web应用:

webapps目录是虚拟主机默认管理的目录,放在这个目录中的文件夹,就是web应用。
web应用简单理解就是一个目录,在这个目录中可以存放很多资源文件(比如:html/css/js/图片/jsp/servlet等)。
web应用是为了实现某一功能而将准备好的所有的web资源按照一定结构组织起来的文件夹。
虚拟主机不能直接管理web资源,web资源必须组织成web应用才可以交给虚拟主机去管理。
在这里插入图片描述
web应用的目录结构:
在这里插入图片描述

4.3、Tomcat、虚拟主机、web应用的关系

在这里插入图片描述
在这里插入图片描述

5、tomcat常用调优配置项

5.1、内存调优

tomcat一般都有默认的内存大小,其默认值对整个物理内存来说非常小,如果不配置tomcat的内存,会大大浪费服务器的资源,验证影响系统的性能,所以对tomcat的内存配置对用户量比较大的系统尤为重要。
windows平台下在bin目录下的catalina.bat文件中,找到@echo off然后再它的下面一行添加如下类似语句。
SET CATALINA_OPTS= -Xms512m -Xmx512m -Xmn125m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
参数说明详见:JVM内存模型解析

5.2、网络优化

5.2.1、4种网络模式

5.2.1.1、BIO

同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
该模式下每个请求都会创建一个线程,对性能开销大,不适合高并发场景。优点是稳定,适合连接数目小且固定架构。
Tomcat 8.0以前默认网络模型是BIO

5.2.1.2、NIO

同步非阻塞式,jdk1.4 之后实现的新IO。该模式基于多路复用选择器监测连接状态在同步通知线程处理,从而达到非阻塞的目的。比传统BIO能更好的支持并发性能。Tomcat 8.0之后默认采用该模式
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

5.2.1.3、NIO2(AIO)

异步非阻塞式IO,jdk1.7后之支持 。与nio不同在于不需要多路复用选择器,而是请求处理线程执行完程进行回调调知,已继续执行后续操作。Tomcat 8之后支持。
服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

5.2.1.4、APR

全称是 Apache Portable Runtime/Apache可移植运行库),是Apache HTTP服务器的支持库。可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从操作系统层面解决io阻塞问题。该模式使用需要编译安装APR 库。
APR也是在Tomcat上运行高并发应用的首选模式。

5.2.2、配置网络模型

配置 server.xml 文件当中的修改即可:

  • BIO:protocol=“org.apache.coyote.http11.Http11Protocol“
  • NIO:protocol=”org.apache.coyote.http11.Http11NioProtocol“
  • AIO:protocol=”org.apache.coyote.http11.Http11Nio2Protocol“
  • APR:protocol=”org.apache.coyote.http11.Http11AprProtocol“

Tomcat启动的时候,可以通过log看到Connector使用的是哪一种运行模式:

  • Starting ProtocolHandler [“http-bio-8080”]
  • Starting ProtocolHandler [“http-nio-8080”]
  • Starting ProtocolHandler [“http-apr-8080”]

5.3、线程优化

在server.xml中有:

<Connector port="80" protocol="HTTP/1.1" 
	maxThreads="600" 
	minSpareThreads="100" 
	maxSpareThreads="500" 
	acceptCount="700" 
	connectionTimeout="20000" />

各参数意义如下:

  • maxThreads:最大线程数,表示最多同时处理x个连接,默认值是200(Tomcat7和8都是的)。如果该Connector绑定了Executor,这个值会被忽略,因为该Connector将使用绑定的Executor,而不是内置的线程池来执行任务。
  • minSpareThreads:表示初始化x个连接,即活跃线程数或最小空闲线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。
  • maxSpareThreads:表示最多可以有x个连接,一旦超过x个,则会关闭不再需要的线程; 即 最大空闲线程数,在最大空闲时间内活跃过,但现在处于空闲,若空闲时间大于最大空闲时间,则回收,小于则继续存活,等待被调度。
  • acceptCount:队列大小,当同时连接的人数到达maxThreads时还可以排队,队列大小为x,超过x就不处理。
  • connectionTimeout:最大超时。

6、部署web应用

在tomcat中默认提供了一个虚拟主机:localhost,指向webapps。
在这里插入图片描述
因此我们可以将WEB应用部署在localhost主机下.

6.1、部署方式一

将组织好的WEB应用的目录直接复制到localhost主机默认管理的目录下(webapps)即可,例如:
在这里插入图片描述

6.2、部署方式二

达成war包,放到webapps目录下,启动tomcat时会自动解压。webapp下的war只会解压一次,需要重新解压请配置:unpackWARs=true,autoDeploy=true。
如果是webapps下的工程更新后没有加载,则通过修改server.xml去加载。见属性reloadable:

<Host appBase="webapps" name="localhost">
	<Context path="/samples">
		<WatchedResource>WEB-INF/web.xml</WatchedResource>
	</Context>
	<Context path="/profiler">
		<WatchedResource>WEB-INF/web.xml</WatchedResource>
	</Context>
	<Context path="/flex">
		<WatchedResource>WEB-INF/web.xml</WatchedResource>
	</Context>
	<!-- 配置直接通过域名访问/Samples应用 -->
	<Context path="" docBase="/samples" debug="0" reloadable="true">
	</Context>
</Host>

6.3、访问方式

在这里插入图片描述

7、扩展内容

7.1、配置缺省WEB应用

访问Tomcat服务器的主页地址是:
http://localhost
放问news下的hello.html的地址是:
http://localhost/news/hello.html
那么,如何让访问地址变短,便于记忆,比如baidu.com,taobao.com?
在访问服务器中的WEB应用下的资源时, 如果不想写WEB应用的虚拟目录的名称, 可以将当前WEB应用配置为缺省的WEB应用.配置方式是将WEB应用的虚拟目录名称改为ROOT即可!(将news目录名重命名为大写的ROOT)
此时访问路径变成:
http://localhost/hello.html
在这里插入图片描述

7.2、配置WEB应用的主页

如果在访问WEB应用下某一个资源时(比如hello.html),不想书写资源的路径,可以将这个资源页配置为WEB应用的主页,在访问时就可以省略该资源的路径。
配置方式为: 在WEB应用的web.xml文件中, 添加如下配置:
在这里插入图片描述
此时访问路径变成:http://localhost

7.3、打war包

所谓的war包其实就是一种压缩包, 就像jar包、zip包和rar包一样
可以将开发好的Web应用中的所有文件打成一个war包, 好处:

  • war包也是压缩包, 压缩之后, 文件的整体体积会减少;
  • 将整个Web应用中的所有文件打成一个war文件, 便于传输;
  • 将war文件部署到虚拟主机中(直接把war压缩文件复制到webapps目录下即可), 会自动解压发布;

打war包的方式:
进入应用的目录,用压缩工具打成 xxx.zip包,然后把后缀名zip改为war即可。
注意事项:

  • 压缩的文件和目录名不能包含中文字符,否则不会自动解压
  • 压缩后的文件名不能和webapps下的目录名一样,否则也不会自动解压
  • 先打成一个zip包,再改为war格式。

8、常见问题处理方法

8.1、端口占用问题

如果在启动时报端口占用的错误:
在这里插入图片描述
这是是因为服务器在启动的过程中需要监听80端口, 而该端口已经被别的进程所占用, 因此服务器启动失败!
原因分析:
(1)可能是之前启动的tomcat服务器没有完全关闭,仍然在占用80端口,所以导致此次启动失败。可以采用下面的方式一进行解决。
(2)有可能是别的程序在占用80端口,需要找出占用80端口的进程,再结束进程即可。可以采用下面的方式二进行解决。
解决方式一: 找到shutdown.bat命令, 双击运行, 将服务器按照正常的流程再关闭一次!
解决方式二: 如果是别的程序占用了80端口,导致服务器启动失败, 在cmd中通过netstat -ano | findstr 80命令, 查看占用80端口的进程,例如:
在这里插入图片描述
根据进程ID找到进程,结束即可。
也可以利用命令 “taskkill /f /pid 进程ID” 来杀死指定ID的进程。

8.2、启动闪退问题

如果在启动时闪退,看不到报错信息,可以这样处理:
先打开调试模式,编辑startup.bat文件,在文档末尾处做如下修改:
修改前的:
在这里插入图片描述
修改后的:
在这里插入图片描述
保存后启动即可看到报错信息了:
在这里插入图片描述
以上报错的意思是找不到planManager这个web应用,在打开server.xml文件查看:
在这里插入图片描述
Context元素代表一个web应用,在server.xml中配置了两个webapps不存在的应用就会报错,删除后就可以正常启动。

8.3、日志乱码问题

修改logging.properties配置,添加语句:
java.util.logging.ConsoleHandler.encoding = GBK
重启tomcat,查看日志数据即可

8.4、请求乱码问题

在(tomcat)服务器端使用 request.getParameter(“username”), 这个有时候会出现乱码,而且tomcat服务器版本不同,是否出现乱码也可能不同。下面给出解决方式:
(1)如果请求方式为POST提交,tomcat7、tomcat8(包括之前的版本)在获取中文参数时均会出现乱码,解决方式是在任何获取参数的代码之前,添加如下代码:
request.setCharacterEncoding(“utf-8”);
(2)如果请求方式为GET提交,tomcat7中关于connector的编码默认为"iso8859-1",在获取中文参数时会出现乱码;但tomcat8中connector的编码默认为"utf-8",在获取中文参数时不会出现乱码。
如果希望tomcat在获取中文参数时也没有乱码,可以将tomcat7中connector的编码改为"utf-8",修改方式为:找到tomcat7/conf/server.xml文件,将在标签上添加如下配置:
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex·Guangzhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值