Nginx+Tomcat集群

一. 简介

Tomcat集群能带来什么?

  1. 提高服务的性能、并发能力、以及高可用性;
  2. 提高项目架构的横向扩展能力

提高服务的性能

实际公司线上生产环境都会选择一台机器部署一个tomcat,多台机器完成集群,毕竟一台机器部署多个tomcat还是有一些共享瓶颈的,例如它们的网卡只有一个,内存和磁盘IO等都是共用的。而多台机器共同提供相同的服务,能够充分利用每一台机器的资源,自然能够提高服务的性能。

并发能力

一台tomcat的http线程池是有限的,那么两台能承载的http线程自然是一台的2倍。

高可用性

简单理解在Nginx下面挂了多台tomcat节点,当其中一台tomcat挂掉的时候,可以把这个节点从Nginx负载均衡tomcat集群的配置当中移除,那么对于请求nginx还会打到可用的tomcat服务器上,并不影响我们提供的服务。所以tomcat集群就能带来一定的高可用性。

横向扩展能力

假设对于一台服务器,通过不断的升级它的cpu、内存、更换固态硬盘等,我们认为这是纵向提高机器的配置,来达到提高tomcat所提供服务的性能,随着硬件不断提高,成本是指数级上升的。

而横向扩展能力则不同,比如天猫的双11活动,因为平时访问量没有那么高,但是双11访问量非常高,当tomcat集群完成后我们就可以做一个横向扩展,只要增加tomcat节点就可以了,根据实际数据、历史数据去做一个评估,当然这个还要有一定的动态能力,根据实际的情况动态的增加几个节点,让nginx进行热部署,就把新增的节点加入到集群中。

Tomcat集群实现原理

通过Nginx负载均衡对多个tomcat进行请求转发,也就是说将多个用户的请求通过一定的策略打到集群的各个tomcat服务器中。

Tomcat集群中的一些问题:

1. Session登录信息存储及读取问题

通常在单tomcat环境下,我们都是将登录信息存储在原生提供的Session对象中。那么在集群环境下,当用户A发起登录请求被转发到tomcat1上,最终登录的session信息存储到了tomcat1上,用户A此时访问系统的某个服务,该请求被转发到了tomcat2上,但是tomcat2并没有该用户的登录信息,所以会提示用户未登录,显然这是不合理的。

所以在集群环境下我们必须要解决多个tomcat之间session共享问题,让用户只需要登录一次就可以继续访问其他的服务。

2. 服务器定时任务并发的问题

当服务器存在定时任务时,假设配置的30分钟执行一次,那么到了执行的时间点,多个tomcat就会同时启动这个定时任务,带来的问题首先是如果定时任务的业务逻辑很复杂时,非常容易造成线上的数据错乱,其次我们其实只希望有一台服务器去执行定时任务就够了,那么多台同时执行也会带来不必要的资源浪费。

3. 根据项目架构和现有业务还有可能有更多的问题

对于实际不同的场景还会有很多的问题,所以随着项目架构的演进,从架构层面的变化会引起代码层面的变化以及解决方案的变化,不要想当然的认为集群就是多部署几台tomcat就行了。

Tomcat集群架构

如图为tomcat集群后简要的架构图,左侧是一个分布式的Redis Session Server,无论用户请求哪台tomcat,都将session信息存储在这里,tomcat请求session也都从这里获取。所以这里还需要做单点登录功能。

同时可以利用分布式Redis来做一个分布式锁,解决多个tomcat在同一时间点启动定时任务的问题。

4. Nginx Tomcat集群 - 图1

Nginx负载均衡配置

Nginx实现负载均衡是通过反向代理来实现的

Nginx配置反向代理的主要参数:

  • upstream 服务池名 { }:
    • 配置后端服务器池,以提供响应数据
  • proxy_pass http://服务池名
    • 配置将访问请求转发给后端服务器池的服务器处理

Nginx负载均衡常用策略主要有以下5种:

轮询

默认的负载均衡策略,每个请求会按时间顺序逐一分配到不同的后端服务器

优点:实现简单

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

  1. upstream www.shengzhe.com{
  2. server 192.168.1.109:8080;
  3. server 192.168.1.111:8080;
  4. }

权重

在轮询策略的基础上指定轮询的几率,通过weight参数指定轮询几率,权重(weight)越高分配到需要处理的请求越多。

weight默认值为1,如果多台都配置了权重,比较相对值,意思是说如果两台服务器一台权重为15,一台为10,只代表访问第一台的概率是第二台的1.5倍,而不是说25次访问,有15次访问第一台。

优点:考虑了每台服务器处理能力的不同(实际生产环境用的比较多的策略)

  1. upstream www.shengzhe.com{
  2. server 192.168.1.109:8080 weight=10;
  3. server 192.168.1.111:8080 weight=15;
  4. }

ip hash

根据请求的IP,将IP进行哈希取模,分配到指定的服务器,对于同一客户端IP的请求将发送到相同的服务器。

优点:能实现同一个用户访问同一个服务器,可以解决session共享问题。

缺点:根据ip hash不一定分配平均,在IP变化的情况下也无法保证session会话。

  1. upstream www.shengzhe.com{
  2. ip_hash;
  3. server 192.168.1.109:8080;
  4. server 192.168.1.111:8080;
  5. }

url hash (第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器

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

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

  1. upstream www.shengzhe.com{
  2. server 192.168.1.109:8080;
  3. server 192.168.1.111:8080;
  4. hash $request_uri;
  5. }

fair (第三方)

特点:按后端服务器的响应时间来分配请求,响应时间短的优先分配

  1. upstream www.shengzhe.com{
  2. server 192.168.1.109:8080;
  3. server 192.168.1.111:8080;
  4. fair;
  5. }

参数扩展
  • down:表示当前的server暂时不参与负载
  • backup:当其他非backup的机器down或者忙的时候,请求backup机器,backup相当于备用机器,能提高项目架构的一定高可用性,用的不多,毕竟机器也是资源,需要成本;
  1. upstream www.shengzhe.com{
  2. ip_hash;
  3. server 192.168.1.109:8080 down;
  4. server 192.168.1.111:8080 weight=2;
  5. server 192.168.1.112:8080;
  6. server 192.168.1.115:8080 backup;
  7. }

二. 实现Nginx+Tomcat负载均衡

案例环境:

主机 IP地址 系统
lb-nginx 192.168.100.100/24 CentOS 7.7
tomcat01 192.168.100.110/24 CentOS 7.7
tomcat02 192.168.100.120/24 CentOS 7.7

1. 基本环境配置

  • IP地址配置
  • 主机名设置
  • 关闭Selinux

2. 安装nginx

设置nginx YUM源
  1. [root@lb-nginx ~]# yum install yum-utils -y
  2. [root@lb-nginx ~]# cat /etc/yum.repos.d/nginx.repo
  3. [nginx-stable]
  4. name=nginx stable repo
  5. baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
  6. gpgcheck=1
  7. enabled=1
  8. gpgkey=https://nginx.org/keys/nginx_signing.key
  9. [nginx-mainline]
  10. name=nginx mainline repo
  11. baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
  12. gpgcheck=1
  13. enabled=0
  14. gpgkey=https://nginx.org/keys/nginx_signing.key

安装nginx服务,会安装1.16.0版本
  1. [root@lb-nginx ~]# yum install nginx -y

设置nginx开机启动并开启nginx服务
  1. [root@lb-nginx ~]# systemctl enable nginx.service
  2. [root@lb-nginx ~]# systemctl start nginx.service
  3. [root@lb-nginx ~]# systemctl status nginx.service
  4. nginx.service - nginx - high performance web server
  5. Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
  6. Active: active (running) since Mon 2019-05-20 18:11:58 CST; 4s ago
  7. Docs: http://nginx.org/en/docs/
  8. Process: 1881 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
  9. Main PID: 1882 (nginx)
  10. CGroup: /system.slice/nginx.service
  11. ├─1882 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
  12. └─1883 nginx: worker process
  13. May 20 18:11:58 www.lnmp.com systemd[1]: Starting nginx - high performance web server...
  14. May 20 18:11:58 www.lnmp.com systemd[1]: Started nginx - high performance web server.

防火墙放行http服务
  1. [root@lb-nginx ~]# firewall-cmd --add-service=http --permanent
  2. [root@lb-nginx ~]# firewall-cmd --add-service=http

测试是否可以访问nginx
  1. [root@lb-nginx ~]# curl http://192.168.100.100

3. 安装tomcat

下载并安装JDK

oracle官方下载界面:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  1. [root@tomcat01 ~]# ls jdk-8u221-linux-x64.rpm
  2. jdk-8u221-linux-x64.rpm
  3. [root@tomcat01 ~]# rpm -ivh jdk-8u221-linux-x64.rpm
  4. warning: jdk-8u221-linux-x64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
  5. Preparing... ################################# [100%]
  6. Updating / installing...
  7. 1:jdk1.8-2000:1.8.0_221-fcs ################################# [100%]
  8. Unpacking JAR files...
  9. tools.jar...
  10. plugin.jar...
  11. javaws.jar...
  12. deploy.jar...
  13. rt.jar...
  14. jsse.jar...
  15. charsets.jar...
  16. localedata.jar...

jdk安装目录在/usr/java/jdk1.8.0_221-amd64,设置jdk的环境变量,编辑/etc/profile 文件, 增加如下内容:

  1. [root@tomcat01 ~]# vim /etc/profile
  2. export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
  3. export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
  4. export PATH=$JAVA_HOME/bin:$PATH
  5. [root@www ~]# source /etc/profile #令修改生效

查看jdk版本号,已经显示是我们安装的软件版本

  1. [root@www ~]# java -version
  2. java version "1.8.0_221"
  3. Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
  4. Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

安装启动Tomcat

从Tomcat官网下载apache-tomcat-9.0.22.tar.gz稳定二进制版本

  1. [root@tomcat01 ~]# wget https://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.22/bin/apache-tomcat-9.0.22.tar.gz

将安装包移动到/usr/local下面,并重命名为tomcat

  1. [root@tomcat01 ~]# tar zxvf apache-tomcat-9.0.22.tar.gz
  2. [root@tomcat01 ~]# mv apache-tomcat-9.0.22 /usr/local/tomcat

启动Tomcat

  1. [root@tomcat01 ~]# /usr/local/tomcat/bin/startup.sh
  2. Using CATALINA_BASE: /usr/local/tomcat
  3. Using CATALINA_HOME: /usr/local/tomcat
  4. Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  5. Using JRE_HOME: /usr/java/jdk1.8.0_221-amd64
  6. Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
  7. Tomcat started.

在防火墙中放行8080端口

  1. [root@tomcat01 ~]# firewall-cmd --add-port=8080/tcp --permanent
  2. success
  3. [root@tomcat01 ~]# firewall-cmd --reload
  4. success

访问Tomcat,浏览器打开http://192.168.154.142:8080进行访问会出现Tomcat主页

4. Nginx Tomcat集群 - 图2

4. 配置tomcat

修改默认页面

  1. [root@tomcat01 ~]# cd /usr/local/tomcat/webapps/ROOT/
  2. [root@tomcat01 ROOT]# mv index.jsp index.jsp.bak
  3. [root@tomcat01 ROOT]# vim index.jsp
  4. <h1> tomcat01 test </h1>
  5. [root@tomcat02 ~]# cd /usr/local/tomcat/webapps/ROOT/
  6. [root@tomcat02 ROOT]# mv index.jsp index.jsp.bak
  7. [root@tomcat02 ROOT]# vim index.jsp
  8. <h1> tomcat02 test </h1>

测试访问:

  1. [root@lb-nginx ~]# curl http://192.168.100.110:8080
  2. <h1> tomcat01 test </h1>
  3. [root@lb-nginx ~]# curl http://192.168.100.120:8080
  4. <h1> tomcat02 test </h1>

5. 配置nginx

配置新的基于域名的虚拟主机,这里server_name配置的是主机对应的域名,proxy_pass是反向代理配置,upstream是负载均衡配置。

  1. [root@lb-nginx ~]# vim /etc/nginx/conf.d/www.shengzhe.conf
  2. upstream www.shengzhe.com{
  3. server 192.168.100.110:8080 weight=1;
  4. server 192.168.100.120:8080 weight=2;
  5. }
  6. server {
  7. listen 80;
  8. autoindex on;
  9. server_name shengzhe.com www.shengzhe.com;
  10. access_log /var/log/nginx/shengzhe_access.log combined;
  11. index index.html index.htm index.jsp index.php;
  12. location / {
  13. proxy_pass http://www.shengzhe.com;
  14. add_header Access-Control-Allow-Origin *;
  15. }
  16. }

重启nginx服务即可。

6. 使用域名测试访问:

  1. [root@lb-nginx ~]# curl http://www.shengzhe.com
  2. <h1> tomcat01 test </h1>
  3. [root@lb-nginx ~]# curl http://www.shengzhe.com
  4. <h1> tomcat02 test </h1>
  5. [root@lb-nginx ~]# curl http://www.shengzhe.com
  6. <h1> tomcat02 test </h1>

Nginx+Tomcat负载均衡&动静分离

一. 什么是动静分离

在弄清动静分离之前,我们要先明白什么是动,什么是静。

在Web开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就是指Html、img、js、css等文件。

动静分离就是将动态资源和静态资源分开,将静态资源部署在Nginx上,当一个请求来的时候,如果是静态资源的请求,就直接到nginx配置的静态资源目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给后台应用去处理,从而实现动静分离。

1. Nginx静态处理优势

主要是 Nginx 处理静态页面的效率远高于 Tomcat 的处理能力,如果 Tomcat 的请求量为 1000 次,则 Nginx 的请求量为 6000 次,Tomcat 每秒的吞吐量为 0.6M,Nginx 的每秒吞吐量 为 3.6M,可以说,Nginx 处理静态资源的能力是 Tomcat 处理能力的 6 倍,优势可见一斑。

tomcat的优势在于少量的接收并处理复杂的http请求(将用户请求读写数据库等),nginx的优势在于能够大量的接收并处理简单的http请求(将http请求转发或者加个header、body等)。

将Html、img、js、css等这种静态资源交给nginx,将用户需要读写数据库等请求交给tomcat是对各自优势的最大利用。

2. 动静分离实现方式

动静分离从目前实现角度来讲大致分为两种,一种是纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。通过location指定不同的后缀名实现不同的请求转发。

3. 动静分离原理

服务端接收来自客户端的请求中,有一部分是静态资源的请求,例如html、css、js 和图片资源等等。有一部分是动态数据的请求。因为Tomcat处理静态资源的速度比较慢, 所以可以考虑把所有静态资源独立开来,交给处理静态资源更快的服务器(例如 Nginx)处 理,而把动态请求交给 Tomcat 处理。

如图所示,在机器上同时安装了 Nginx 和 Tomcat,把所有的静态资源都放置在Nginx的webroot目录下面,把动态请求的程序都放在 Tomcat 的目录下面。当客户端访问服务端的时候,如果是静态资源的请求,就直接到Nginx的目录下面获取资源。如果是动态资源的请求,Nginx 利用反向代理的原理,把请求转发给Tomcat进行处理,这样就实现了动静分离,提高了服务器处理请求的性能。

4. Nginx Tomcat集群 - 图3

二. Nginx+Tomcat 动静分离集群实现

本案例是基于集群环境实现,使用Nginx来作为负载平衡器,后端服务器有nginx来处理静态资源,Tomcat来处理动态资源。

案例环境:

主机 IP地址 系统
lb-nginx 192.168.100.100/24 CentOS 7.7
nginx01 192.168.100.110/24 CentOS 7.7
tomcat01 192.168.100.120/24 CentOS 7.7

1. 基本环境配置

  • IP地址配置
  • 主机名设置
  • 关闭Selinux

2. 安装nginx

在lb-nginx和nginx01服务器上安装

设置nginx YUM源
  1. [root@lb-nginx ~]# yum install yum-utils -y
  2. [root@lb-nginx ~]# cat /etc/yum.repos.d/nginx.repo
  3. [nginx-stable]
  4. name=nginx stable repo
  5. baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
  6. gpgcheck=1
  7. enabled=1
  8. gpgkey=https://nginx.org/keys/nginx_signing.key
  9. [nginx-mainline]
  10. name=nginx mainline repo
  11. baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
  12. gpgcheck=1
  13. enabled=0
  14. gpgkey=https://nginx.org/keys/nginx_signing.key

安装nginx服务,会安装1.16.0版本
  1. [root@lb-nginx ~]# yum install nginx -y

设置nginx开机启动并开启nginx服务
  1. [root@lb-nginx ~]# systemctl enable nginx.service
  2. [root@lb-nginx ~]# systemctl start nginx.service
  3. [root@lb-nginx ~]# systemctl status nginx.service
  4. nginx.service - nginx - high performance web server
  5. Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
  6. Active: active (running) since Mon 2019-05-20 18:11:58 CST; 4s ago
  7. Docs: http://nginx.org/en/docs/
  8. Process: 1881 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
  9. Main PID: 1882 (nginx)
  10. CGroup: /system.slice/nginx.service
  11. ├─1882 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
  12. └─1883 nginx: worker process
  13. May 20 18:11:58 www.lnmp.com systemd[1]: Starting nginx - high performance web server...
  14. May 20 18:11:58 www.lnmp.com systemd[1]: Started nginx - high performance web server.

防火墙放行http服务
  1. [root@lb-nginx ~]# firewall-cmd --add-service=http --permanent
  2. [root@lb-nginx ~]# firewall-cmd --add-service=http

测试是否可以访问nginx
  1. [root@lb-nginx ~]# curl http://192.168.100.100

3. 安装tomcat

在tomcat01服务器上进行安装

下载并安装JDK

oracle官方下载界面:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  1. [root@tomcat01 ~]# ls jdk-8u221-linux-x64.rpm
  2. jdk-8u221-linux-x64.rpm
  3. [root@tomcat01 ~]# rpm -ivh jdk-8u221-linux-x64.rpm
  4. warning: jdk-8u221-linux-x64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
  5. Preparing... ################################# [100%]
  6. Updating / installing...
  7. 1:jdk1.8-2000:1.8.0_221-fcs ################################# [100%]
  8. Unpacking JAR files...
  9. tools.jar...
  10. plugin.jar...
  11. javaws.jar...
  12. deploy.jar...
  13. rt.jar...
  14. jsse.jar...
  15. charsets.jar...
  16. localedata.jar...

jdk安装目录在/usr/java/jdk1.8.0_221-amd64,设置jdk的环境变量,编辑/etc/profile 文件, 增加如下内容:

  1. [root@tomcat01 ~]# vim /etc/profile
  2. export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
  3. export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
  4. export PATH=$JAVA_HOME/bin:$PATH
  5. [root@www ~]# source /etc/profile #令修改生效

查看jdk版本号,已经显示是我们安装的软件版本

  1. [root@www ~]# java -version
  2. java version "1.8.0_221"
  3. Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
  4. Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

安装启动Tomcat

从Tomcat官网下载apache-tomcat-9.0.22.tar.gz稳定二进制版本

  1. [root@tomcat01 ~]# wget https://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.22/bin/apache-tomcat-9.0.22.tar.gz

将安装包移动到/usr/local下面,并重命名为tomcat

  1. [root@tomcat01 ~]# tar zxvf apache-tomcat-9.0.22.tar.gz
  2. [root@tomcat01 ~]# mv apache-tomcat-9.0.22 /usr/local/tomcat

启动Tomcat

  1. [root@tomcat01 ~]# /usr/local/tomcat/bin/startup.sh
  2. Using CATALINA_BASE: /usr/local/tomcat
  3. Using CATALINA_HOME: /usr/local/tomcat
  4. Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  5. Using JRE_HOME: /usr/java/jdk1.8.0_221-amd64
  6. Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
  7. Tomcat started.

在防火墙中放行8080端口

  1. [root@tomcat01 ~]# firewall-cmd --add-port=8080/tcp --permanent
  2. success
  3. [root@tomcat01 ~]# firewall-cmd --reload
  4. success

访问Tomcat,浏览器打开http://192.168.154.142:8080进行访问会出现Tomcat主页

4. Nginx Tomcat集群 - 图4

4. 配置lb-nginx负载平衡器

  1. [root@lb-nginx ~]# vim /etc/nginx/conf.d/www.shengzhe.conf
  2. #定义静态服务器组
  3. upstream static {
  4. server 192.168.100.110 weight=1;
  5. }
  6. #定义动态服务器组
  7. upstream dynamic {
  8. server 192.168.100.120:8080 weight=1;
  9. }
  10. server {
  11. listen 80;
  12. autoindex on;
  13. server_name shengzhe.com www.shengzhe.com;
  14. access_log /var/log/nginx/shengzhe_access.log combined;
  15. index index.html index.htm index.jsp index.php;
  16. location / {
  17. proxy_set_header X-Forwarded-For $remote_addr;
  18. proxy_pass http://static;
  19. }
  20. location ~* .*\.(css|html|js)$ {
  21. proxy_set_header X-Forwarded-For $remote_addr;
  22. proxy_pass http://static;
  23. }
  24. location ~* .*\.(jsp|php)$ {
  25. proxy_set_header X-Forwarded-For $remote_addr;
  26. proxy_pass http://dynamic;
  27. }
  28. }

5. 编辑静态页面

在nginx01上编辑静态页面如下:

  1. [root@nginx01 html]# vim /usr/share/nginx/html/index.html
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta http-equiv="content-type" content="text/html;charset=utf-8">
  6. <title>静态页面</title>
  7. <style>
  8. body {
  9. width: 35em;
  10. margin: 0 auto;
  11. font-family: Tahoma, Verdana, Arial, sans-serif;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <h1>静态页面</h1>
  17. <p>这是个静态页面</p>
  18. </body>
  19. </html>

6. 创建项目,并编写jsp动态文件

在tomcat01上编写动态文件

  1. [root@tomcat01 ~]# cd /usr/local/tomcat/webapps/
  2. [root@tomcat01 webapps]# mkdir test
  3. [root@tomcat01 webapps]# vim test/index.jsp
  4. <!DOCTYPE html>
  5. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  6. <%@ page import="java.util.Date" %>
  7. <%@ page import="java.text.SimpleDateFormat" %>
  8. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ html4/loose.dtd">
  9. <html>
  10. <head>
  11. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  12. <title>动态页面</title>
  13. </head>
  14. <body>
  15. <div>动态页面</div>
  16. </body>
  17. </html>

重启tomcat服务

7. 测试访问

测试访问静态页面:http://www.shengzhe.com

4. Nginx Tomcat集群 - 图5

测试访问动态页面:http://www.shengzhe.com/test/index.jsp

4. Nginx Tomcat集群 - 图6

8. 设置 Nginx 处理静态图片,后端 Tomcat 处理动态页面。

修改Tomcat01端 jsp 文件,指定图片文件。

  1. [root@tomcat01 ~]# vim /usr/local/tomcat/webapps/test/index.jsp
  2. <body>
  3. <div>动态页面</div><br>
  4. <img src='logo.jpg'>
  5. </body>

修改lb-nginx配置文件,增加图像文件处理,然后重启nginx服务

  1. [root@lb-nginx ~]# vim /etc/nginx/conf.d/www.shengzhe.conf
  2. upstream static {
  3. server 192.168.100.110 weight=1;
  4. }
  5. upstream dynamic {
  6. server 192.168.100.120:8080 weight=1;
  7. }
  8. upstream images {
  9. server 192.168.100.110:808 weight=1;
  10. }
  11. server {
  12. listen 80;
  13. autoindex on;
  14. server_name shengzhe.com www.shengzhe.com;
  15. access_log /var/log/nginx/shengzhe_access.log combined;
  16. index index.html index.htm index.jsp index.php;
  17. location / {
  18. proxy_set_header X-Forwarded-For $remote_addr;
  19. proxy_pass http://static;
  20. }
  21. location ~* .*\.(css|html|js)$ {
  22. proxy_set_header X-Forwarded-For $remote_addr;
  23. proxy_pass http://static;
  24. }
  25. location ~* .*\.(jsp|php)$ {
  26. proxy_set_header X-Forwarded-For $remote_addr;
  27. proxy_pass http://dynamic;
  28. }
  29. location ~* .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
  30. proxy_set_header X-Forwarded-For $remote_addr;
  31. proxy_pass http://images;
  32. }
  33. }

修改nginx01的服务器配置文件,增加图片服务处理

  1. #修改配置文件
  2. [root@nginx01 nginx]# vim /etc/nginx/conf.d/images.conf
  3. server {
  4. listen 808;
  5. server_name localhost;
  6. #charset koi8-r;
  7. #access_log /var/log/nginx/host.access.log main;
  8. location / {
  9. root /usr/share/nginx/images;
  10. index index.html index.htm;
  11. }
  12. #error_page 404 /404.html;
  13. # redirect server error pages to the static page /50x.html
  14. #
  15. error_page 500 502 503 504 /50x.html;
  16. location = /50x.html {
  17. root /usr/share/nginx/html;
  18. }
  19. }
  20. # 创建目录,并拷贝图片文件,注意:目录名称需要和java项目名称相同。
  21. [root@nginx01 nginx]# mkdir /usr/share/nginx/images/test
  22. [root@nginx01 nginx]# mkdir /usr/share/nginx/images/test
  23. [root@nginx01 nginx]# ls
  24. html images logo.jpg
  25. [root@nginx01 nginx]# mv logo.jpg images/test/
  26. #重启服务
  27. [root@nginx01 nginx]# systemctl restart nginx
  28. #防火墙放行端口
  29. [root@nginx01 nginx]# firewall-cmd --add-port=808/tcp
  30. success
  31. [root@nginx01 nginx]# firewall-cmd --add-port=808/tcp --permanent
  32. success

9. 访问测试

访问http://www.shengzhe.com/test/index.jsp,查看图片是否添加。

4. Nginx Tomcat集群 - 图7

10. 查看访问日志

在lb-nginx上查看日志

  1. [root@lb-nginx ~]# tail /var/log/nginx/shengzhe_access.log
  2. 192.168.100.11 - - [21/Jan/2020:21:37:50 +0800] "GET /test/index.jsp HTTP/1.1" 200 325 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
  3. 192.168.100.11 - - [21/Jan/2020:21:37:50 +0800] "GET /test/logo.jpg HTTP/1.1" 200 10289 "http://www.shengzhe.com/test/index.jsp" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
  4. 192.168.100.11 - - [21/Jan/2020:21:37:50 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "http://www.shengzhe.com/test/index.jsp" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"

在tomcat01上查看访问日志

  1. [root@tomcat01 ~]# tail /usr/local/tomcat/logs/localhost_access_log.2020-01-21.txt
  2. 192.168.100.100 - - [21/Jan/2020:00:01:32 +0800] "GET /test/index.jsp HTTP/1.0" 200 300
  3. 192.168.100.100 - - [21/Jan/2020:00:10:23 +0800] "GET /test/index.jsp HTTP/1.0" 200 300
  4. 192.168.100.100 - - [21/Jan/2020:21:37:51 +0800] "GET /test/index.jsp HTTP/1.0" 200 325

通过日志分析,可以得出 Nginx 处理图片的静态图片请求,Tomcat 处理页面的动态请 求,从而达到动静分离,减轻 Tomcat 服务器压力。