zoukankan      html  css  js  c++  java
  • nginx的负载均衡概述

    一、负载均衡概述

    • 在网站创立初期,我们一般都使用单台机器对外提供集中式服务;
    • 但是随着业务量的增大,无论是性能上还是稳定性上都会面临更大的挑战;
    • 这时我们就会通过增加服务器的方式来提供更好的服务,即我们会把多台机器组成一个集群对外提供服务;
    • 但是,我们网站对外提供的访问入口通常只有一个,比如 www.163.com;
    • 那么当用户在浏览器输入www.163.com进行访问的时候,如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡在做的事情;
    • 负载均衡通常是指将请求【均匀】分摊到集群中多个服务器节点上执行,负载均衡的关键在于【均匀】,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀;           

    二、负载均衡的实现方式

    1. 硬件负载均衡
    • 比如 F5、深信服、Array 等;
    • 优点是有厂商专业的技术服务团队提供支持,性能稳定;
    • 缺点是费用昂贵,对于规模较小的网络应用成本太高;

             2.软件负载均衡

    • 比如 Nginx、LVS、HAProxy 等;
    • 优点是免费开源,成本低廉;

    三、Nginx负载均衡

    Nginx如何实现负载均衡:(通过在Nginx的nginx.conf文件进行配置即可实现)

    配置如下:(配置2步即可)

    1、在http模块加上:(举例)
    upstream www.myweb.com { 
             server  127.0.0.1:9100 weight=3; 
              server  127.0.0.1:9200 weight=1;  
    } 

    其中weight=1表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越多;

    upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器;

    2、在server模块里添加:(举例)
    location /myweb {
        proxy_pass http://www.myweb.com;
    }

    其中 www.myweb.com 字符串要和 upstream 后面的字符串相等;

    四、Nginx常用负载均衡策略

    1、轮询(默认)  每个请求轮流分配到不同的后端服务器,如果后端服务器down掉,将自动剔除;

    upstream backserver { 
        server 127.0.0.1:8080; 
        server 127.0.0.1:9090; 
    } 

    2、权重   每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况;此算法可做到平均访问,但无法解决session共享问题,可用于接口服务的负载

    upstream backserver { 
        server 192.168.0.14 weight=5; 
        server 192.168.0.15 weight=2; 
    } 

    3、ip_hash   ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决session的问题;即一个用户访问的nginx永远都进入的是同一台服务器,访问同一台服务器不存在session问题,当该台服务器宕机时,session无发共享到其他服务器,即该种算法无法做到服务器之间用户的的session共享,同时存在绝对平均访问的问题,一般可作为应用的分流负载(session不能服务器之间的共享是不完美的)

    upstream backserver { 
        ip_hash; 
        server 127.0.0.1:8080; 
        server 127.0.0.1:9090; 
    }

    4、最少连接  web请求会被转发到连接数最少的服务器上;

    upstream backserver { 
        least_conn;
        server 127.0.0.1:8080; 
        server 127.0.0.1:9090; 
    } 

    5、负载均衡其他几个配置

    upstream backserver { 
        server 127.0.0.1:9090 down; (down 表示当前的server暂时不参与负载均衡) 
        server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器) 
    } 

     以下是接口服务配置情况,可作为参考

    #user  nobody;
    worker_processes  14;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
            use epoll;
        worker_connections  10240;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        off;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
    upstream serverHttp{
            #server 135.*.*.2:8008 weight=10;
            server 135.*.*.3:8008 weight=10;
            server 135.*.*.4:8008 weight=10;
            server 135.*.*.5:8008 weight=10;
    }
    upstream serverWS{
            #server 135.*.*.2:9009 weight=10;
            server 135.*.*.3:9009 weight=10;
            server 135.*.*.4:9009 weight=10;
            server 135.*.*.5:9009 weight=10;
    }
    
        server {
            listen       8888;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
            location ^~ /esb/WebService {
                    root   html;
                    proxy_set_header  X-Real-IP  $remote_addr;
                    proxy_read_timeout 75;
                    proxy_next_upstream off;
                    proxy_pass http://serverWS;
                    }  
            location ^~ /esb {
                    root   html;
                    proxy_set_header  X-Real-IP  $remote_addr;
                    proxy_read_timeout 75;
                    proxy_next_upstream off;
                    proxy_pass http://serverHttp;
                    }
            location / {
                root   html;
                index  index.html index.htm;
            }
    
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ .php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ .php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /.ht {
            #    deny  all;
            #}
        }
    
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    }
  • 相关阅读:
    【Android Developers Training】 73. 布局变化的动画
    【Android Developers Training】 72. 缩放一个视图
    【Android Developers Training】 71. 显示翻牌动画
    svn更改地址怎么办
    python学习手册
    failed to bind pixmap to texture
    Ubuntu 12.04安装Google Chrome
    svn update 时总是提示 Password for '默认密钥' GNOME keyring: 输入密码
    重设SVN 的GNOME keyring [(null)] 的密码
    Nginx + uWSGI + web.py 搭建示例
  • 原文地址:https://www.cnblogs.com/xiaotang5051729/p/9687574.html
Copyright © 2011-2022 走看看