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外,还有其他一些参数,如下所示:
- down,表示当前的server暂时不参与负载均衡。
- backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
- max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
- fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
以上就是Nginx配置反向代理和负载均衡的相关知识点,旨在抛转引玉,共同探讨。
备注
晓出净慈寺送林子方
毕竟西湖六月中,风光不与四时同。
接天莲叶无穷碧,映日荷花别样红。
以上是关于Nginx实现反向代理和负载均衡的主要内容,如果未能解决你的问题,请参考以下文章
nginx--❤️图解及代码实现正向代理反向代理及负载均衡(非常实用,建议收藏❤️)
nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP