Nginx 负载均衡

Dec 17, 2018 22:00 · 1110 words · 3 minute read Nginx

当 web 应用程序在 Apache 或者 Tomcat 服务器上运行,前置一个 Nginx 代理,然后在第二台服务器上创建一个相同的实例,Nginx 将在两台服务器之间进行负载均衡。

Nginx 支持以下三种负载均衡策略:

  1. 轮询 —— 这是默认方式,用经典的轮询算法来分配请求。
  2. 最少连接 —— 请求将被转发至连接数最少的服务器。
  3. IP 哈希 —— 根据客户端的 IP 地址来分配请求。

1. 在 Nginx 配置文件中定义 upstream 和 proxy_pass

要在配置文件中添加两样东西:upstream 和 proxy_pass。

upstream

指定一个唯一的名称,并列出需要做负载均衡的所有服务器。

在下面的例子中,crmdev 是 upstream 的名称,也是运行在两个独立的 Apache 服务器上的应用程序,也可以指定其他名称。

upstream crmdev {
    server 192.168.101.1;
    server 192.168.101.2;
}

注意:如果实例使用了80以外的其他端口,也要写上去:

upstream crmdev {
    server 192.168.101.1:8080;
    server 192.168.101.2:8080;
}

proxy_pass

将上一步定义 upstream 名称指定为 location 字段里的 proxy_pass:

server {
    listen 80;

    location / {
        proxy_pass http://crmdev;
    }
}

注意:在这个例子中 Nginx 正在监听80端口。

2. 在 Nginx 默认配置中定义 upstream 和 proxy_pass

http {
    upstream crmdev {
        server 192.168.101.1:8080;
        server 192.168.101.2:8080;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://crmdev;
        }
    }
}

但是如果你正在使用默认的配置文件 nginx.conf,不必给出 http,因为已经定义过了。

注意:HTTPS 的话,把 http 替换成 https,在 proxy_pass 里也要写 https://{upstream-name}

这里有一份配置文件示例:

$ cat /etc/nginx/conf.d/default.conf
upstream crmdev {
    server 127.0.0.1:4080;
    server 127.0.0.1:7080;
}

server {
    listen 3080;
    server_name localhost;

    # location / {
        # root /usr/share/nginx/html;
        # index index.html index.htm;
    # }

    location / {
        proxy_pass http://crmdev;
    }
    ..
    ..
}

3. 配置最少连接策略

到达 Nginx 的请求会被发送往最少数量的现有活动连接的服务器。

在 upstream 中添加关键字 least_conn

upstream crmdev {
    least_conn;
    server 192.168.101.1:8080;
    server 192.168.101.2:8080;
}

如果列出了多个服务器,并且有多台服务器都处于低数量连接状态,将在这些服务器中轮询。

4. 配置IP 哈希策略

轮询和最少连接的不足在于来自客户端的连接会到达池中不同的服务器,这对于不依赖会话的应用程序来说还好。但是如果你的应用程序依赖,一旦与某台服务器建立了初始连接,你就想要来自那个客户端的所有连接都被转发到那台服务器。这样,IP 哈希算法就有用了:

upstream crmdev {
    ip_hash;
    server 192.168.101.1:8080;
    server 192.168.101.2:8080;
}

5. 单独服务器的权重选项

也可以单独指定池中的某台服务器的权重。默认所有的服务器权重相同,都为1。

upstream crmdev {
    server 192.168.101.1:8080;
    server 192.168.101.2:8080;
    server 192.168.101.3:8080 weight 2;
    server 192.168.101.4:8080;
    server 192.168.101.5:8080;
}

这里总共5台服务器。但是第三台服务器的权重为2,意味着每6个请求中有两个会被转发到第三台,爱其他服务器一台分配一个。在更强劲的服务器分配更多的负载更为合理。

6. 超时选项

给某台服务器设置 max_fails 和 fail_timeout:

upstream crmdev {
    server 192.168.101.1:8080 max_fails=3 fail_timeout=30s;
    server 192.168.101.2:8080;
    server 192.168.101.3:8080 weight 2;
    server 192.168.101.4:8080;
    server 192.168.101.5:8080;
}
  • 默认的 fail_timeout 是10秒,10秒内如果有 n 次失败的尝试,服务器将被下线,但也仅仅是下线十秒。
  • 默认的 max_fails 是1次,配合 fail_timeout 暂时下线不可用的服务器。

7. 在服务器池中预留一台备用服务器

下面的例子中,第五台服务器被标记了 backup 关键字:

upstream crmdev {
    server 192.168.101.1:8080 max_fails=3 fail_timeout=30s;
    server 192.168.101.2:8080;
    server 192.168.101.3:8080 weight 2;
    server 192.168.101.4:8080;
    server 192.168.101.5:8080 backup;
}

Nginx 会暂时忽略这台服务器除非其他四台全都宕机。