一、负载均衡简介

有时候,我们的后端工程压力太大,可能需要将后端工程部署在多台服务器上,此时就需要使用负载均衡了。
负载均衡目的:提升吞吐率, 提升请求性能, 提⾼容错率。
Nginx 实现负载均衡用到了 proxy_pass 代理模块核心配置, 将客户端请求代理转发至一组 upstream 虚拟服务池。nginx 的负载均衡功能依赖于 ngx_http_upstream_module模块。upstream 模块应该放于http{}标签内。
模块写法如下:

upstream backend {
    server backend1.example.com;
    server backend2.example.com:8080;
    server 127.0.0.1:8080;
}

然后在location处使用如下写法:

location / {
    proxy_pass http://backend;
}

以上写法的意思就是,按时间顺序依次将请求分配到各个后台服务器(upstream中配置的server)。 以下是一份简略的nginx配置文件

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    upstream backend {
    server backend1.example.com;
    server backend2.example.com:8080;
    server 127.0.0.1:8080;
    }

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
o    try_files $uri $uri/ /index.html;
        }
        error_page   500 502 503 504  /50x.html;
        location ^~ /api/ {
            proxy_pass http://backend/;
        }
    }
}

二、简单示例

以我的blog为例,在本地运行一台后端服务,服务器上的保持原样。先将前端项目部署在nginx上,再使用nginx配置简单负载均衡示例。
upstream配置:

upstream backend{
        server 127.0.0.1:8080;
        server www.ysongblog.cn:8080;
}

server配置:

server {
        listen       80;
        server_name  127.0.0.1;

        location / {
            root   /usr/local/vue/blog;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }

        location ^~ /api/ {
            proxy_pass http://backend/;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    }
}

以上配置的意思为:
这里的^~ /api/表示匹配后端uri请求,当用户请求后端接口时,按时间顺序依次将请求分配到各个后台服务器(也就是upstream中配置的服务器。
配置完成后reload一下,查看效果。

为了展示效果我将其中一台服务器的文章删掉一篇,按照以上配置的结果应该为,访问blog主页,每次刷新页面会请求不同的服务器,其中一台少一篇文章。

三、nginx提供的几种不同的负载均衡算法

(1)round robin 轮询 (默认) 按时间顺序依次将请求分配到各个后台服务器中,挂掉的服务器自动从列表中剔除

upstream bakend {  
   server 192.168.0.1 down;    
   server 192.168.0.2;  
}

(2)weight 轮询权重 weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下,或在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

upstream bakend {  
    server 192.168.0.1 weight=20;  
    server 192.168.0.2 weight=10;  
}

(3)ip_hash:每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。

upstream bakend {  
    ip_hash;  
    server 192.168.0.1:88;  
    server 192.168.0.2:80;  
} 

(4)url_hash:按访问的URL的哈希结果来分配请求,使每个URL定向到同一台后端服务器,可以进一步提高后端服务器缓存的效率。Nginx本身不支持url_hash,需要安装Nginx的hash软件包。

upstream backend {  
    server 192.168.0.1:88;     //使用hash语句时,不能在使用weight等其他参数
    server 192.168.0.2:80;  
    hash $request_uri;  
    hash_method crc32;    //使用hash算法
}

(5)fair算法:可以根据页面大小和加载时间长短智能地进行负载均衡,根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持fair,要安装upstream_fair模块才能使用。

upstream backend {  
    server 192.168.0.1:88;  
    server 192.168.0.2:80;  
    fair;  
}