🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Nginx负载均衡(upstream) upstream 主要是配置均衡池和调度方法 proxy_pass 主要是配置代理服务器ip或服务器组的名字 ``` upstream testTomcat{​​ ​​server 127.0.0.1:81 weight=1;​​ ​​server 127.0.0.1:82 weight=1;​​ ​​server 127.0.0.1:83 weight=1;​​ ​​}​​ ​​server {​​ ​​listen 80;​​ ​​server_name test.xm;​​ ​​location /test/ {​​ ​​proxy_pass http://testTomcat;​​ ​​proxy_set_header Host $host;​​ ​​}​​ ​​}​​ ``` proxy_pass配置的4种方式 假如访问:http://192.168.1.1/test/index.php  第一种: ``` location /test/ {​​ ​​proxy_pass http://testTomcat/;​​ ​​}​​ ``` 代理到URL:http://127.0.0.1:81/index.php 第二种(相对于第一种,最后少一个 / ) ``` location /test/ { proxy_pass http://testTomcat; } ``` 代理到URL:http://127.0.0.1:81/test/index.php 第三种: ``` location /test/ { proxy_pass http://testTomcat/abc/; } ``` 代理到URL:http://127.0.0.1:81/abc/index.php 第四种(相对于第三种,最后少一个 / ) ``` location /test/ { proxy_pass http://testTomcat/abc; } ``` 代理到URL:http://127.0.0.1:81/abcindex.php #### 问题1: 假如正访问购物网,看中一款商品,网页一刷新,就被代理到台后端另一台服务器上了,这就会出现问题。希望的是能识别主机,也就是:当一个客户端访问前端,被代理到后台一台服务器后,以后就始终被代理到这台服务器。这里用到ip_hash 通过客户端ip进行hash,再通过hash值选择后端server upstream testTomcat{ ip_hash; ##客户端ip进行hash server 127.0.0.1:89 weight=1; server 61.155.141.13:888 weight=1; server 61.155.141.14:81 weight=1; } ps:其实 ip_hash也还是有一定问题,比如用户在下单时,突然切换网络了(这个问题下次讨论。。。。。。)  #### 问题2: 服务器性能不一样,有的配置较高,有的已经老旧,配置较低,采用上面轮询方式显然不符合负载均衡要求。解决这个问题的办法是:采用比重的方式,在前端配置文件里加入比重参数(weight) ``` ​​upstream testTomcat{​​ ​​server 127.0.0.1:81 weight=1;​​ ​​server 127.0.0.1:82 weight=2;​​ ​​server 127.0.0.1:83 weight=3;​​ ​​}​​ ``` #### 问题3: 如果其中的一台服务器发生错误或超时时,通常希望Nginx自动重试其他的服务。 实际上Nginx本身默认会有错误重试机制,并且可以通过​​proxy_next_upstream​​​来自定义配置,其默认值是​​proxy_next_upstream error timeout,即发生网络错误以及超时,才会重试其他服务器​​ 如果想其他服务器其他状态重试, location /test/ { proxy_pass http://testTomcat; ## 配置http 404 http502 proxy_next_upstream error timeout http_404 http_502; }  注意: 如果get 请求 http://127.0.0.1:81/test/index.php  Nginx默认会失败重试,但是如果是post请求时 Nginx默认不会失败重试 如果想post也默认会失败重试,可以加上选项 ​​non_idempotent​​ location /test/ { proxy_pass http://testTomcat; ## 配置http 404 http502 non_idempotent proxy_next_upstream error timeout http_404 http_502 non_idempotent; } ps:通常情况下,如果请求使用非等幂方法(POST、LOCK、PATCH),请求失败后不会再到其他服务器进行重试。加上​​non_idempotent​​选项后,即使是非幂等请求类型(例如POST请求),发生错误后也会重试。 什么是幂等方法 如果使用该方法的多个相同请求对服务器的预期效果与单个请求的效果相同,则认为请求方法是幂等的。常见的HTTP请求方法中,GET是幂等的,而POST是非幂等的。如果在回答面试题"GET和POST区别"时能答出这一点,才能说明对HTTP协议有一定的理解 在做业务开发是如何理解幂等性,举个最简单的例子:GET方法一般用于获取数据,如果获取的是数据库数据,对应的是SELECT语句。同样的SELECT语句执行一次还是多次,都不会影响数据。而POST一般对应INSERT,如果执行多次后,可能会造成数据重复插入的问题。所以不要使用GET方法做一些INSERT操作,在业务开发时要遵循HTTP协议规范。 注意:生产环境中不建议加上​​non_idempotent​​选项,因为无论是发生500错误还是timeout,服务器上的业务可能已经执行过了,而重试会导致非幂等方法重复执行,从而导致业务问题,例如一个请求会创建了多个订单,或者收到多条短信的问题。