nginx配置负载均衡,nginx容灾配置,6种常见方式,如轮询、ip_hash、url_hash、权重weight、请求失败fair、请求数量

当网站的流量比较大的时,可以通过增加服务器的方式分流用户的请求,可以开几台服务器同时工作,根据用户的距离等算法,对用户的请求分发开来。

nginx 是个很不错的负载均衡程序,而且配置很简单,负载功能用到 nginx的upstream 模块:

#weight【权重】越大被请求的概率越大;max_fails周期失败次数;fail_timeout请求周期,这里的意思是10s内请求失败次数为2以上自动判断这个节点不可用,

#默认是10s内1次,那么在10s内不再请求该节点,自动到分发到其他能用的节点上

upstream stream_group{
ip_hash; #这个分配方式,有6种,在下面说明
server 服务器IP1 weight=1 max_fails=2 fail_timeout=10;
server 服务器IP2 weight=2 max_fails=2 fail_timeout=10;
server 服务器IP3:端口号 down; #down代表这台服务器暂停服务,不要分发进来
server 服务器IP4:端口号 weight=2; #仅指定权重,其他默认
server 服务器IP5:端口号; #都用默认
server 服务器IP6:端口号 backup; #backup这是备胎的意思,只有其他服务器都挂了或者忙不过来了,这台才会开始任务,这家伙平时没啥事,最后关键时刻还得靠它呢

}
server{
#这里其他配置省略不写
    location / {             
       proxy_pass http://stream_group; #这里需要加上upstream的名称
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       #异常容灾,返回下面的状态码时自动切换好的服务器
       proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404 non_idempotent;
    }
}

核心代理部分,就是把请求转发到上面配置的upstream xxx

server{
#下面就是转发
 location / {             
       proxy_pass http://xxx; #这里需要加上upstream的xxx名称
    }
}

包括所有php的转发

location /{  
   proxy_pass http://myServer;
    proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       #异常容灾,返回下面的状态码时自动切换好的服务器
       proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404 non_idempotent;
 }
 location ~* .*.php$ { 
    proxy_pass  http://myServer; 
    proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #异常容灾,返回下面的状态码时自动切换好的服务器
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404 non_idempotent;
 }


upstream目前常用的6种分配方式:

1.轮询模式:默认的模式

按请求时间一个一个来请求,有序地进行,如果有down的或者其他的自动跳过到下一个。

upstream myServer { 
  server localhost:805 ; 
  server localhost:806  weight=1 max_fails=2 fail_timeout=10; 
  server localhost:804  weight=2 max_fails=2 fail_timeout=10;   
}


2.ip_hash【ip_hash】:根据IP分区分配

只要用户的IP不变,那么用户访问的就是同一台固定的服务器,在用session的网站比较合适,这有利于保证session有效,用内存数据库的另当别论。

upstream  myServer {
   ip_hash;
   server localhost:805 ; 
   server localhost:806  weight=1 max_fails=2 fail_timeout=10; 
   server localhost:804  weight=2 max_fails=2 fail_timeout=10; 
 }


3.weight【weight=权重】:权重模式,越大请求分配的概率越大

这种模式一般用在服务器性能不同的服务器群,性能高的当然权重就相对高,反之则少分发。

upstream myServer { 
  server localhost:805  weight=2 ; 
  server localhost:806  weight=1 max_fails=2 fail_timeout=10; 
  server localhost:804  weight=2 max_fails=2 fail_timeout=10; 
}


4.最少连接数,自动判断哪个最少连接,则自动连接到对应的服务器

upstream myServer { 
  least_conn;
  server localhost:805 ; 
  server localhost:806  weight=1 max_fails=2 fail_timeout=10; 
  server localhost:804  weight=2 max_fails=2 fail_timeout=10; 
  
}


5.fair(第三方,要额外安装编译):根据响应时间分配

由服务器响应的时间决定优先级,响应时间越短的服务器就优先级越大,响应时间越短则被分配到的请求量越大。

upstream myServer { 
  server localhost:805 ; 
  server localhost:806  weight=1 max_fails=2 fail_timeout=10; 
  server localhost:804  weight=2 max_fails=2 fail_timeout=10; 
  fair;
}


6.url_hash【hash $request_uri】(第三方,要额外安装编译):由访问url的hash结果分配,暂且理解成重定向吧

比如有些文件需要下载,放在了一个专属的服务器,请求相同url的请求都分发到该服务器去。一般用在资源服务器、需要缓存文件的服务器,比如文件下载。

upstream myServer{
    hash $request_uri;
    server localhost:805;
    server localhost:806;
    server localhost:804;
}
server {
    location /{
        proxy_pass http://myServer;
    }
}



操作案例:

[root@instance-6ocolrk6 vhost]# cat alipay168.cn.conf

upstream test1 {
server 127.0.0.1:8083 weight=2 ;#hellow
server 127.0.0.1:8082 weight=3 ;#dir 2
server 127.0.0.1:80 weight=2 ;#目前没有配置,会默认返回nginx默认页面
}
server {
    listen  80;
    server_name www.alipay168.cn;
    index index.php index.html;
    root    /web/nginx/alipay168;
    location /{
        proxy_pass http://test1;
    }

    location ~\.php$ {
        fastcgi_pass 127.0.0.1:9000;#php-fpm的默认端口是9000
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}


刷新测试页面,查看负载分配效果:



评论/留言