原理篇介绍负载均衡和nginx反向代理的原理,实现篇就是nginx实现的负载均衡demo介绍
原理:将访问流量根据转发策略分发到后端多台云服务器(ECS实例)的流量分发控制服务。
概述:通过设置虚拟服务地址,将添加的ECS实例虚拟成一个高性能、高可用的应用服务池,并根据转发规则,将来自客户端的请求分发给云服务器池中的ECS实例。
优点:
扩展了应用的服务能力,增强了应用的可用性,简称:SLB。
解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力);
提供故障转移,实现高可用;
通过添加或减少服务器数量,提供网站伸缩性(扩展性);
安全防护;(负载均衡设备上做一些过滤,黑白名单等处理)
代理与反向代理:VPN服务就是我们常用的一种代理(正向代理),用户将请教交给代理服务器,代理服务器访问网站获取数据,之后代理服务器再将数据返还给用户。在这个过程中,应用服务器并不知道用户的存在。只知道代理浏览器的访问。
反向代理是指在服务器端的代理,代理服务器接收用户的请求,再转发给真实服务器,之后再返回给代理服务器再给用户,在这个过程中,用户并不知道真实服务器的存在。
一句话概括:普通代理方式是客户使用代理访问多个外部Web服务器,反向代理模式是多个客户使用它访问内部Web服务器,而非访问外部服务器。
反向代理服务器管理了一组服务器,当用户访问时,代理服务器根据负载均衡算法将请求转发到真实服务器,真实服务器也通过反向代理服务器返还数据。内部服务器不对外部提供服务,所以不需要外部IP,而反向代理服务器需要两个网卡,一个IP用于外部用户访问使用,另外一个用于内部使用。
如上图所示,当用户发起访问,请求访问的ip地址是114.100.20.200,到达反向代理服务器时,根据负载均衡算法得到一个真实服务器的IP地址,并将用户请求转发到该服务器上,当真实服务器处理完之后将数据返回到反向代理服务器。反相代理服务器再将该响应的内容返回给用户。
优点:反向代理服务器位于应用层,负载均衡方案和反向代理服务器集成在了一起,部署简单
缺点:反向代理服务器用户处理所有的请求和响应,其性能可能成为服务器集群的瓶颈
(这部分内容原文链接反向代理)
1.weight轮询(默认,常用):
接收到的请求按照权重分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
2.ip_hash(常用):
每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
3.fair:
智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。
4.url_hash:
按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。
(这部分内容原文链接nginx支持的负载均衡方式)
注意:①必须是不同的tomcat。②必须是同名项目,才能达到多服务器(集群)的目的
1、找到tomcat安装目录,复制整个文件夹,改名为tomcat01(名字是为了好记,复制了之后可以把webapps下的项目都删掉,减小容量,提高复制速度),然后复制tomcat01,改名tomcat02
2、找到tomcat02/conf目录下的server.xml,然后修改访问的各种端口,3个地方
3、准备一个简单的web项目,我的项目名为web_01,index.jsp内容如下。如果不想自己创建,可以下载我这里的war包,点击下载war。(下载所需的5分是系统自定义的,我也不想...)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% System.out.println("Servlet-01"); %>
Servlet-01
Servlet-01
4、打成war包,如web_01.war
5、复制web_01.war到tomcat01/webapps下,启动tomcat01,tomcat会自动解压,然后在浏览器中访问localhost:8080/web_01就可以看到Servlet-01字符串了,tomcat窗口也能看到这个Servlet-01提示信息.注意:不要关闭tomcat01
6、复制web_01.war到tomcat02/webapps下,建议启动tomcat02让tomcat自动解压,然后修改index.jsp,把Servlet-01改成Servlet-02,如下。把内容改了是用于验证本次负载均衡测试是否成功。然后在浏览器中访问localhost:8081/web_01就可以看到Servlet-02字符串。注意:不要关闭tomcat02
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% System.out.println("Servlet-02"); %>
Servlet-02
Servlet-02
7、到这里,可能浏览器没有返回Servlet-02,每次都是返回Servlet-01或者报错。可能原因:
安装tomcat的时候,环境变量配置了%catalina_home%,导致启动第二个tomcat的时候,访问的还是第一个tomcat。每次启动tomcat,都会找到%catalina_home%对应的路径,然后不管启动多少个tomcat,响应的都是%catalina_home%对应的tomcat了
8、安装nginx,nginx是使用反向代理实现负载均衡的,这里我选择的负载均衡调度算法是weight轮询,通过配置权重,决定访问哪个tomcat的几率大小
9、修改nginx安装目录下的conf/nginx.conf文件
http {
#让nginx找到对应目录下的所有配置文件,vhost这个名字是随便起的,然后在conf目录下新建该vhost文件夹
include vhost/*.conf;
include mime.types;
default_type application/octet-stream;
#gzip on;
#配置访问的端口和权重
upstream localhost{
server localhost:8080 weight=1;
server localhost:8081 weight=1;
}
10、在新建的vhost文件夹下新建vhost.conf,这个名字可以随便起,内容如下。这部分主要是为了域名解析,因为我是单机。注意:修改完配置文件之后,要重新加载(如果你已经启动了nginx),cmd到nginx目录下,执行nginx -s reload命令
server {
listen 80;
#域名
server_name www.xxx.com;
location / {
#代理路径,http://localhost的这个localhost就是nginx.conf下的upstream localhost
#这个localhost,然后转到底下的两个服务器,端口为8080,8081
proxy_pass http://localhost;
#代理超时时间
proxy_connect_timeout 500ms;
}
}
11、修改C:\Windows\System32\drivers\etc\hosts文件,这里需要用管理员模式打开,可能会修改不了,具体解决办法就另外百度吧
# 配置本机域名解析,对应nginx底下的
127.0.0.1 www.xxx.com
12、启动nginx,localhost:80,如果这时候没有出现nginx的提示界面,而是其他,那就是端口被占用。win10都是被iis占用了,把iis服务停止就好
13、访问http://www.xxx.com/web_01/,多次访问,会发现有时候返回01,有时候返回02,但二者大概五五开,因为权重设置了1:1,从tomcat的cmd窗口也能看到这个结果。