一、负载均衡
1.相关概念
nginx的反向代理<-->负载均衡
负载均衡
将四层或者是七层的请求分配到多台后端的服务器上,从而分担整个业务的负载。提高系统的稳定性,也可以提供高可用(备灾,其中的一台后端服务器如果发生故障不影响整体业务)。
负载均衡的特点
- 根据算法把不同的请求分发到不同的服务器
- 客户端访问的是代理地址,相应也是代理服务器响应
- 客户端并不了解后端服务器的情况
- 可以提高安全性,后端服务器是隐藏的
- 负载均衡是有缓存的,可以直接访问缓存,提高响应的速度
2.负载均衡的算法
(1)round robin 轮询
rr: 负载均衡的默认算法,请求轮流分配给后端服务器。
轮询算法适用于后端服务器处理能力相近(规格相同,2核4G,硬盘空间都512G等)的情况,默认的算法,可以不加。
(2)加权轮询
weight round robin 轮询的升级版,给每个后端服务器赋予不同的权重。
处理能力更强的服务器设置更高的权重;处理能力低的,设置低权重。
权重用数字表示
高峰时间可以通过这个方法进行流量的优化。
适用于服务器处理能力差异比较大的情况。
(3)最少连接数
配合加权轮询一块使用,最少连接数的算法可以将请求发送到当前连接比较少的服务器。
这种算法适用于后端服务器处理任务耗时不同的情况,可以有效的避免所有的请求集中在处理能力更强的后端服务器上。
(4)ip_Hash
当客户端访问后端服务器,根据客户端的ip地址,使用hash算法计算出ip地址的hash值,然后再把请求发送到相应的后端服务器。如果客户端访问的ip地址相同,通过hash算法,再一次的请求会被分配到上一次的服务器。保证会话的稳定。
负载均衡的会话保持------> ip_Hash
会话保持到期之后,会话中断,重新请求会重新计算hash值
A 192.168.206.60----> hash值----> B
中断
A 192.168.206.60----> hash值----> C
(5)url_hash
根据请求当中的URL地址来计算hash值,如果客户端请求的URL地址相同,客户端的请求会被分配到同一个服务器上。
www.baidu.com/test1 ---------> hash值 ---------> nginx1
www.baidu.com/test2 ---------> hash值 ---------> nginx2
后台服务器的数量发生变化,会影响结果。
3.负载均衡的语法架构
配置流量分发,主要是依靠代理服务器完成,主要配置在代理服务器完成,配置算法。
使用三台虚拟机模拟情景
nginx1 192.168.206.60 代理服务器
nginx2 192.168.206.70 后端服务器1 echo 707070 > index.html
nginx3 192.168.206.80 后端服务器2 echo 808080 > index.html
客户端:谷歌浏览器
#为了更直观的感受所以把后端服务端的页面显示内容设置成不一样的,真实情况下服务端的页面应该都是一致的
(1)七层代理
- upstream是nginx自带的。
- upstream模块仅支持http协议,用来处理http的请求和响应。
- upstreaem只能写在http模块中。不能在server/location/全局模块中。
- 没有特殊情况,一般做七层代理。
*支持轮询
编辑代理服务器的/usr/local/nginx/conf/nginx.conf
*支持权重轮询
*支持最少连接数
*支持ip_hash
*支持url_hash
(2)基于域名的七层代理(轮询)
#nignx1、 nignx2、nignx3都需要配置/etc/hosts
#配置如下
192.168.206.60 www.happy.com
192.168.206.70 www.zhangsan.com
192.168.206.80 www.lisi.com
(3)四层代理
stream模块不支持http协议,仅支持tcp/udp协议,处理数据包的流量分发。
四层代理需要写在全局模块当中。
安装nginx的时候必须要有支持streeam模块。
*支持轮询
*支持加权轮询
*支持最少连接数
*不支持ip_hash和url_hash
二、Tomcat
1.介绍
Tomcat是一个Java Web服务器,它实现了Java Servlet、JavaServer Pages(JSP)、Java Expression Language(EL)和Java WebSocket技术规范。它主要用于运行Java Web应用程序,提供HTTP服务。
- java servlet: tomcat是一个servlet容器,负责管理和执行java-servlet,服务端的java程序。处理客户端的htpp的请求和响应。
- java server 服务端的配置
- pages 动态页面的技术 -------> java代码完成的
tomcat既可以作为以java代码为基础的动态页面,也可以处理和转发动态请求。tomcat的并发能力很差,适合小项目。
2.Tomcat的核心组件
(1)web容器
处理web的请求,响应,动态页面的展示
(2)jsp容器
解析index.jsp中的java代码转换为servlet的代码,然后servlet编译执行
jsp是一种技术模板,类似于html语言,允许在html文件当中,嵌入java的代码
(3)servlet容器
接收web容器的请求,负责加载初始化,执行和管理。
功能组件
- connector:接受外部的请求以及响应
- container:包含了engine host context webapp 四个组件组成
- service:包含了connector和container
- engine:引擎,用来管理多个虚拟主机,一个service只能有一个engine
- host:代表一个虚拟主机,也可以理解为站点
- context:对应的web应用
- webapp(wrapps):最终的封装器,容器的最底层 index.jsp
3.Tomcat的配置
(1)Tomcat的目录结构
目录名称 | 作用 |
bin | 存放启动和关闭的脚本文件 |
conf | tomcat的配置文件 |
logs | tomcat的日志文件 |
temp | 保存临时文件的目录 |
webapps | 保存不同项目的应用目录 |
work | 工作目录 |
(2)Tomcat的配置文件
主要的配置文件有server.xml(服务器配置)、web.xml
(Web应用程序配置)等。
4.安装Tomcat
#安装依赖软件
apt -y install openjdk-8-jdk-headless
java -version #查看java的版本#解压压缩包,改名并移动到/usr/local下
#进入/tomcat/bin/下,启动程序
5.实例:访问多个JSP Page
#创建pages
cd /usr/local/tomcat/webapps/
mkdir test1 test2
cd test1
vim index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>cd test2
vim index.jsp
#修改下面一行,其余同上
<% out.println("动态页面 2,http://www.test2.com");%>
#编辑主配置文件
cd /usr/local/tomcat/conf
vim server.xml
#在最下面的</html>下面添加 (以什么开头以什么结尾)
<Host name="www.test1.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test1" path="" reloadable="true" />
</Host><Host name="www.test2.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test2" path="" reloadable="true" /></Host>
#Host name主机名"ww.test1.com"
#appBase="webapps" web应用程序目录
#unpackWARs="true" 是否对.war格式结尾文件进行展开,默认配置
#autoDeploy="true" tomcat在运行时会自动部署webapps里面对应的配置
#xmlValidation="false"是否验证xml文件的有效性
#xmlNamespaceAware="false”是否启动xml的命名空间
#Context docBase="/usr/local/tomcat/webapps/test1" 用来说明对应站点的工作的目录
#做域名映射
vim /etc/hosts
192.168.206.60 www.test1.com www.test2.com