Nginx之负载均衡

Nginx 阅读: 244

什么是负载均衡

负载均衡是高可用网络基础架构的的一个关键组成部分,有了负载均衡,我们通常可以将我们的应用服务器部署多台,然后通过负载均衡将用户的请求分发到不同的服务器用来提高网站、应用、数据库或其他服务的性能以及可靠性。

简单来说就是将客户的请求均衡的分配给多台服务器处理。

Nginx负载均衡相关指令

Nginx实现负载均衡需要了解两个指令:upstream 和 proxy_pass 。

upstream指令

指令语法:

Syntax: upstream name { ... }
Default: —
Context: http

官方文档的例子:

resolver 114.114.114.114;

upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;

    server backup1.example.com  backup;
}

backend 是这个服务器集群的名字,upstream中的每个server增加一台服务器,服务器地址可以写ip、unix sock、域名(需要使用resolver指令配置dns解析)。

server指令语法:

Syntax: server address [parameters];
Default: —
Context: upstream

常见parameters有:

  • weight=number 设置服务器的权重(默认值为1)。
  • max_conns=number 限制与代理服务器的同时活动连接的最大数量(1.11.5)。如果服务器组不驻留在共享内存中,则每个工作进程的限制都有效。(默认值为0,意味着没有限制)
  • max_fails=number 设置的持续时间内与服务器通信的失败尝试次数(默认值为1)。
  • fail_timeout=time 设置的持续时间内与服务器通信的失败尝试时间(默认值为10s)。
  • backup 将服务器标记为备份服务器。当主服务器不可用时,将传递请求。
  • down 将服务器标记为永久不可用。
  • resolve 监视与服务器域名相对应的IP地址的变化,并自动修改upstream配置,而不需要重新启动nginx(1.5.12)。服务器组必须驻留在共享内存中。

更多详细查看官网文档: http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream

proxy_pass指令

proxy_pass指令语法:

Syntax: proxy_pass URL;
Default: —
Context: location, if in location, limit_except

设置代理服务器的协议和地址以及应该将位置映射到的可选URI。作为协议,可以指定“http”或“https”。可以将地址指定为域名或IP地址,并指定一个可选端口,或作为UNIX域套接字路径,在单词“unix”之后指定,并以冒号括起来。

更多详细查看官网文档: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

Nginx负载均衡算法

负载均衡算法是指:将客户端请求如何分配给服务器集群处理的方法。Nginx中常用的负载均衡算法有:

轮询法

将客户端请求按照时间顺序依次分配给后台服务器。

适用于后台机器性能一致的情况。

weight(权重法)

通过设置服务器的权重值,指定服务器请求分配几率,weight和访问率成正比。

用于后端服务器性能不均的情况。

ip_hash(ip哈希法)

根据请求者ip的hash值将请求发送到后台服务器中,可以保证来自同一ip的请求被打到固定的机器上。

可以解决session问题。

url_hash(url哈希法)

根据请求的url的hash值将请求分到不同的后台服务器,当后台服务器为缓存的时候效率高。

fair(最短响应时间法)

根据后台响应时间来分发请求,响应时间短的分发的请求多。

least_conn(最少链接数法)

最少链接数,哪个机器连接数少就发分发给哪个机器。

配置负载均衡

配置upstream

upstream指令的上下文是http,因此先在配置文件的http块中添加upstream块:

    # 设定实际的服务器列表 
    upstream backend{
        # ip哈希法
        #ip_hash;

        # 最少链接数法
        #least_conn;

        # 最短响应时间法
        #fair;

        # url哈希法
        #hash $request_uri;
        #hash_method crc32;

        # 设置weight配置权重法
        server address [weight=w1] [parameters];
        server address [weight=w2] [parameters];
        server address [weight=w3] [parameters];
        # ...
    }

根据需要选择合适的负载均衡算法。

配置proxy_pass

在你需要的http块的server块中添加:

# 设置代理
proxy_pass http://backend;
# 设置请求主机
proxy_set_header Host $host;
# 设置客户端请求IP(让真正处理请求的服务器知道客户端IP)
proxy_set_header X-Forwarder-For $remote_addr;

参考文章

  1. 一篇文章彻底了解清楚什么是负载均衡 (推荐阅读)
  2. Nginx配置upstream实现负载均衡 - wzjhoutai - 博客园

版权声明:本文为博主原创文章,转载需注明来自: 洛洛の空间