76. Tomcat 的负载均衡---nginx + tomcat及负载均衡tomcat(day76)

tomcat一般只提供动态资源处理功能,而静态资源的请求则交给独立的apache/httpd或nginx来处理。但tomcat与外界通信的唯一组件是连接器Connector,因此动态请求要转发给tomcat时,需要和Connector通信。Connector与外界通信的协议有两种:http/ajp。

1. Tomcat连接器协议类型

tomcat的Connector组件支持两种协议类型的连接:http、ajp。

其中http又分为http/1.1和http/2,但因为Servlet的阻塞特性,使得每个http/2的请求都需要单独的容器线程负责处理,因此目前使用http/2的性能还很差。而AJP又有ajp12、ajp13和ajp14,其中ajp12的功能太简陋,ajp14又处于试验期,因此目前都适用ajp13,或者称为ajp 1.3。

基于IO模型,Connector又分为NIO/NIO2/APR三种类型。

76. Tomcat 的负载均衡---nginx + tomcat及负载均衡tomcat(day76)

 

2. Tomcat与httpd/nginx结合的方式

Tomcat连接器与外界通信的两种协议中,ajp只能和apache基金会开发的部分项目通信,例如httpd。要与非apache基金会开发的程序通信,必须使用http协议。因此,tomcat+nginx时,tomcat连接器的协议类型只能是http。

对于tomcat+httpd,tomcat端的连接器既可以使用http,也可以使用ajp协议。但在httpd端,也支持多种通信模块,最常用的是mod_proxy和mod_jk。

tomcat+httpd时,几个需要注意的点:

  • (1).mod_jk一般只和tomcat的ajp协议配合来通信。而mod_proxy则不要求tomcat端的协议类型是http还是ajp。
  • (2).配置时,使用mod_jk比使用mod_proxy要复杂的多。
  • (3).使用mod_jk可以配置成只处理动态请求,而不处理静态请求。但mod_proxy则只能将所有请求都转发给tomcat。因此,在性能上mod_jk比mod_proxy。不过由于前端可以使用反向代理工具,因此这种情况下的mod_jk和mod_proxy,性能无差别。

因此,如果满足业务需求,建议使用mod_proxy,它配置起来比mod_jk要简便的多,且可定制的功能更多。

稍作总结,apache和tomcat通信的实现方式有3种:

apache:mod_jk  <--> tomcat:ajp(虽然可以和http配合,但不建议)
apache:mod_proxy <--> tomcat:ajp或http

下图是httpd/nginx+tomcat在动静分离时通常使用的架构模型。

76. Tomcat 的负载均衡---nginx + tomcat及负载均衡tomcat(day76)

左边的模型中,nginx/httpd需要处理静态请求,并将动态请求转发给tomcat,同时实现负载均衡。右边的模型中,添加一层反向代理层,无论是静态请求还是动态请求都负载到各自的服务器组。后文的实验都采用左边的架构模型来完成。

3. Tomcat + nginx

 76. Tomcat 的负载均衡---nginx + tomcat及负载均衡tomcat(day76)

 

76. Tomcat 的负载均衡---nginx + tomcat及负载均衡tomcat(day76)

76. Tomcat 的负载均衡---nginx + tomcat及负载均衡tomcat(day76)

发现这个欢迎页面缺失了很多内容。其实这些缺失的内容都是定义在index.jsp中的静态资源,例如某些图片。之所以会缺失,是因为客户端发送请求给nginx后,nginx将请求转发给tomcat,tomcat翻译index.jsp为java源文件,然后执行该servlet。执行servlet时,将所需响应数据都回应给nginx,包括index.jsp中定义的图片链接标签。当客户端收到这一次的响应数据后,还会继续去请求图片,但是这是静态请求,nginx会自己处理而不会转发给tomcat,但nginx本身不知道图片在何处(tomcat才知道)。因此对于图片部分,nginx将返回404错误,使得客户端显示的页面缺失了一部分。

在生产环境下,不需要担心这样的二次静态请求缺失问题,因为会将图片等静态数据存放在某个位置,并配置好nginx如何找到这些静态数据。

 

 

Nginx + Tomcat 实现动静分离

76. Tomcat 的负载均衡---nginx + tomcat及负载均衡tomcat(day76)

 

上一篇:ELK搭建


下一篇:实战复现Aapache Tomcat AJP(CVE-2020-1938)