Nginx+Tomcat负载均衡、动静分离群集介绍

1.Tomcat概述

1.1 简介

  • 最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发
  • 安装Tomcat后,安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件

1.2 Tomcat重要目录

  • bin:存放启动和关闭Tomcat脚本)
  • conf:存放Tomcat不同的配置文件
  • doc:存放Tomcat文档
  • lib:存放Tomcat运行需要的库文件
  • logs:存放Tomcat执行时的LOG文件
  • src:存放Tomcat的源代码
  • webapps:Tomcat的主要Web发布目录
  • work:存放jsp编译后产生的class文件

2.Nginx应用

Nginx是一款非常优秀的HTTP服务器软件

  • 支持高达50000个并发连接数的响应,响应连接数的范围在30000~50000之间
  • 拥有强大的静态资源处理能力
  • 运行稳定
  • 内存、CPU等系统资源消耗非常低
  • 目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,提升整个站点的负载并发能力

2.1 Nginx负载均衡实现原理

  • Nginx实现负载均衡是通过反向代理实现;
  • 反向代理原理

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

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

3.动静分离概述

  • 动静分离是将网站的静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用的访问

3.1 静态资源的部署

  • 静态资源部署在Nginx,将静态资源部署在Nginx上,后台项目部署到应用服务器上,根据一定规则静态资源的请求,全部去请求nginx服务器,达到动静分离的目标

  • 静态资源部署在CDN上,将项目中的JavaScript,CSS以及img文件都存放在CDN服务器上,将HTML文件一起存放到CDN上之后,可以将静态资源统一放置在一种服务器上,便于前端进行维护;而且用户在访问静态资源时,可以很好利用CDN的优点

  • 后端API提供数据,后端应用提供API,根据前端的请求进行处理,并将处理结果通过JSON格式返回至前端。目前应用主要采用Java平台开发,因此应用服务器主要是Tomcat服务器,现在也开始有部分应用采用node进行开发,应用服务器也开始使用node服务器

  • 前后端域名,动静分离因为静态资源和应用服务分别部署在不同的服务器上,因此会面临域名策略的选择。采用相同域名下,用户请求API时可以避免跨域所带来的问题,相对开发更为快速,工作量也相对小一些。前后端采用不同域名时,需要前后端开发时兼容跨域请求的情况,开发量相对上一种会稍多一些。解决跨域方式最常用的方式就是采用JSONP,还有一种解决方式使用CORS(HTTP访问控制)允许某些域名下的跨域请求

3.2 动静分离实现的优缺点

  • 优点:
    API接口服务化;前后端开发并行;减轻后端服务器的压力,提高静态资源访问速度

  • 缺点:
    不利于网站SEO(搜索引擎优化);开发量变大;在业务高速发展时需要慎重考虑

3.3 动静分离的适用场景

1) 静态文件访问量大,服务器负载高,I/O问题导致用户访问卡顿
2) 静态文件数量大,服务器存储空间不够
3) 静态文件用户访问量大,且分布在各地
4) 移动更新包在某个时间段需要高速下载,且并发下载量高

4.Nginx动静分离实现原理

4.1 动静分离原理

  • 服务端接收来自客户端的请求中,既有静态资源也有动态资源,静态资源由Nginx提供服务,动态资源Nginx转发至后端
    在这里插入图片描述

4.2 Nginx静态处理优势

1) Nginx处理静态页面的效率远高于Tomcat的处理能力
2) 若Tomcat的请求量为1000次,则Nginx的请求量为60003) Tomcat每秒的吞吐量为0.6M,Nginx的每秒吞吐量为3.6M
4) Nginx处理静态资源的能力是Tomcat处理的6

4.3 Nginx配置负载均衡、动静分离

在Nginx服务器上安装Nginx,反向代理两个Tomcat站点,并实现负载均衡

  • 关闭Firewalld防火墙
  • 安装Nginx依赖软件包
  • 解压并编译安装Nginx
  • 配置nginx.conf,添加location静态页面处理及添加upstream配置段与proxy_pass
  • 检测配置文件与启动Nginx
  • 测试负载均衡、动静分离效果

5.Nginx与Tomcat实现动静分离具体步骤

  • 由于Tomcat本身处理静态效率不高,还会带来资源消耗,因此使用动静分离,将静态请求交由Nginx处理,动态请求交由Tomcat处理

  • Nginx根据客户端请求的url来判断请求的是否是静态资源,如果请求的url包含jpg、png,则由Nginx处理;如果请求的url是.php或者.jsp等,则被认为是动态的,将转发tomcat处理。即Nginx通过url来区分请求的类型,并且转发给不同的服务端

5.1 实验环境

(1) Nginx服务器,Centos 7系统
- IP地址:192.168.70.9/24(调度器1- IP地址:192.168.70.10/24(调度器2(2) Tomcat服务器,Centos 7系统
- IP地址:192.168.70.11/24(tomcat1)
- IP地址:192.168.70.12/24(tomcat2)

(3) NFS存储服务器
- IP地址:192.168.70.13/24

(4) Client客户端,Centos 7系统
- IP地址:192.168.70.14/24

5.2 配置过程

5.2.1 NFS上的配置

[root@nfs ~]# mkdir /web1
[root@nfs ~]# mkdir /web2
[root@nfs ~]# cd /web1		//导入图片 a.jpg
[root@nfs web1]# vi index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<head>
<title>tomcat1</title>
</head>
<body>
<% out.println("this is tomcat1 server");%>
<div>动态页面</div><br/><img src="a.jpg" />
</body>
</html>
[root@nfs web1]# cp index.jsp /web2
[root@nfs web1]# cd /web2		//导入图片 b.jpg
[root@nfs web2]# vi index.jsp
...//同web1的动态网页一样,设为 tomcat2,b.jpg

[root@nfs web2]# cd

[root@nfs ~]# vi /etc/exports
/web1 192.168.70.11(ro)
/web2 192.168.70.12(ro)

[root@nfs ~]# systemctl restart nfs
[root@nfs ~]# systemctl restart rpcbind
[root@nfs ~]# showmount -e
Export list for nfs:
/web2 192.168.70.12/32
/web1 192.168.70.11/32

5.2.2 部署Tomcat服务器

首先在两台tomcat上均导入以下软件包
在这里插入图片描述

1)配置java环境

[root@tomcat1 ~]# tar zxvf jdk-8u91-linux-x64.tar.gz
[root@tomcat1 ~]# mv jdk1.8.0_91/ /usr/local/java
[root@tomcat1 ~]# vi /etc/profile
...//末尾添加
export JAVA_HOME=/usr/local/java    	'//设置JAVA根目录设为全局变量'
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre  
'//环境变量,在PATH环境变量中添加JAVA根目录下的bin/子目录,jre/子目录'

2)将java.sh脚本导入到环境变量,使其生效

[root@tomcat1 ~]# source /etc/profile   
[root@tomcat1 ~]# echo $PATH
[root@tomcat1 ~]# java		'//加table,查看是否启动服务'
java            javadoc         javah           javapackager    javaws          
javac           javafxpackager  javap           java-rmi.cgi    javaws.itweb
[root@tomcat1 ~]# java -version

在这里插入图片描述
在这里插入图片描述
3)编写java脚本并测试

[root@tomcat1 ~]# vi aad.java
public class aad {
    
     
        public static void main (String[] args) {
    
    
        System.out.println("Hello world!"); 
      }
}
[root@tomcat1 ~]# javac aad.java
[root@tomcat1 ~]# java aad
Hello world!

在这里插入图片描述

4)配置tomcat环境

  • tomcat1 上的配置如下
'解压缩,创建站点目录'
[root@tomcat1 ~]# tar zxvf apache-tomcat-8.5.16.tar.gz 
[root@tomcat1 ~]# mv apache-tomcat-8.5.16/ /usr/local/tomcat8
[root@tomcat1 ~]# mkdir /webapp1   
[root@tomcat1 ~]# cd /webapp1/ 
[root@tomcat1 webapp1]# ls -lh  //添加图片(重新挂载会被覆盖消失)

'挂载'
[root@tomcat1 webapp1]# mount 192.168.70.13:/web1 /webapp1/
[root@tomcat1 webapp1]# df -Th
文件系统            类型      容量  已用  可用 已用% 挂载点
/dev/sda5           xfs        52G  5.0G   47G   10% /
devtmpfs            devtmpfs  898M     0  898M    0% /dev
tmpfs               tmpfs     912M  9.7M  903M    2% /dev/shm
tmpfs               tmpfs     912M   17M  895M    2% /run
tmpfs               tmpfs     912M     0  912M    0% /sys/fs/cgroup
/dev/sda2           xfs       5.0G   33M  5.0G    1% /home
/dev/sda1           xfs      1014M  174M  841M   18% /boot
tmpfs               tmpfs     183M   48K  183M    1% /run/user/0
/dev/sr0            iso9660   4.3G  4.3G     0  100% /mnt
192.168.70.13:/web1 nfs4       52G  4.5G   48G    9% /webapp1

[root@tomcat1 webapp1]# cd

在这里插入图片描述

5)修改主配置文件

修改主页的站点目录
[root@tomcat1 ~]# vi /usr/local/tomcat8/conf/server.xml 
...//查找到Host name ,添加以下配置
<Context docBase="/webapp1" path="" reloadable="false">
  </Context>

'//docBase:web应用的文档基准目录'
'//path="": 指定访问路径URI(虚拟目录名),访问url路径下是否跟内容'
'//reloadable:本项为true时,当web.xml或者class有改动的时候都会自动重新加载不需要从新启动服务'

在这里插入图片描述

6)优化服务启动

[root@tomcat1 ~]# ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup
[root@tomcat1 ~]# ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown
[root@tomcat1 ~]# tomcatup  //服务启动
[root@tomcat1 ~]# netstat -anpt | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      68340/java

7)访问测试

  • 在浏览器上测试 tomcat1,显示如下
    在这里插入图片描述

tomcat2 上的配置与 tomcat1 上几乎相同

更改
创建并设置 webapp2 站点,导入图片 b.jpg
mkdir /webapp2

<Context docBase="/webapp2" path="" reloadable="false">
  </Context>
  • 导入图片
    在这里插入图片描述
  • 在浏览器上测试 tomcat2,显示如下
    在这里插入图片描述

5.2.3 部署Nginx调度服务器

  • 两台服务器上均添加nginx,keepalived安装包
    在这里插入图片描述

1)安装Nginx依赖包

[root@nginx1 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel
//pcre-devel:正则表达式库
//zlib-devel:函数库
[root@nginx1 ~]# useradd -M -s /sbin/nologin nginx  //创建不可登录,不带宿主的用户
[root@nginx1 ~]# tar zxvf nginx-1.12.2.tar.gz
[root@nginx1 ~]# cd nginx-1.12.2/
[root@nginx1 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@nginx1 nginx-1.12.2]# make && make install
[root@nginx1 nginx-1.12.2]# ln -s /usr/local/nginx/conf/nginx.conf /etc/
[root@nginx1 nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/      //创建命令链接
[root@nginx1 nginx-1.12.2]# cd

2)配置upstream服务池

[root@nginx1 ~]# vi /usr/local/nginx/conf/nginx.conf
...//添加以下配置,upstream服务池
upstream tomcat_server {
    
    
             server 192.168.70.11:8080 weight=1;
             server 192.168.70.12:8080 weight=1;
}
...
        location ~ \.jsp$ {
    
    
             proxy_pass http://tomcat_server;  
}

在这里插入图片描述
3)启动服务

[root@nginx1 ~]# nginx -t
[root@nginx1 ~]# cd /usr/local/nginx/html/	//导入图片 a.jpg b.jpg,保证静态资源的调度
[root@nginx1 html]# ls -lh	//查看
[root@nginx1 html]# cd
[root@nginx1 ~]# nginx
[root@nginx1 ~]# netstat -anpt | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      27576/nginx: master

在这里插入图片描述

注意:
'图片,音频等静态资源应该放在nginx的站点目录下'
'在nginx2服务上完成同nginx1一样的配置'

4)访问测试

  • nginx1的访问
    在这里插入图片描述
    在这里插入图片描述

  • nginx2的访问
    在这里插入图片描述
    在这里插入图片描述

5.2.4 在nginx调度器上安装keepalived

(1) 安装依赖包

[root@nginx1 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel

(2) 解压keepalived软件包,并编译安装

[root@nginx1 ~]# tar zxvf keepalived-2.0.13.tar.gz
[root@nginx1 ~]# cd keepalived-2.0.13/
[root@nginx1 keepalived-2.0.13]# ./configure --prefix=/
[root@nginx1 keepalived-2.0.13]# make && make install

(3) 修改运行级别

[root@nginx1 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d
[root@nginx1 keepalived-2.0.13]# vi /etc/init.d/keepalived   
...
# chkconfig: 35 21 79  //修改运行级别,将 - 改为35

[root@nginx1 keepalived-2.0.13]# chmod 755 /etc/init.d
[root@nginx1 keepalived-2.0.13]# chkconfig --add keepalived
[root@nginx1 keepalived-2.0.13]# chkconfig --list

(4) 编辑主配置文件

[root@nginx1 keepalived-2.0.13]# vi /etc/keepalived/keepalived.conf 
//删除第一行后的所有,添加以下配置
global_defs {
    
    
     router_id nginx1
}
vrrp_script chk_http_port {
    
    
     script "/usr/local/src/nginx.sh"
     interval 2
     weight 2
}
vrrp_instance vi_1 {
    
    
     state MASTER
     interface ens33
     virtual_router_id 51
     priority 110
     adver_int 1)
     authentication {
    
    
          auth_type PASS
          auth_pass 1111
}
track_script {
    
             
       chk_http_port
}
virtual_ipaddress {
    
    
     192.168.70.100
}
}
[root@nginx1 keepalived-2.0.13]# scp /etc/keepalived/keepalived.conf root@192.168.70.10:/etc/keepalived/    
													 '//在调度器1上拷贝文件给调度器2'
'调度器2上,即nginx2上只需修改以下配置'

router_id nginx2    //服务器名称
state BACKUP        //指定keepalived的角色,MASTER为主,BACKUP为备
priority 105 		//优先级
[root@nginx1 keepalived-2.0.13]# vi /usr/local/src/nginx.sh
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`    //查询进程数
if [ $A -eq 0 ]          
then /usr/local/nginx/sbin/nginx
   if [ `ps -C nginx --no-header | wc -l` -eq 0 ]
    then exit 1
    else exit 0
   fi
else
   exit 0
fi
[root@nginx1 keepalived-2.0.13]# scp /usr/local/src/nginx.sh root@192.168.70.10:/usr/local/src	
												'//调度器1上拷贝文件给调度器2'
[root@nginx1 keepalived-2.0.13]# chmod +x /usr/local/src/nginx.sh  	'//两台调度器上都需要给执行权限'

(5) 启动服务

[root@nginx1 keepalived-2.0.13]# systemctl start keepalived.service 
[root@nginx1 keepalived-2.0.13]# systemctl status keepalived.service  //服务状态
[root@nginx1 ~]# tail -100 /var/log/messages    //查看日志
[root@nginx1 ~]# ip addr   //查看虚拟地址

nginx2同样的启动

5.3 验证结果

  • 在浏览器上访问虚拟IP

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5.4 模拟故障

5.4.1 测试高可用的特性

  • 当调度器1故障时
[root@nginx1 ~]# systemctl stop keepalived.service  
[root@nginx1 ~]# ip addr  '//查看虚拟地址,虚拟地址消失'

在这里插入图片描述

  • 在调度器2上
[root@nginx2 ~]# ip addr

在这里插入图片描述

  • 再次访问浏览器,发现仍然可以访问网页

在这里插入图片描述
在这里插入图片描述

5.4.2 测试节点故障

  • 当节点服务器tomcat1出现问题时
[root@tomcat1 ~]# tomcatdown 

在这里插入图片描述

  • 在浏览器上访问只有tomcat2的页面显示
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42449832/article/details/111035352