Tomcat与Nginx集群

在本地开发项目时,我们通常只会将代码部署到一台服务器上。然而,在实际项目中,为了更好地应对突发情况,我们可能将代码部署在多台服务器上,尽可能地避免因为网站发生故障,造成正常服务中断的情况。在Java Web开发过程中,我们使用多台Tomcat服务器搭建服务器集群。

Tomcat集群的作用

Tomcat集群主要有以下两个作用:

  • 提高服务性能,并发能力以及高可用性
  • 提供项目架构的横向扩展能力

Tomcat集群实现原理

在本章中,Tomcat集群的实现是通过Nginx负载均衡进行请求转发而产生的。

Tomcat集群引发的问题及解决方案

在Tomcat集群的情况下,将会产生了以下问题:

  • Session登录信息存储及读取的问题
  • 服务器定时任务并发的问题,…

因此,在使用Tomcat集群的时候,我们要注意到这些问题。

针对上面的Session登录信息存储及读取的问题,我们可以使用下面两种方案:

  1. 采用nginx ip哈希策略,将相同ip的请求转发到同一台服务器上

    • 优点:可以不改变现有技术架构,直接实现横向扩展

    • 缺点:容易导致服务器请求(负载)不平均,完全依赖ip哈希的结果;在ip变化的环境下将无法服务

  2. 将SessionId存储到Cookie中,无论用户在哪台服务器登录,都从Cookie中获取SessionId,并将Session信息存储到Redis中,当用户需要获取登录信息时,从Redis中获取相关信息

  3. 为了解决服务器定时任务并发的问题,我们将使用分布式锁来处理该问题。

Nginx负载均衡配置

对于Nginx来说,负载均衡主要有以下几种配置方式:

  • 轮询(默认)
  • 权重
  • ip哈希
  • url哈希(第三方)
  • fair(第三方)

轮询方式

使用轮询进行负载均衡,其主要优缺点如下:

优点:实现简单

缺点:不考虑每台服务器处理能力

轮询方式的主要配置如下:

1
2
3
4
upstream www.happymmall.com {
server www.happymmall.com:8080;
server www.happymmall.com:9080;
}

权重方式

使用权重进行负载均衡,其主要优点如下:

优点:考虑了每台服务器处理能力的不同,在这个配置中使用了weight,若不使用,则默认为1

权重方式的主要配置如下:

1
2
3
4
upstream www.happymmall.com {
server www.happymmall.com:8080 weight=15;
server www.happymmall.com:9080 weight=10;
}

ip哈希方式

使用ip哈希进行负载均衡,其主要优点如下:

优点:能实现同一用户访问同一个服务器

缺点:根据ip哈希,会造成请求访问分布不平均

ip哈希方式的主要配置如下:

1
2
3
4
5
upstream www.happymmall.com {
ip_hash;
server www.happymmall.com:8080;
server www.happymmall.com:9080;
}

url哈希方式

使用url哈希进行负载均衡,其优缺点如下:

优点:能实现同一服务访问同一服务器

缺点:根据url哈希分配请求会不平均,请求频繁的url会请求到同一服务器

url哈希方式的主要配置如下:

1
2
3
4
5
upstream www.happymmall.com {
server www.happymmall.com:8080;
server www.happymmall.com:9080;
hash $request_uri;
}

fair方式

使用fair进行负载均衡,按后端服务器的响应时间来分配请求,响应时间短的优先分配

1
2
3
4
5
upstream www.happymmall.com {
server www.happymmall.com:8080;
server www.happymmall.com:9080;
fair;
}

Tomcat单机部署多应用

为了实现单机部署多应用,我们需要准备多个Tomcat,在本章中,我们实现两个Tomcat集群,准备两个Tomcat:Tomcat1和Tomcat2

配置环境变量

在windows环境下,我们配置6个环境变量:

  • Tomcat1:CATALINA_1_BASE、CATALINA_1_HOME、TOMCAT_1_HOME,指向Tomcat1根目录

  • Tomcat2:CATALINA_2_BASE、CATALINA_2_HOME、TOMCAT_2_HOME,指向Tomcat2根目录

配置Tomcat

除了配置环境变量以外,我们还需要配置这两个Tomcat。

Tomcat1:

  1. 修改bin目录下的catalina.bat

    • 查找该文件下的所有CATALINA_BASE,替换为CATALINA_1_BASE

    • 查找该文件下的所有CATALINA_HOME,替换为CATALINA_1_HOME

  2. 修改bin目录下的startup.bat

    • 查找该文件下的所有CATALINA_BASE,替换为CATALINA_1_BASE

    • 查找该文件下的所有CATALINA_HOME,替换为CATALINA_1_HOME

Tomcat2:

  1. 修改conf目录下的server.xml

    • 修改<Server port="8005" shutdown="SHUTDOWN">中的端口80059005

    • 修改<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />中的端口8080改为9080

    • 修改<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />中的端口8009改为9009

  2. 修改bin目录下的catalina.bat

    • 查找该文件下的所有CATALINA_BASE,替换为CATALINA_2_BASE

    • 查找该文件下的所有CATALINA_HOME,替换为CATALINA_2_HOME

  3. 修改bin目录下的startup.bat

    • 查找该文件下的所有CATALINA_BASE,替换为CATALINA_2_BASE

    • 查找该文件下的所有CATALINA_HOME,替换为CATALINA_2_HOME

启动服务器

启动Tomcat1,查看打印出的CATALINA_1_BASE,CATALINA_1_HOME:

tomcat1

启动Tomcat2,查看打印出的CATALINA_2_BASE,CATALINA_2_HOME:

tomcat2

若能够正常启动,且其打印出的信息和服务器相对应,则表示配置成功

配置Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
upstream www.happymmall.com{
server www.happymmall.com:8080 weight=1;
server www.happymmall.com:9080 weight=1;
}
server {
listen 80;
autoindex on;
server_name happymmall.com www.happymmall.com;
access_log D:/access.log combined;
index index.html index.htm index.jsp index.php;
#error_page 404 /404.html;
if ( $query_string ~* ".*[\;'\<\>].*" ){
return 404;
}
location / {
proxy_pass http://www.happymmall.com ;
add_header Access-Control-Allow-Origin *;
}
}

修改host文件

为了使用Nginx配置的域名,我们修改host文件,添加一条配置127.0.0.1 www.happymmall.com

Tomcat多机部署多应用

多机部署比单机多实例简单得多,只需要在每台主机安装一个Tomcat即可

  • 如果一个机器部署一个Tomcat实例,不用修改
  • 如果一个机器部署多个Tomcat实例,参照上一节的方法
  • 若使用不同的机器上的Tomcat实现Tomcat集群,需要保证各机器之间的网络是互通的,Nginx装在任意一台机器上即可,也可把Nginx服务独立出来一台

Tomcat与Nginx集群步骤总结

通过上文,我们可以了解Tomcat与Nginx集群的基本实现步骤

  1. 配置各Tomcat相应的环境变量CATALINA_BASE、CATALINA_HOME、TOMCAT_HOME
  2. 配置各Tomcat配置文件对应的CATALINA_BASE、CATALINA_HOME
  3. 配置Nginx负载均衡,通过Nginx负载均衡整合Tomcat实现Tomcat集群