将 Nginx 设置为 Apache 或 Tomcat 的 HTTP/HTTPS 负载均衡器

举报
Tiamo_T 发表于 2022/10/14 08:42:30 2022/10/14
【摘要】 您可以在 Web 应用程序前使用 Nginx 作为负载均衡器。

您可以在 Web 应用程序前使用 Nginx 作为负载均衡器。

例如,如果您的企业应用程序在 Apache(或 Tomcat)上运行,您可以在不同服务器上的 Apache(或 Tomcat)上设置企业应用程序的第二个实例。

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

如果您是 Nginx 新手,了解Nginx 与 Apache 以及 Nginx 架构之间的区别非常重要。

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

  1. round-robin - 这是 Nginx 的默认类型,它使用典型的循环算法来决定将传入请求发送到哪里
  2. least-connected – 顾名思义,传入的请求将被发送到连接数较少的服务器。
  3. ip-hash – 当您想要持久化或坚持传入请求的连接时,这很有用。在这种类型中,客户端的 IP 地址用于决定应该将请求发送到哪个服务器。

1.在Nginx Config File中定义upstream和proxy_pass

对于负载均衡,需要在 nginx 配置文件中添加两件事:1)upstream 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:将上一步中定义的唯一上游名称指定为“location”部分中的proxy_pass,该部分将位于“server”部分下,如下所示。

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

注意:在此示例中,nginx 本身正在侦听端口 80,如上面的 listen 参数所示。

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

2.在Nginx默认配置文件中定义upstream和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,将“http”上下文(在上面的第一行中)替换为 https。此外,在 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;
}

如果您在 least_conn 中列出了多台服务器,并且如果多台服务器的现有活动连接数量相似,那么在这些服务器中,将根据加权循环选择一个。

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 个请求。

因此,这有助于在具有更大马力的特定服务器上分配更多负载。

尽管在上面的示例中,权重与默认的循环算法一起使用,但您也可以对 least_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 将在 30 秒的 fail_timeout 持续时间内认为该服务器不可用。

7.在Nginx LoadBalancer Pool中分配一个Backup Server

在以下示例中,第 5 台服务器在服务器参数末尾使用“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;
}

以上将第5台服务器(192.168.101.5)作为备份服务器。除非所有其他 4 台服务器都关闭,否则传入的请求将不会传递到此服务器。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。