重学| 面试复习(四)Tomcat & Nginx

Tomcat Servlet容器处理流程

当⽤户请求某个URL资源时
1.HTTP服务器会把请求信息使⽤ServletRequest对象封装起来
2.进⼀步去调⽤Servlet容器中某个具体的Servlet
3.在 (2)中,Servlet容器拿到请求后,根据URL和Servlet的映射关系,找到相应的Servlet
4.如果Servlet还没有被加载,就⽤反射机制创建这个Servlet,并调⽤Servlet的init⽅法来完成初始化
5.接着调⽤这个具体Servlet的service⽅法来处理请求,请求处理结果使⽤ServletResponse对象封装
6.把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端

Servlet 容器 Catalina 的结构

可以认为整个Tomcat就是⼀个Catalina实例,Tomcat 启动的时候会初始化这个实例,Catalina实例通过加载server.xml完成其他实例的创建,创建并管理⼀个Server,Server创建并管理多个服务,每个服务⼜可以有多个Connector和⼀个Container。

Catalina
负责解析Tomcat的配置⽂件(server.xml) , 以此来创建服务器Server组件并进⾏管理
Server
服务器表示整个Catalina Servlet容器以及其它组件,负责组装并启动Servlaet引擎,Tomcat连接器。Server通过实现Lifecycle接⼝,提供了⼀种优雅的启动和关闭整个系统的⽅式
Service
服务是Server内部的组件,⼀个Server包含多个Service。它将若⼲个Connector组件绑定到⼀个Container
Container
容器,负责处理⽤户的servlet请求,并返回对象给web⽤户的模块

Container 组件的具体结构

Engine
表示整个Catalina的Servlet引擎,⽤来管理多个虚拟站点,⼀个Service最多只能有⼀个Engine,但是⼀个引擎可包含多个Host
Host
代表⼀个虚拟主机,或者说⼀个站点,可以给Tomcat配置多个虚拟主机地址,⽽⼀个虚拟主机下可包含多个Context
Context
表示⼀个Web应⽤程序, ⼀个Web应⽤可包含多个Wrapper
Wrapper
表示⼀个Servlet,Wrapper 作为容器中的最底层,不能包含⼦容器

这些组件的配置其实就体现在conf/server.xml中

Tomcat 性能优化策略

系统性能的衡量指标,主要是响应时间和吞吐量。
响应时间:执⾏某个操作的耗时;
吞吐量:系统在给定时间内能够⽀持的事务数量,单位为TPS(Transactions PerSecond的缩写,也
就是事务数/秒,⼀个事务是指⼀个客户机向服务器发送请求然后服务器做出反应的过程。
Tomcat优化从两个⽅⾯进⾏
1.JVM虚拟机优化(优化内存模型,jvm参数调整)
2.Tomcat⾃身配置的优化(⽐如是否使⽤了共享线程池?IO模型?)

参考PDF/p42

HTTPS和HTTP的主要区别

HTTPS协议使⽤时需要到电⼦商务认证授权机构(CA)申请SSL证书
HTTP默认使⽤8080端⼝,HTTPS默认使⽤8443端⼝
HTTPS则是具有SSL加密的安全性传输协议,对数据的传输进⾏加密,效果上相当于HTTP的升级版
HTTP的连接是⽆状态的,不安全的;HTTPS协议是由SSL+HTTP协议构建的可进⾏加密传输、身份认证的⽹络协议,⽐HTTP协议安全

HTTPS⼯作原理

1、浏览器将自己支持的一套加密规则发送给网站
2、网站从中选择出一组加密算法,并将自己的身纷信息,以证书的形式发回给浏览器。证书中包含了网站地址、加密公钥、以及证书的颁发机构等信息
3.浏此器立得网站证书之后要验证证书合法性(颁发证书的机构是否合法,正述中包含的网站地址是否与正在访问的地址一致等)
4、如果证书受信息人,则浏览器栏中会显示一个小锁头,否则会给出正述不受信提示
5.如果证书受信任。或者用户接受了不受信的证书。浏览器会生成一串随机数密码比如XXXXYYYY,并用正述中提供的公钥加密
6.使用公钥加密后的随机数密码加密握手消息。之后发给网站
7.网站接收浏览器发来的数据之后要做如下操作
a、使用私钥解密出密码
b、使用密码解密握手信息
c、使用密码再加密—段握手信息,发送给浏览器
8.浏览器解密并计算握手信息的Hash,.如果与服务器端发来的HASH一致,握手结束
9、之后所有通信数据由之前浏览器生成的随机密码并利用对称加密算法进行加密

Tomcat和Resin有什么区别?在工作中你会怎么选择?

1.在用户数上,Tomcat支持用户数比Resin多,可参考的文档Tomcat也比Resin多,Tomcat与Eclipse做集成的复杂度要比Resin低,及在Eclipse下调试也比Resin简便。
2.Tomcat在开发环境热部署的支持上也比Resin好,但在生产环境热部署支持上Tomcat却不如Resin。
3.Resin的速度要比Tomcat快得多。
4.Resin的启动与停止要比Tomcat更人性化,更适合新手,Resin的报错也不会像Tomcat那样多而繁杂。
5.在对中文的支持上,Resin的优势比起Tomcat要好太多了,各种编码和转码其实都是针对Tomcat设计的,在Resin下就没有这种需要。

综合对比,Resin 更适合中小型的项目上,而Tomcat更适合大型的项目。

Tomcat工作模式?

Tomcat 是一个JSP/Servlet容器。
作为Servlet容器,有三种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet 容器。
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:
1.Tomcat作为应用程序服务器,请求来自于前端的web服务器,这可能是Apache, IIS,Nginx等。
2.Tomcat作为独立服务器:请求来自于web浏览器。

Nginx 到底是什么

Nginx 是⼀个⾼性能的HTTP和反向代理web服务器,核⼼特点是占有内存少,并发能⼒强

Nginx ⼜能做什么事情(应⽤场景)

Http服务器(Web服务器)
正向代理
反向代理
负载均衡服务器
动静分离

Nginx负载均衡策略

轮询:默认策略,每个请求按时间顺序逐⼀分配到不同的服务器,如果某⼀个服务器下线,能⾃动剔除
加权轮询:weight代表权重,默认每⼀个负载的服务器都为1,权重越⾼那么被分配的请求越多(⽤于服务器性能不均衡的场景)
ip_hash:每个请求按照ip的hash结果分配,每⼀个客户端的请求会固定分配到同⼀个⽬标服务器处理,可以解决session问题

Nginx加权轮询是怎么实现的

nginx采用的是平滑加权轮询算法

假设有 N 台实例 S = {S1, S2, …, Sn},配置权重 W = {W1, W2, …, Wn},有效权重 CW = {CW1, CW2, …, CWn}。每个实例 i 除了存在一个配置权重 Wi 外,还存在一个当前有效权重 CWi,且 CWi 初始化为 Wi;指示变量 currentPos 表示当前选择的实例 ID,初始化为 -1;所有实例的配置权重和为 weightSum;
那么,调度算法可以描述为:
1、初始每个实例 i 的 当前有效权重 CWi 为 配置权重 Wi,并求得配置权重和 weightSum;
2、选出 当前有效权重 最大 的实例,将 当前有效权重 CWi 减去所有实例的 权重和 weightSum,且变量 currentPos 指向此位置;
3、将每个实例 i 的 当前有效权重 CWi 都加上 配置权重 Wi;
4、取到变量 currentPos 指向的实例;
5、每次调度重复上述步骤 2、3、4;

Nginx底层进程机制

Nginx启动后,以daemon多进程⽅式在后台运⾏,包括⼀个Master进程和多个Worker进程,Master进程是领导,Worker进程是⼲活的⼩弟

Master进程主要是管理worker进程,⽐如:接收外界信号向各worker进程发送信号(./nginx -s reload),监控worker进程的运⾏状态,当worker进程异常退出后Master进程会⾃动重新启动新的worker进程等

worker进程具体处理⽹络请求。多个worker进程之间是对等的,他们同等竞争来⾃客户端的请求,各进程互相之间是独⽴的。⼀个请求,只可能在⼀个worker进程中处理,⼀个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,⼀般设置与机器cpu核数⼀致

Worker进程如何处理的请求

例如,我们监听9003端⼝,⼀个请求到来时,如果有多个worker进程,那么每个worker进程都有可能处理这个链接。
1.master进程创建之后,会建⽴好需要监听的的socket,然后从master进程再fork出多个worker进程。所以,所有worker进程的监听描述符listenfd在新连接到来时都变得可读。
2.nginx使⽤互斥锁来保证只有⼀个workder进程能够处理请求,拿到互斥锁的那个进程注册listenfd读事件,在读事件⾥调⽤accept接受该连接,然后解析、处理、返回客户端

Nginx多进程模型好处

1.每个worker进程都是独⽴的,不需要加锁,节省开销
2.每个worker进程都是独⽴的,互不影响,⼀个异常结束,其他的照样能提供服务
3.多进程模型为reload热部署机制提供了⽀撑

Nginx调优有哪些?

gzip
timeout
缓存
404 500页面去除nginx版本cpu数
各种最大数
事件模型
其他的就是内核的了,openresty比较新, 并不是太推荐。
可以用阿里那个nginx优化版

Nginx被广泛使用,它的优点有哪些?

Nginx是一-个高性能bai的HTTP和反向代理.服务器,也是一-个IMAP/POP3/SMTP代理服务器。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011 年6月1日,nginx1.0.4发布。
优点:
1.更快
这表现在两个方面:一方面,在正常情况下,单次请求会得到更快的响应;另一方面,在高峰期(如有数以万计的并发请求),Nginx 可以比其他Web服务器更快地响应请求。
2.高扩展性,跨平台
Nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。因此,当对某一个模块修复Bug或进行升级时,可以专注于模块自身,无须在意其他。而且在HTTP模块中,还设计了HTTP过滤器模块:一个正常的HTTP模块在处理完请求后,会有一串HTTP过滤器模块对请求的结果进行再处理。这样,当我们开发一个新的HTTP模块时,不但可以使用诸如HTTP核心模块、events模块、log模块等不同层次或者不同类型的模块,还可以原封不动地复用大量已有的HTTP过滤器模块。这种低耦合度的优秀设计,造就了Nginx庞大的第三方模块,当然,公开的第三方模块也如官方发布的模块一样容易使用。
Nginx的模块都是嵌入到二进制文件中执行的,无论官方发布的模块还是第三方模块都是如此。这使得第三方模块-样具备极其优秀的性能,充分利用Nginx的高并发特性,因此,许多高流量的网站都倾向于开发符合自己业务特性的定制模块。
3.高可靠性:用于反向代理,宕机的概率微乎其微
高可靠性是我们选择Nginx的最基本条件,,因为Nginx的可靠性是大家有目共睹的,很多家高流量网站都在核心服务器上大规模使用Nginx。
Nginx的高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性;另外,官方提供的常用模块都非常稳定,每个worker进程相对独立,master进程在1个worker进程出错时可以快速“拉起”新的worker子进程提供服务。
4.低内存消耗
一般情况 下,10000 个非活跃的HTTPKeep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础。
5.单机支持10万以上的并发连接
这是一个非常重要的特性!随着互联网的迅猛发展和互联网用户数量的成倍增长,各大公司、网站都需要应付海量并发请求,- -个能够在峰值期顶住10万以上并发请求的Server,无疑会得到大家的青睐。理论上,Nginx 支持的并发连接上限取决于内存,10万远未封顶。当然,能够及时地处理更多的并发请求,是与业务特点紧密相关的。
6.热部署
master管理进程与worker工作进程的分离设计,使得Nginx能够提供热部署功能,即可以在7x24小时不间断服务的前提下,升级Nginx的可执行文件。当然,它也支持不停止服务就更新配置项、更换日志文件等功能。
7.最自由的BSD许可协议
这是Nginx可以快速发展的强大动力。BSD许可协议不只是允许用户免费使用Nginx,它还允许用户在自己的项目中直接使用或修改Nginx源码,然后发布。这吸引了无数开发者继续为Nginx贡献自己的智慧。

以上7个特点当然不是Nginx的全部,拥有无数个官方功能模块、第三方功能模块使得Nginx能够满足绝大部分应用场景,这些功能模块间可以叠加以实现更加强大、复杂的功能,有些模块还支持Nginx与Perl、Lua 等脚本语言集成工作,大大提高了开发效率。这些特点促使用户在寻找-一个Web服务器时更多考虑Nginx。
选择Nginx的核心理由还是它能在支持高并发请求的同时保持高效的服务。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值