1.Web服务器的定义


其实并没有标准定义。一般认为,Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。。

Web服务器就是处理网站信息的.用户通过Web浏览器访问数据的时候,Web服务器通过http协议格式数据发送给用户的浏览器.
Web服务器是被动技术,没有人理我,我就不会主动理任何人(你必须向web服务器发起响应,它才会回应你),你主动给web服务器发送一个请求,web服务器就会给你对应的响应(无论是拒绝请求.还是接受也好,它都是一个响应).

服务器一般使用HTTP(超文本传输协议)与客户机浏览器进行信息交流,这就是人们常把它们称为HTTP服务器的原因,现在主流的协议是http 1.1版本.
http协议好比你跟你女朋友沟通,你就需要中文,如果你和国外的女朋友沟通,你就需要讲英文,协议就是你们沟通的手段.

Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序(程序其实就是我们所说的Java程序)。

Tomcat[笔记] - 图1


(二)什么是Tomcat

Tomcat是一款开源轻量级Web应用服务器,是一款优秀的Servlet容器实现,玩Tomcat其实就是玩Servlet.
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
Servlet严格来讲是指Java语言实现的一个接口,一般情况下我们说的Servlet是指任何实现了这个Servlet接口的类。

Web客户端的请求发送过来的时候,其实是发送到一个Servlet容器里面去请求的,比如说Tomcat, 当请求如果发送过来的时候,Tomcat会分配给你一个线程去处理,处理的时候是去调用的service()方法.

Tomcat[笔记] - 图2

三个方法:
实例化并调用init()方法初始化该 Servlet,一般 Servlet 只初始化一次(只有一个对象)
service()(根据请求方法不同调用doGet() 或者 doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions()、destroy())。
当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。




1.典型的Servlet的处理流程


1.第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
2.Servlet 容器在调用 service() 方法之前加载 Servlet。
3.然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法。

SpringMVC的 DispatcherServlet 就是Servlet的实现类

(三)Tomcat版本介绍

Tomcat[笔记] - 图3

Servlet2.X:项目目录结构必须要有WEB-INF,web.xml等文件夹和文件,在web.xml中配置servlet,filter,listener,以web.xml为java web项目的统一入口

Servlet 3.x规范:项目中可以不需要WEB-INF,web.xml等文件夹和文件,在没有web.xml文件的情况下,通过注解实现servlet,filter, listener的声明,当使用注解时,容器自动进行扫描。
同时Tomcat8.5进行了大量的代码重构,对比与7.0的版本,也符合Tomcat未来的代码架构体系。但是Tomcat的核心和主体架构还是一直保持这样的。


Tomcat8.5目前是主流版本, 版本特点:

支持Servlet3.1
默认采用NIO,移除BIO
支持NIO2(AIO)
支持HTTP/2协议
默认采用异步日志处理(提高性能)

(四)启动/关闭/出现的问题

1.启动
bin/startup.bat
2.关闭
bin/shutdown.bat 还有一种关闭方式,直接关闭黑窗口,服务器就关闭了.

1.启动时可能遇到的问题

(1)启动闪退
 可能的原因:jdk环境变量配置有问题
 解决方案:正确配置jdk环境变量
(2)启动后过一段时间自动退出
 可能的原因:端口冲突
 解决方案:
1)把占用端口的程序关闭掉(详情看day33 的第13视频)
在cmd窗口里输入命令:netstat –ano|findstr :8080
找到最后一列,pid
打开任务管理器,找到pid对应的进程,关闭掉即可
2)更改tomcat的端口号(详情看day33 的第13视频)
打开conf/server.xml,把8080更改成其它端口号

tomcat默认要占用3个端口:8005,8009,8080

(五)web应用的目录结构

不知道对开发影响不大,是理论知识
Tomcat[笔记] - 图4

(六)其它

1.远程debug启动

在项目发布后,我们有时候需要对基于生产环境部署的应用进行调试,以解决在开发环境无法重现的BUG。这时我们就需要用到应用服务器的远程调试功能,这个主要是基于JDK提供的JPDA(Java Platform Debugger Architecture,Java平台调试体系结构)。不过一般情况下用不到,这里简单讲一讲。
使用DeBug启动可以对基于生产环境部署的应用进行调试,以解决在开发环境无法重现的BUG。

使用IDEA远程部署tomcat和调试

1.在catalina.sh文件中加入以下的配置
CATALINA_OPTS=”-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.19.200
-agentlib:jdwp=transport=dt_socket,address=15833,suspend=n,server=y”export CATALINA_OPTS
· 以上端口可以随意改动,但是必要的是后续的设置必须保持一致,并且务必保证端口没有被占用,这些设置的端口在防火墙中是开放状态;
· 其中1099的是tomcat远程部署连接端口;
· 15833 是远程调试的端口;
· 192.168.19.200是远程的服务器的Ip。
· 2.在Linux上启动tomcat,使用命令启动

  1. ./bin/catalina.sh run &

Tomcat[笔记] - 图5
Tomcat[笔记] - 图6
Tomcat[笔记] - 图7
Tomcat[笔记] - 图8
Tomcat[笔记] - 图9
Tomcat[笔记] - 图10
Tomcat[笔记] - 图11
debug启动测试
连接:

  1. [2017-12-2308:47:03,592] Artifact devframe-server:war exploded: Artifact isnot deployed. Press 'Deploy' to start deployment
  1. [2017-12-2308:47:03,650] Artifact devframe-server:war exploded: Artifact is being deployed, please wait...
  1. Connected toserver
  1. Connected to the target VM, address: '192.168.19.200:15833', transport: 'socket'
  1. [2017-12-2308:47:11,434] Artifact devframe-server:war exploded: Error during artifact deployment. See serverlogfor details.

文件传输:

  1. [2017/12/2320:47] Uploading to 192.168.19.200 completed in less than a minute:357 files transferred (8 Mbit/s)

这样就能够成功远程部署并且调试了。
使用的技巧:
Tomcat[笔记] - 图12
容易出现的问题
· 如果远程没有连接上,两个端口被占用或者防火墙屏蔽。除了JMX server指定的监听端口号外,JMXserver还会监听一到两个随机端口号,这个如果防火墙关闭了的话就不用考虑,如果使用了防火墙,还需要查看它监听的端口。
· 账号的相应的读写权限一定要有;

(七)Tomcat项目部署及目录结构

1.项目部署

隐式部署


直接丢文件夹、war、jar到webapps目录,tomcat会根据文件夹名称自动生成虚拟路径,简单,但是需要重启Tomcat服务器,包括要修改端口和访问路径的也需要重启.
缺点是项目文件和Tomcat文件是在一起的.

显式部署


显示部署就是项目文件和Tomcat文件分开的,即使Tomcat有故障了,你可以直接删除掉,项目文件依然是存在的.

方式一:添加context元素

server.xml中的Host加入一个Context(指定路径和文件地址),例如:


即/comet 这个虚拟路径映射到了D:\work_tomcat\ref-comet目录下(war会解压成文件),修改完servler.xml需要重启tomcat 服务器。

方式二:创建xml文件

创建xml的方式更灵活,因为添加新的项目是不需要重启的,但是是建议重启的,因为改了项目的话,如果不重启的话,JVM数据问题可能会有些问题了.

在conf/Catalina/localhost中创建xml文件,访问路径为文件名,例如:
在localhost目录下新建demo.xml,内容为:

不需要写path,虚拟目录就是文件名demo,path默认为/demo,添加demo.xml不需要重启 tomcat服务器。

如果添加新的项目不需要重启服务器?????回来我去测试一下

三种方式比较


隐式部署:可以很快部署,需要人手动移动Web应用到webapps下,在实际操作中不是很人性化

添加context元素 : 配置速度快,需要配置两个路径,如果path为空字符串,则为缺省配置,每次修改server.xml文件后都要重新启动Tomcat服务器,重新部署.

创建xml文件:服务器后台会自动部署,修改一次后台部署一次,不用重复启动Tomcat服务器,该方式显得更为智能化。

 Tomcat文件夹介绍


Tomcat[笔记] - 图13

bin 脚本目录
conf 配置文件目录
lib 依赖的jar包目录
logs 日志文件存放位置(程序运行时操作系统)
temp 临时文件
webapps 用于存放web项目目录
work Tomcat处理jsp页面工作目录


bin binary
可执行文件所在的目录。启动和关闭tomcat的命令文件在这
放的是配置文件(xml properties) :
server.xml 是tomcat的端口号修改的地方,这里可以修改端口号
web.xml 是 存放所有的文件类型的的信息, 用于下载的功能,要想下载必须知道要下载的文件类型是什么,
lib omcat运行过程中依赖的jar包,tomcat运行必须需要有依赖
logs tomcat运行产生日志文件 (看错误信息需要)
temp 运行过程中产出的临时文件(没用,会自动生成自动删除)
webapps用来部署web应用的目录,我们的web应用可以放在webapps目录里,当tomcat启动时,会自动加载部署里边的服应用。 存放项目的,存放里面的项目可以被浏览器去访问(重要!!!) 核心目录
work jsp生成的一个class文件的存放的路径

1.bin执行脚本目录


startup文件,主要是检查catalina.bat/sh 执行所需环境,并调用catalina.bat 批处理文件。启动tomcat。
catalina文件,真正启动Tomcat文件,可以在里面设置jvm参数。后面性能调优会重点讲
shutdown文件,关闭Tomcat
脚本version.sh、startup.sh、shutdown.sh、configtest.sh都是对catalina.sh的包装,内容大同小异,差异在于功能介绍和调用catalina.sh时的参数不同。
Version:查看当前tomcat的版本号,
Configtest:校验tomcat配置文件server.xml的格式、内容等是否合法、正确。
Service:安装tomcat服务,可用net start tomcat 启动

2.webapps目录

存放web项目的目录,其中每个文件夹都是一个项目;如果这个目录下已经存在了目录,那么都是tomcat自带的。项目。其中ROOT是一个特殊的项目,在地址栏中没有给出项目目录时,对应的就是ROOT项目。http://localhost:8080/examples,进入示例项目。其中examples就是项目名,即文件夹的名字。

3.lib目录


Tomcat的类库,里面是一大堆jar文件。如果需要添加Tomcat依赖的jar文件,可以把它放到这个目录中,当然也可以把应用依赖的jar文件放到这个目录中,这个目录中的jar所有项目都可以共享之,但这样你的应用放到其他Tomcat下时就不能再共享这个目录下的Jar包了,所以建议只把Tomcat需要的Jar包放到这个目录下;

Tomcat里面有最基础的功能,比如说Servlet,因为Tomcat本身是一个Servlet的容器的实现,所以里面会有一个Servlet的jar包,jar包放lib目录里面以为着所以用这个Tomcat部署的项目共用的jar包.
但是如何是某个项目特定的jar包的话建议直接放项目里面,因为如果你换了一个Tomcat的话,jar包是不会跟你项目在一起的,你还需要自己手动去拷贝过去,是非常的麻烦的

4.work目录


运行时生成的文件,最终运行的文件都在这里。通过webapps中的项目生成的!可以把这个目录下的内容删除,再次运行时会生再次生成work目录。当客户端用户访问一个JSP文件时,Tomcat会通过JSP生成Java文件,然后再编译Java文件生成class文件,生成的java和class文件都会存放到这个目录下。

假如说一个aaa.jsp,在你访问之前的时候work目录是没有的,如果你访问一下aaa.jsp,那么就会在work文件夹里面放一个类似的这个文件,当你下一次访问aaa.jsp的时候,访问速度就会快一点(类似缓存的一个东西).

5.temp目录


存放Tomcat的临时文件,这个目录下的东西可以在停止Tomcat后删除!

6.logs目录


这个目录中都是日志文件,记录了Tomcat启动和关闭的信息,如果启动Tomcat时有错误,那么异常也会记录在日志文件中

localhost-xxx.log Web应用的内部程序日志,建议保留

catalina-xxx.log 控制台日志

host-manager.xxx.log Tomcat管理页面中的host-manager的操作日志,建议关闭

localhost_access_log_xxx.log 用户请求Tomcat的访问日志(这个文件在conf/server.xml里配置),如果你使用nginx记录的话,这个日志建议关闭

7.conf 配置文件目录

web.xml


Tomcat中所有应用默认的部署描述文件,主要定义了基础的Servlet和MIME映射(mime-mapping 文件类型,其实就是Tomcat处理的文件类型,和传输协议有关系的),如果部署的项目中不包含Web.xml,那么Tomcat将使用此文件(Tomcat自己的web.xml)初始化部署描述,反之,Tomcat会在启动时将默认描述与定义描述配置进行合并。

加载一些tomcat内置的servlet
DefaultServlet默认的,加载静态文件 html,js,jpg等静态文件。
JspServlet专门处理jsp。

context.xml


用于自定义所有Web应用均需要加载的Context配置,比如说加载web.xml配置文件等等,如果Web应用指定了自己的context.xml,那么该文件的配置将被覆盖。

context.xml与server.xml中配置context的区别
server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。

不过一般context.xml用的是很少的,大多数都是用server.xml

catalina.policy


权限相关 Permission ,Tomcat是跑在jvm上的,所以有些默认的权限
我们程序员一般不需要去了解

tomcat-users.xml



配置管理用户的信息, 专门配置后台管理的身份验证.


配置的是访问Tomcat主页(localhost:8080)里面的时候 有个Server Status 那里需要输入用户名和密码的

Server Status 是显示的服务器的一些状态,JVM信息,IO端口信息,Http端口信息等等

<?xml version=”1.0” encoding=”UTF-8”?>
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=”http://tomcat.apache.org/xml tomcat-users.xsd”
version=”1.0”>




logging.properties

设置tomcat日志
控制输出不输出内容到文件,不能阻止生成文件,阻止声文件可用注释掉

server.xml


这个配置文件能全面的描述出整个Tomcat的一个结构,

8005端口是监听关闭Tomcat请求的端口
一个Server里面可以有多个Service,
Service里面有个连接器(Tomcat需要去改端口就从这里面修改),每一个Service可能有一个或者多个连接器

你启动Tomcat的时候日志输出除了输出 Http-nio-8080 以外还会输出一个 ajp-nio-8009 ,这些是干什么的?

其实Tomcat属于一个家族,Tomcat叫Apache Tomcat .在Tomcat诞生之前有一个叫 Apache -http-server 的东西,它是专门处理静态文件的, 而Apache Tomcat是专门处理动态的servlet的东西.
如果你要用Tomcat和 Apache-http-server去做集群的话,就会要启用我们的ajp这个协议,ajp协议不属于对外的,它的专门去做我们的静态文件处理的,动态是用Tomcat来处理的,而ajp协议是专门用来去连接Apache Tomcat和 Apache-http-server 的协议,ajp的效率要比http协议要高一些,毕竟http协议要包装一些东西.

每个service底下只能包含一个Engine服务,Engine是引擎,专门处理Servlet的,它是一个Servlet容器的实现,

Engine里面有host,host是域名,在Tomcat诞生的早期(Tomcat有20多年的历史了),我们的服务器其实是很贵的,当时一台服务器要挂在N多个项目,可能有10个20个项目,我们就可以用context部署多个项目,当时还有一个需求,就是一台服务器可以有多个IP,并且可以有多个域名.这样就有了一个Host主机,host主机里面可以维护一个localhost,也可以维护www.aaa.com , 这样的话,就可以挂载多个项目.当然nginx也可以实现这个功能.
所以说你有几个域名,你就可以配置几个host,但是只能共用一个端口,端口是配置在连接器里面的,如果你想要使用多个端口,您就得配置多个Server了,不过现在几乎没有这个需求了,现在是微服务的天下了,现在虚拟化容器做的很成熟了,Tomcat的这些东西是历史产物了.

在每一个host里面你还可以有日志,日志你也可以关闭.
Wrapper是处理单个Servlet的.

<?xml version=”1.0” encoding=”UTF-8”?>





server.xml中日志的patter解释
有效的日志格式模式可以参见下面内容,如下字符串,其对应的信息由指定的响应内容取代:
%a - 远程IP地址
%A - 本地IP地址
%b - 发送的字节数,不包括HTTP头,或“ - ”如果没有发送字节
%B - 发送的字节数,不包括HTTP头
%h - 远程主机名
%H - 请求协议
%l (小写的L)- 远程逻辑从identd的用户名(总是返回’ - ‘)
%m - 请求方法
%p - 本地端口
%q - 查询字符串(在前面加上一个“?”如果它存在,否则是一个空字符串
%r - 第一行的要求
%s - 响应的HTTP状态代码
%S - 用户会话ID%t - 日期和时间,在通用日志格式
%u - 远程用户身份验证
%U - 请求的URL路径
%v - 本地服务器名
%D - 处理请求的时间(以毫秒为单位)
%T - 处理请求的时间(以秒为单位)
%I (大写的i) - 当前请求的线程名称

 图形界面化部署

(一)基本部署

  1. 先在tomcat-users.xml 配置用户
    2. 设置一下上传文件大小限制,默认是50M,肯定是不行的,正常war都超过了这个

    修改${tomcat_root}/webapps/manager/WEB-INF/web.xml中的




104758600
104758600
0


3. 用刚才配置的用户进行登录Tomcat页面,




Tomcat[笔记] - 图14
4. Tomcat[笔记] - 图15

耐心等待,上传完了就会自动启动了…

(二)实现再次部署



Tomcat[笔记] - 图16
找到你需要再次更新一版本的方式部署,点击右边那个,这个命令是删除部署包, 删除完毕再重复上面操作,把要部署的新的war上传即可.





 热加载和热部署


https://www.yuque.com/docs/share/98aa6ff4-f333-40ce-a584-b15153353bcb?#





 项目解决

(一)控制台乱码问题




(二)配置热部署


在 tomcat的server.xml配置autoDeploy=”true 即可

unpackWARs=”true” autoDeploy=”true”>






prefix=”localhost_access_log” suffix=”.txt”
pattern=”%h %l %u %t "%r" %s %b” />

(三)热部署时候无法删除旧的jar包


在$TOMCAT_HOME/conf/context.xml:

<Context antiJARLocking=”true” antiResourceLocking=”true”>


参考:
https://developer.51cto.com/art/201410/454082.htm

(四)改端口



修改Tomcat的端口号:
在默认情况下,tomcat的端口是8080,如果出现8080端口号冲突,用如下方法可以修改Tomcat的端口号:
首先: 在Tomcat的根(安装)目录下,有一个conf文件夹,双击进入conf文件夹,在里面找到Server.xml文件,打开该文件。
其次:在文件中找到如下文本: maxThreads=”150” connectionTimeout=”20000”
redirectPort=”8443” />也有可能是这样的:disableUploadTimeout=”true” />等等;
最后:将port=”8080”改为其它的就可以了。如port=”8081”等。
保存server.xml文件,重新启动Tomcat服务器,Tomcat就可以使用8081端口了。
注意,有的时候要使用两个tomcat,那么就需要修改其中的一个的端口号才能使得两个同时工作。
修改了上面的以后,还要修改两处:
(1)将 protocol=”AJP/1.3” />的8009改为其它的端口。
(2) 继续将的8005改为其它的端口。
经过以上3个修改,应该就可以了

(五)安装SSL证书(Linux和Windows都可以)


首先访问https的端口必须是80,如果是别的端口的话会报错,然后服务器需要开放80和443端口.

connectionTimeout=”20000”
redirectPort=”443” />


protocol=”org.apache.coyote.http11.Http11NioProtocol”



SSLEnabled=”true”
scheme=”https”
secure=”true”
keystoreFile=”D:\Downloads\apache-tomcat-8.0.48\conf\cert\3870899_kg.zsshop.vip.pfx”

keystoreType=”PKCS12”
keystorePass=”71l3fnQF”
clientAuth=”false”
SSLProtocol=”TLSv1+TLSv1.1+TLSv1.2”
ciphers=”TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256”/>


其中keystoreFile 参数是证书的路径
keystorePass参数是证书的密码
keystoreType 是固定写死为PKCS12
redirectPort 需要指向443

如果还是访问不了的话,看看是不是443和80端口没有开放




参考:
https://blog.csdn.net/qq_35206244/article/details/97613498

(六)配置虚拟内存



JAVA_OPTS参数说明

-server 启用jdk 的 server 版;
-Xms java 虚拟机初始化时的堆最小内存;
-Xmx java 虚拟机可使用堆的最大内存;
-XX: PermSize 非堆内存永久保留区域
-XX:MaxPermSize 非堆内存最大永久保留区域

服务器参数配置

现公司服务器内存一般都可以加到最大2G ,所以可以采取以下配置:

JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’

配置完成后可重启Tomcat.



添加位置

JVM:JAVA_OPTS=”-server -Xms1024m -Xmx1024m -Xss512k”

修改/opt/tomcat/bin/catalina.sh这个文件,在
# OS specific support. $var must be set to either true or false.
cygwin=false
这两行之行插入一行,最终修改为以下这样:
# OS specific support. $var must be set to either true or false.
JAVA_OPTS=”-Xms512m -Xmx1024m -Xss2048K -XX:PermSize=256m -XX:MaxPermSize=512m”
cygwin=false保存,重启tomcat即可。