博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx入门(2)反向代理和负载均衡
阅读量:6277 次
发布时间:2019-06-22

本文共 2614 字,大约阅读时间需要 8 分钟。

一.什么是负载均衡和反向代理

随着网站访问量的快速增长,单台服务器已经无法承担大量用户的并发访问,必须采用多台服务器协同工作,以提高计算机系统的处理能力和计算强度,满足当前业务量的需求。而如何在完成同样功能的多个网络设备之间实现合理的业务量分配,使之不会出现一台设备过忙,而其他的设备却没有充分使用的情况。要解决这一问题,可以采用负载均衡的方法。

负载均衡

负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助,通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求,负载均衡能够平均分配客户请求到服务器阵列,藉此快速获取重要数据,解决大量并发访问服务问题。这种群集技术可以用最少的投资获得接近于大型主机的性能。

常见的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服务器》

转载于:https://juejin.im/post/5c99d417e51d4579e354853f

你可能感兴趣的文章
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>
package.json
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>
计算机基础知识复习
查看>>
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>