联系邮箱:254200493@qq.com 登录 注册

nginx负载均衡实现

2020-01-18 10:13:57

上次梳理了一下正向代理和反向代理的概念,这次我们来了解下nginx负载均衡的配置
nginx常见的几种负载均衡配置方式
1、轮询(round-robin):nginx默认就是轮询其权重都默认为1,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream mysvr { 
server 127.0.0.1:8001;
server 其他服务器IP:80;
}

网上的说法轮询方式是服务器ABABAB...这样的方式,我用nginx1.16.1实测并不是这样的,有兴趣的朋友可以测试看看。
2、加权轮询:指定轮询几率,weight值越大访问频率越高,主要用于后端服务器性能不一致的情况

upstream mysvr { 
server 127.0.0.1:8001 weight=1;
server 其他服务器IP:80 weight=2;
}

3、ip_hash:每个请求按访问ip的hash结果分配,每个访客固定访问一个后端服务器。

upstream mysvr { 
server 127.0.0.1:8001;
server 其他服务器IP:80;
ip_hash;
}

4、热备(backup):当其它所有的非backup服务器down或者忙的时候,请求会分发至backup服务器。所以这台机器压力会最轻。

upstream mysvr { 
server 127.0.0.1:8001;
server 其他服务器IP:80 backup; #热备
}

5、fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream mysvr { 
server 127.0.0.1:8001;
server 其他服务器IP:80;
fair;
}

6.down:表示单前的server暂时不参与负载

upstream mysvr { 
server 127.0.0.1:8001;
server 其他服务器IP:80 down;
}

常见问题及配置
1、如果使用upstream配置一组服务器作为被代理服务器,服务器中的访问算法会遵循配置的负载均衡规则。
同时也可以指定在发生哪些异常情况时,将请求顺次交由下一组服务器处理。
proxy_next_upstream timeout; #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
(1)error:建立连接或向被代理的服务器发送请求或读取响应信息时服务器发生错误。
(2)  timeout:建立连接,想被代理服务器发送请求或读取响应信息时服务器发生超时。
(3)  invalid_header:被代理服务器返回的响应头异常。
(4)  off:无法将请求分发给被代理的服务器。
(5)  http_400,....:被代理服务器返回的状态码为400,500,502,等。
配置实例如下:

upstream golfapp{
server 47.56.233.123:80;
server 127.0.0.1:8001;
}
server {
listen 80;
server_name 域名;
location ~*^.+$ {
proxy_pass http://golfapp; #请求转向mysvr 定义的服务器列表
proxy_next_upstream http_500;
}
}

2、我们在项目开发过程中,有时需要记录用户访问IP。如果使用反向代理的方式,我们会发现程序不能获取到真实的用户IP。这时候就需要增加如下配置:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; #把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中使用$X-Real-IP就可以获取源IP;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #在nginx作为代理服务器时,设置的IP列表,会把经过的服务器ip,代理服务器ip都记录下来,用 【,】隔开;代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源IP

3、例:nginx服务器给2台web服务器(A和B)做代理,负载均衡算法采用轮询,如果服务器A故障,那么nginx服务器的请求还是会分发给服务器A。这样响应连接时间就会过长,导致客户端的页面一直在等待响应,对用户来说体验是不好的。

如果负载均衡中其中服务器A发生故障,nginx首先会去服务器B,但是nginx在配置不当的情况下会继续分发请求给服务器A,然后等待服务器A响应,直到响应超时,才会把请求重新分发给服务器B。
这显然是不合理的,下面配置是一种解决方案:
proxy_connect_timeout 1; #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。

下面是一个完整的配置实例:

upstream golfapp{
#ip_hash;
server 47.56.233.123:80 backup; #weight=1
server 127.0.0.1:8001;
}
server {
listen 80;
server_name 域名;
location ~*^.+$ {
proxy_pass http://golfapp; #请求转向mysvr 定义的服务器列表
proxy_next_upstream http_500;
}
}

server {
listen 8001;
server_name 域名;
root 项目路径;
index index.html index.htm index.php;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
#root /home/php_web/tk_v3/public;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}



相关文章