nginx 实现负载均衡

 nginx 实现负载均衡&&一台server发生故障自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。

可增加健康检查地址,判定服务是否正常

nginx 的 upstream目前支持 4 种方式的分配

  • 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
  • weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
  • ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
  • fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
  • url_hash(第三方)

先介绍一些默认参数

       #weigth       参数表示权值,权值越高被分配到的几率越大
       #max_fails    允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream  模块定义的错误 
       #fail_timeout max_fails 次失败后,暂停的时间。
       #down         表示单前的server暂时不参与负载
       #backup       其它所有的非backup机器down或者忙的时候,请求backup机器,这台机器压力会最轻。
       server 120.10.192.72:5050 max_fails=3 fail_timeout=3s weigth=10;
       server 120.10.157.102:5050 max_fails=3 fail_timeout=3s weigth=5;

1.开放一个nginx端口做负载均衡请求的入口例如:80端口

upstream backend_web{
       #ip_hash;
       #weigth       参数表示权值,权值越高被分配到的几率越大
       #max_fails    允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream  模块定义的错误
       #fail_timeout max_fails 次失败后,暂停的时间。
       #down         表示单前的server暂时不参与负载
       #backup       其它所有的非backup机器down或者忙的时候,请求backup机器,这台机器压力会最轻。
       server xxxxx:5050; #gametest1服务
       server xxxxx:5050; #gametest2服务
}

server
{
    listen       80;
    server_name  xx.xx.xx.xx; #如果没有域名这里请输入ip地址
    access_log /opt/nginx_logs/load_gameserver/access.log main;
    error_log /opt/nginx_logs/load_gameserver/access.log;
    index index.html index.htm index.php;

    location /{
        proxy_pass http://backend_web;
        proxy_connect_timeout 1;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header X-Forwarded-For $remote_addr;     
        #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
     proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
 

    }

}

gametest1和gametest2 ngin配置一样

server {
    listen  5050;
    server_name xxxxxx;
    client_max_body_size 20m;
    access_log /opt/nginx_logs/gameserver/access.log main;
    error_log  /opt/nginx_logs/gameserver/error.log;


location = /platform/get_main_h5 {
    secure_link $arg_sign,$arg_et;
    secure_link_md5 "$uri $arg_version_name $arg_channel_name $arg_device_id $arg_et $arg_nonce_str gohell";

    if ($secure_link = "") {
        return 403;
    }
    if ($secure_link = "0") {
        return 410;
    }
    if ($arg_sign = "") {
        return 504;
    }
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods POST,GET,OPTIONS;
    add_header Access-Control-Allow-Headers x-requseted-with,content-type;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_headers_hash_max_size 51200;
    proxy_headers_hash_bucket_size 6400;
    set_real_ip_from 0.0.0.0/0;
    real_ip_header  X-Forwarded-For;
    include  uwsgi_params;
    uwsgi_pass 127.0.0.1:7072;
    }


location / {
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods POST,GET,OPTIONS;
    add_header Access-Control-Allow-Headers x-requseted-with,content-type;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_headers_hash_max_size 51200;
    proxy_headers_hash_bucket_size 6400;
    set_real_ip_from 0.0.0.0/0;
    real_ip_header  X-Forwarded-For;
    include  uwsgi_params;
    uwsgi_pass 127.0.0.1:7072;
    }
}

实现多台服务器之间session的共享

  • nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的

  

upstream backend {  
  server 127.0.0.1:8080 ;
  server 127.0.0.1:8081 ;
   ip_hash;
}

ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,因此ip_hash是有缺陷的,不能在一些情况下使用:

  • nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。
  • nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器。最好的办法是用location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。
原文地址:https://www.cnblogs.com/zhaoyingjie/p/12728349.html