一.什么是负载均衡和反向代理
随着网站访问量的快速增长,单台服务器已经无法承担大量用户的并发访问,必须采用多台服务器协同工作,以提高计算机系统的处理能力和计算强度,满足当前业务量的需求。而如何在完成同样功能的多个网络设备之间实现合理的业务量分配,使之不会出现一台设备过忙,而其他的设备却没有充分使用的情况。要解决这一问题,可以采用负载均衡的方法。
负载均衡
负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助,通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求,负载均衡能够平均分配客户请求到服务器阵列,藉此快速获取重要数据,解决大量并发访问服务问题。这种群集技术可以用最少的投资获得接近于大型主机的性能。
常见的web负载均衡的方法
1.用户手动选择不同的线路,不同的服务器链接的方式。例如:
2.DNS轮询方式大多域名注册商都支持对同一主机名添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡。例如:
这样我们每次访问A的时候域名都会被随机解析到其中一个IP上,从而实现负载均衡的目的。DNS轮询的两个明显缺点
- 可靠行低
假设轮询过程中有一台服务器故障,那么所有访问该服务器的请求都将不会在有所回应。即使从DNS中把这个故障的服务器IP去除,他也需要一些时间才能生效。
- 负载分配不均衡
DNS负载均衡采用的是最简单的轮询负载算法,不能区分服务器的当前运行状态,不能做到配置高的服务器多分配请求,配置低的少分配,甚至可能所有请求集中在某一台上。DNS服务器是按照一定的层次结构组织的,本地DNS服务器会缓冲已解析的域名到IP地址的映射,这会导致该DNS服务器的用户在一段时间内访问的是同一台web服务器,导致负载不均衡。
反向代理
反向代理(Reverse Proxy)是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。既然说到反向代理那有没有正向代理呢?结果是肯定的。我们简单概述下正向代理的概念。
正向代理
正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。
区别
正向代理需要你主动设置代理服务器ip或者域名进行访问,由设置的服务器ip或者域名去获取访问内容并返回;而反向代理不需要你做任何设置,直接访问服务器真实ip或者域名,但是服务器内部会自动根据访问内容进行跳转及内容返回,你不知道它最终访问的是哪些机器。
正向代理代理的是客户端,为客户端收发请求,使真实客户端对服务器不可见;并且代理服务器与客户端处在同一局域网中。
反向代理代理的则是服务端,并且代理服务器与真实服务器处在同一局域网中,为服务器收发请求,使真实服务器对客户端不可见。 如何想详细了解正向代理和反向代理的区别可以参考:
这里就不多叙述了,下面我们讲下Nginx负载均衡和反向代理如何配置
二.配置负载均衡和反向代理
讲负载均衡之前我们先了解一下负载均衡的HTTP Upstream模块 Nginx的负载均衡和反向代理的配置文件是在我们安装Nginx的目录下的conf文件夹下的nginx.conf文件 下面是我的安装路径:
我们可以打开的nginx.conf文件,找到Http下的server模块,在上方添加我们的Upstream模块。如下图:
然后我们说下Upstream模块里的几个重要指令
ip_hash指令
当对后端的多台服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。这样,当某个IP的用户在后端web服务器A上登录后,再访问该站点的其他URL能保证其访问的还是服务器A,如果不采用ip_hash指令,假设来自某个IP的用户在服务器A上登陆后,在访问该站点的其他url有可能被定向到后端服务器B,C上,由于用户登陆后session信息是记录在A上的,这就会出现用户未登陆的情况。
使用ip_hash指令无法保证后端服务器的负载均衡,可能有些后端服务器接受的请求多,有的少,并且设置服务器权重登方法将不起作用,所以如果后端能做到session共享,不建议使用ip_hash方式。
upstream指令
Upstream后面的名称可以任意,后面用于配置我们的代理路径。
upstream模块里就是配置我们用来做负载均衡服务器的地方 我这边是一台机器启动了2个不同端口的tomcat用于测试。
server指令
该指令用于指定后端服务器的名称和参数。服务器的名称可以是一个域名,一个IP地址,端口号等。 在服务器名称后,可以跟以下参数:
- weight:服务器的权重,权重数值越高,被分配的客户端请求数越多,默认为1
- max_fails:在参数fail_timeout指定的时间内对后端服务器请求失败的次数,如果检测到后端服务器无法连接或者发生错误(404错误除外),则标记为失败,如果没有设置,默认为1,设为0将关闭这项检查。
- fail_timeout:在经历参数max_fails设置的失败次数后,暂停的时间。
- down:标记服务器为永久离线状态,用于ip_hash指令。
- backup:仅仅在非backu服务器全部宕机或者繁忙的时候才启用。
下面是我配置好的nginx.conf文件
然后我们启动nginx来访问看一下 启动命令:cd /opt/local/nginx/sbin;./nginx复制代码
然后我们访问
我们可以看到Nginx把我们的请求分发到了不同的服务器上,因为我们之前配置的权重相同,所以请求落到两个服务器上的概率也差不多。参考:《实战Nginx.取代Apache的高性能Web服务器》