如何将Nginx设置为Apache或Tomcat的负载均衡器

您可以将Nginx用作Web应用程序中的前端负载均衡器。

例如,如果您的应用程序在Apache(或Tomcat)上运行,则可以在另一台服务器上的Apache(或Tomcat)上设置企业应用程序的第二个负责任实例。

然后,您可以将Nginx放在前端,这将平衡两个Apache服务器(或Tomcat或JBoss)之间的负载。

如果您是Nginx的新手,那么一定要了解Nginx与Apache和Nginx架构之间的区别。

Nginx支持以下三种类型的负载平衡:

  1. 轮询是Nginx的默认类型,它使用典型的轮询算法来决定将传入请求路由到何处
  2. 最少连接-顾名思义,传入请求将发送到连接最少的服务器。
  3. ip-hash-当您需要持久性或连接传入请求的连接时,此功能很有用。 在此类型中,客户端的IP地址用于确定请求应定向到哪个服务器。

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

为了实现负载平衡,您需要在Nginx配置文件中添加两件事:

  1. 上游的
  2. proxy_pass

首先,上游: 提供一个唯一的名称(可以是您的应用程序的名称)和所有将对Nginx进行负载平衡的服务器的列表。

在以下示例中,“ crmdev”是名称 上游的这是作为单个Apache服务器运行的应用程序的名称(如下所示为101.1和102.2)。 除了“ crmdev”之外,您还可以指定任意内容。

注意:上游必须在Nginx的“ HTTP”上下文中定义。

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: 在“位置”部分中,将在上一步中定义的上游的唯一名称指定为proxy_pass,这将与“服务器”部分相对应,如下所示。

server {
  listen 80;
  
  location / {
    proxy_pass http://crmdev;
  }
}

注意:在此示例中,Nginx本身使用监听参数在端口80上监听,如上所示。

请注意,您还可以使用proxy_pass将Nginx配置为Apache / PHP的反向代理。

2.在默认的Nginx配置文件中定义上游和proxy_pass

注意:通常,以上内容应符合HTTP或HTTPS,如下所示。

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文件随附的default.conf,则不需要“ HTTP”,因为它已在HTTP上下文中定义。

注意:对于HTTPS,请使用HTTPS替换“ HTTP”上下文(在上面的第一行)。 另外,在proxy_pass行中,使用https:// {-your-upstream-name-}

在这种情况下,如果如上所示使用“ HTTP”,则可能会收到以下“ HTTP伪指令不允许”错误消息:

Starting nginx: nginx: [emerg] "http" directive is not allowed here in /etc/nginx/conf.d/default.conf:1

这是default.conf文件的副本,在其中我在顶部(没有HTTP)添加了上游,然后注释掉了默认位置,并使用proxy_pass添加了新位置。

# vi /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进行负载平衡

在此算法中,传入请求被发送到活动连接数最少的服务器。

为此,请在上游顶部添加“ least_conn”关键字,如下所示。

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

如果至少列出了多个服务器,且多个服务器的现有活动连接数均较低,则将在这些服务器中以加权轮询为基础选择一个。

4.安装持久性或粘性Nginx负载平衡算法

轮询和最不相关的方法的不利之处在于,来自客户端的后续连接将不会到达池中的同一服务器。 这可能适合会话,没有特定的应用程序。

但是,如果您的应用程序依赖于会话,则在与特定服务器建立初始连接后,您希望将来来自该特定客户端的所有连接都转到同一服务器。 为此,请使用ip_hash算法,如下所示。

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

IPv4地址的哈希使用前三个八位字节。 如果它是IPv6地址,则使用整个地址。

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台服务器。 但是权重为第3个服务器的值为2。这意味着对于每个新请求6,有2个请求将到达第3个服务器,其余服务器将收到1个请求。

因此,在具有更大容量的特定服务器上分配更多负载很有用。

尽管在上面的示例中,权重与默认循环算法一起使用,但是您也可以对weights_conn和ip_hash使用权重。

6.各个服务器的超时参数-max_fails和fail_timeout

您还可以为特定服务器指定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秒。 在上面的示例中,该时间设置为30秒。 这意味着在30秒内,如果失败尝试次数达到x次(由max_fails定义),则服务器将不可用。 此外,服务器将保持30秒钟不可用。
  • 默认情况下,max_fails为1次尝试。 在上面的示例中,此设置为3次尝试。 这意味着在尝试连接到该特定服务器3次失败后,Nginx会认为该服务器在整个fail_timeout(30秒)内不可用。

7.在Nginx LoadBalancer中分配一个备份服务器:池

在以下示例中,在服务器参数末尾使用“ backup”关键字将第5个服务器标记为备份。

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;
}

上面的示例将5台服务器(192.168.101.5)用作备份服务器。 如果所有其他4台服务器都关闭,则传入请求将不会转发到该服务器。

Sidebar