zoukankan      html  css  js  c++  java
  • 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分流,剩下的走其它后端去。
  • 相关阅读:
    多态
    抽象类和接口
    面向对象3
    类的继承 设计模式
    面向对象2
    面向对象
    复习
    对json的简单认识
    关于AJAX
    PHP配置开发环境
  • 原文地址:https://www.cnblogs.com/zhaoyingjie/p/12728349.html
Copyright © 2011-2022 走看看