Nginx实现反向代理和负载均衡

Posted 天马行空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx实现反向代理和负载均衡相关的知识,希望对你有一定的参考价值。

nginx的代理功能与负载均衡功能是最常被用到的,本文主要简述代理,反向代理,负载均衡的相关知识点,及利用Nginx实现反向代理和负载均衡的操作步骤,仅供学习分享使用,如有不足之处,还请指正。

什么是代理?

比如,在国内由于国情原因,谷歌网站被屏蔽,无法访问,就需要设置代理服务器进行访问,代理服务器通过解析客户端请求,发送给服务端,并接收服务端返回信息,然后返回给客户端。在此过程中,服务端并不知道客户端是哪一个,只跟代理服务器进行通信,以达到隐藏客户端身份的目的。再比如,当在外公司外面,需要访问公司内网,则需要通过VPN进行连接,VPN也是代理服务器的一种。代理示意图如下所示:

什么是反向代理?

对于访问量高的系统,一台服务器是无法满足性能上的要求,通常都会部署多台服务器来满足实际的需要,如:百度,谷歌等大型搜索引擎。这个时候,通常都会设置一个入口来分发不同的请求到各个服务器上。实际上用户并不知道访问的是哪一台服务器,这样就很好的隐藏了服务端,也减少了服务器暴露的风险。在此过程中,充当访问入口的服务器,就是反向代理服务器,示意图如下:

正向代理和反向代理的区别:主要看代理服务器是在客户端,还是服务端。是为了隐藏客户端,还是为了隐藏服务端。

什么是负载均衡?

在实际项目的服务器部署过程中,有的服务器性能好,有的服务器性能差,如果所有的访问机会都是均等的,则会造成有的服务器不堪重负,有的服务器又会造成资源浪费,所以负载均衡就是为了让每一个资源都得到最大限度的合理利用。Nginx提供的负载均衡内置策略为轮询,加权轮询,Ip hash三种,以下三种负载均衡策略分别介绍。

轮询方式是默认的负载均衡策略,每一个服务资源被分配到的机会都是均等的,示意图如下所示:

加权轮询,及根据特殊的需要,每一个资源按不同的权重(百分比)被分配利用,以达到合理利用资源的目的,示意图如下:

ip hash,

当用户第一次访问时,采用轮询或加权轮询的访问分配资源,然后对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。 示意图如下:

Nginx实现反向代理

反向代理和负载均衡相辅相成,互为一体,所以合并一起分析。反向代理,隐藏服务提供方,步骤如下:

 1. 加两个虚拟服务主机节点,如下所示:

 1     server {
 2        listen 8080;
 3        server_name localhost;
 4        location / {
 5           root html2;
 6           index index.html index.htm;
 7        }
 8     }
 9     server {
10        listen 8081;
11        server_name localhost;
12        location / {
13           root html3;
14           index index.html index.htm;
15        }
16     }

截图如下:

2. 增加upstream负载均衡节点,两个服务分别指向8080,8081两个虚拟主机,如下所示:

1     # 增加一个负载均衡节点
2     upstream www.alan.hsiang.com {
3        server 192.168.127.132:8080;
4        server 192.168.127.132:8081;
5     }

截图如下:

3. 增加服务节点的,配置代理服务列表,如下所示:

proxy_pass 用于指向定义的服务列表

 1     #新增一个服务节点
 2     server {
 3        listen 80;
 4        server_name wwww.alan.hsiang.com;
 5        location / {
 6           #root html3;
 7           #index index.html index.html;
 8           proxy_pass http://www.alan.hsiang.com;
 9        }
10     }

截图如下所示:

4. 切换到 /usr/local/nginx/sbin目录下,启动nginx,如下所示:

5. 打开浏览器,输入域名。

nginx默认的负载均衡策略为轮询方式,则可以看到,输入域名后,随着刷新页面,两个端口内容交替出现,如下所示:

8080端口服务,如下所示:

8081端口,内容如下:

Nginx实现负载均衡

在负载均衡节点,配置权重【8080端口服务有1/3的机率,8081端口服务有2/3的机率】如下所示:

1     # 增加一个负载均衡节点
2     upstream www.alan.hsiang.com {
3        server 192.168.127.132:8080 weight=1;
4        server 192.168.127.132:8081 weight=2;
5     }

截图如下:

然后重新加载nginx即可,在浏览器刷新页面,则会发现8080被调用的次数大约占比1/3,8081被调用的次数大约占比2/3 。

Nginx的ip hash策略

ip_hash:nginx会让相同的客户端ip请求相同的服务器。对于session在服务端的存储有很大的作用,不然对于同一个客户端,如果每次访问的服务节点都不同,则无法判断是否登录等需要通过session判断的内容。采用ip_hash则让同一客户端每次都访问同一个服务器,避免需要重复登录的问题。

1     # 增加一个负载均衡节点
2     upstream www.alan.hsiang.com {
3        server 192.168.127.132:8080 weight=1;
4        server 192.168.127.132:8081 weight=2;
5        ip_hash;
6     }

配置负载均衡,除了weight外,还有其他一些参数,如下所示:

  1. down,表示当前的server暂时不参与负载均衡。
  2. backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
  3. max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
  4. fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

以上就是Nginx配置反向代理和负载均衡的相关知识点,旨在抛转引玉,共同探讨。

备注

晓出净慈寺送林子方

【作者】杨万里 【朝代】宋

毕竟西湖六月中,风光不与四时同。

接天莲叶无穷碧,映日荷花别样红。

以上是关于Nginx实现反向代理和负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

nginx--❤️图解及代码实现正向代理反向代理及负载均衡(非常实用,建议收藏❤️)

nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP

nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP

nginx学习3:实现nginx反向代理和负载均衡

Nginx实现反向代理和负载均衡

Nginx简单实现反向代理和负载均衡