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

一、Tomcat概述

1.Tomcat简介

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

2.Tomcat重要目录

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

二、Nginx概述

1.Nginx应用

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

  • 支持高达50000个并发连接数的响应
  • 拥有强大的静态资源处理能力
  • 运行稳定
  • 内存、CPU等系统资源消耗非常低

目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,提升整个站点的负载并发能力

2.Nginx负载均衡实现原理

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

在这里插入图片描述

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

upstream 服务池名 { }

  • 配置后端服务器池,以提供响应数据

proxy_pass http://服务池名

  • 配置将访问请求转发给后端服务器池的服务器处理

3.Nginx动静分离

3.1 Nginx动静分离原理

服务端接收来自客户端的请求中,既有静态资源也要有动态资源,静态资源由Nginx提供服务,动态资源Nginx转发至后端Tomcat等

3.2 Nginx静态处理优势

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

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

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

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

2.基本部署

nginx1:192.168.1.10       #调度器1
nginx2:192.168.1.11       #调度器2
tomcat1:192.168.1.12      #节点服务器1
tomcat2:192.168.1.13      #节点服务器2
client:192.168.1.14       #客户机
nfs:192.168.1.15          #存储服务器

基础设置把所有的防火墙都关闭

systemctl stop firewalld
setenforce 0

在nfs上
1.添加共享目录,创建网页

[root@nfs ~]#mkdir  /web1
[root@nfs ~]#mkdir  /web2
[root@nfs ~]#cd  /web1
[root@nfs  web1]#vi   index.jsp
[root@nfs web1]# cp index.jsp /web2

添加:
<%@ 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 ~]#cd  /web2
[root@nfs  web2]#vi  index.jsp

添加:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<head>
<title>tomcat2</title>
</head>
<body>
<% out.println("this is tomcat2 server");%>
<div>动态页面</div><br/>< img src="b.jpg" />
</body>
</html>

2.把图片a、b分别放入/web1、/web2下

3.添加共享地址,启动服务

[root@nfs ~]# vi /etc/exports

添加:
/1 192.168.1.12(ro)
/web2 192.168.1.13(ro)

[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl restart rpcbind
[root@nfs ~]# showmount -e
Export list for nfs:
/web2 192.168.1.13
/web1 192.168.1.12

在tomcat1上
通过xshell文件传输传输tomcat环境的软件包tomcat、jdk

1.解压jdk软件包

[root@tomcat1 ~]#tar   zxvf  jdk-8u91-linux-x64.tar.gz

2.编辑文件

[root@tomcat1 ~]# mv jdk1.8.0_91/ /usr/local/java    #剪切到/usr/local/java下
[root@tomcat1 ~]# vi /etc/profile

export  JAVA_HOME=/usr/local/java          #设置全局变量
export  PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre    #设置环境变量

在这里插入图片描述
3.调用下,就可以直接用java了

[root@tomcat1 ~]# source /etc/profile
[root@tomcat1 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/use/local/java/bin:/use/local/java/jre

4.查看版本

[root@tomcat1 ~]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)

5.编写java小程序,查看是否可以正常工作

[root@tomcat1 ~]# vi abc.java

添加:
public class abc {
            public static void main (String[] args) {
                    System.out.println("你好,Fa!!");
        }
} 

6.执行测试java

[root@tomcat1 ~]# javac abc.java   #编译后生成可执行文件
[root@tomcat1 ~]# java abc            #测试

在这里插入图片描述
7.解压tomcat软件包

[root@tomcat1 ~]#tar   zxvf  apache-tomcat-8.5.16.tar.gz

8.创建站点目录,挂载tomcat主页

[root@tomcat1 ~]# mv apache-tomcat-8.5.16/ /usr/local/tomcat8
[root@tomcat1 ~]# mkdir /webapp1
[root@tomcat1 ~]# cd /webapp1/ 
[root@tomcat1 webapp1]# ll
[root@tomcat1 ~]# mount 192.168.1.15:/web1 /webapp1/
[root@tomcat1 ~]# df  -Th

在这里插入图片描述
9.在tomcat主页中修改站点目录

[root@tomcat1 ~]# vi /usr/local/tomcat8/conf/server.xml 
[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   #查看端口

添加:
      <Context docBase="/webapp1" path="" reloadable="false">
      </Context>

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

在这里插入图片描述
在这里插入图片描述
如访问没有页面,在nfs中的web1目录下通过xshell添加照片即可

测试:
192.168.1.12:8080
在这里插入图片描述
在tomcat2上同上
1.挂载
在这里插入图片描述
2.在tomcat主页中修改站点目录
在这里插入图片描述
客户机测试:
192.168.1.13:8080
在这里插入图片描述
在nginx1调度器上安装nginx安装包

1.安装Nginx依赖包

[root@nginx1 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel

pcre-devel:正则表达式库
zlib-devel:函数库

2.创建不可登录用户

[root@nginx1 ~]# useradd -M -s /sbin/nologin nginx  #创建不可登录,不带宿主的用户

3.解压缩,设置属主,属组,编译安装

[root@nginx1 ~]# tar zxvf nginx-1.13.7.tar.gz       #解压缩
[root@nginx1 ~]# cd nginx-1.13.7/
[root@nginx1 nginx-1.13.7]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx   #安装路径,属主,属组设置
[root@nginx1 nginx-1.13.7]# make && make install   #编译安装
[root@nginx1 nginx-1.13.7]# ln -s /usr/local/nginx/conf/nginx.conf /etc/     #创建设置链接
[root@nginx1 nginx-1.13.7]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/      #创建命令链接(nginx命令使用前提)
[root@nginx1 nginx-1.13.7]# cd

4.配置文件

[root@nginx1 ~]# vi /usr/local/nginx/conf/nginx.conf
[root@nginx1 ~]# nginx -t   #检查语法
[root@nginx1 ~]# nginx    #服务启动
[root@nginx1 ~]# netstat -anpt | grep 80   #查看端口状态

添加    
upstream服务池
upstream tomcat_server {
             server 192.168.1.12:8080 weight=1;
              节点      ip地址  端口号  权重
             server 192.168.1.13:8080 weight=1;
}

        location ~ \.jsp$ {
             proxy_pass http://tomcat_server;  
}                                          服务地址池名

在这里插入图片描述

客户机测试:
192.168.1.10
在这里插入图片描述
192.168.1.10/index.jsp
在这里插入图片描述
客户机访问调度器的时候图片显示不出来,这边要解决静态资源在nginx上显示的为你

进行抓包查看
发现图片a.jpg和图片b.jpg转跳地址都是192.168.1.10(nginx地址),而不是192.168.1.12,192.168.1.13(tomcat地址)说明了静态资源是在nginx上进行调度的
在这里插入图片描述
解决图片不显示问题
在本地/usr/local/nginx/html/目录下添加图片a,b的图片就好了

[root@nginx1 ~]# cd /usr/local/nginx/html/
[root@nginx1 html]# ls -lh

在这里插入图片描述
用客户机再次测试访问
192.168.1.10/index.jsp
在这里插入图片描述
在这里插入图片描述
把图片放入本地后抓包查看
在这里插入图片描述
在nginx2调度器同上
在这里插入图片描述
测试:
192.168.1.11
在这里插入图片描述
192.168.1.11/index.jsp
在这里插入图片描述
在这里插入图片描述
在调度器上nginx1上安装keepalived
1.安装依赖包

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

popt库的存在,主要是为了解析命令行选项。相比手动的解析argv数组或者使用getopt函数getopt( )或getopt_long( ), 使用popt库在很多方面都占有优势。popt的一些特点:它不使用全局变量,因此可以并行解析argv;它可以解析任意的argv风格的元素数组,可以解析来自任何源文件的命令行字符串(ps:估计是命令行字符串参数可保存在文件中,程序通过导入配置文件解析获得参数) ;它提供了一个使用选项别名的标准方法(后面会再讨论);它可以执行外部选项过滤器;最后,它能够自动生成程序的help和usage信息。

kernel-devel:做内核一般开发的,比如编写内核模块,原则上,可以不需要内核的源代码

2.解压缩

[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=/      #路径设置

3.编译安装

[root@nginx1 keepalived-2.0.13]# make && make install   

4.编辑配置文件

[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   
[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

修改
# chkconfig: 35 21 79    #运行级别改为35

在这里插入图片描述

[root@nginx1 keepalived-2.0.13]# vi /etc/keepalived/keepalived.conf 

删除所有,除了第一行
添加
global_defs {
     router_id nginx1       本服务器的名称
}
vrrp_script chk_http_port {    vrrp脚本
     script "/usr/local/src/nginx.sh"  脚本路径 最后手动执行此脚本,以确保脚本能够正常运行
     interval 2          检测间隔时间 单位秒
     weight 2
}
vrrp_instance vi_1 {       实例名称
     state MASTER        指定keepalived的角色,MASTER为主,BACKUP为备
     interface ens33    当前进行vrrp通讯的网络接口卡
     virtual_router_id 51   虚拟路由编号,主从要一致
     priority 110            优先级,数值越大,获取地址优先级越大
     adver_int 1             检查间隔,默认为1s (vrrp组播周期秒数)
     authentication {       认证方式
          auth_type PASS
          auth_pass 1111
}
track_script {         
       chk_http_port     调用检测脚本  
}
virtual_ipaddress {
     192.168.1.200    定义虚拟ip(VIP}
}

在这里插入图片描述
在nginx2调度器中同上,直到编译安装再在nginx1中进行远程完全复制

nginx1中远程完全复制

scp /etc/keepalived/keepalived.conf      root@192.168.1.11:/etc/keepalived/

在这里插入图片描述
在nginx2调度器上

[root@nginx2 keepalived-2.0.13]# vi /etc/keepalived/keepalived.conf 

修改
router_id nginx2   服务器名称
 state BACKUP      热备状态,MASTER为主,BACKUP为备
 priority 105   优先级

在这里插入图片描述
在nginx1上
1.配置脚本文件,拷贝给nginx2

[root@nginx1 keepalived-2.0.13]# vi /usr/local/src/nginx.sh
[root@nginx1 keepalived-2.0.13]# scp /usr/local/src/nginx.sh   root@20.0.0.11:/usr/local/src     #远程完全复制给nginx2
[root@nginx1 keepalived-2.0.13]# chmod +x /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

2.启动服务,查看日志,虚拟地址

[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调度器上查看

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

在这里插入图片描述
注:查看虚拟ip,会看到未生成虚拟ip,因为虚拟ip只会存在于主服务器

测试:
http://192.168.1.200/
在这里插入图片描述
http://192.168.1.200/index.jsp
在这里插入图片描述
在这里插入图片描述

3.模拟故障

当调度器nginx1出现问题,查看是否高可用
在nginx1上

[root@nginx1 ~]# systemctl stop keepalived.service  
[root@nginx1 ~]# ip addr      #虚拟地址消失

在这里插入图片描述
在调度器nginx2上查看ip addr,可以看到nginx2变为主服务器,显示虚拟地址
在这里插入图片描述
客户机测试还是可以再次访问
192.168.1.200/index.jsp
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值