【译】举例说明用NGINX实现负载均衡的几种方法转载
通常需要对应用程序进行负载平衡,以便横向扩展并提高应用程序的性能,而 NGINX 可以用来做到这一点!它可以将流量分配到多个应用程序服务器。
NGINX 中有几种负载均衡方法,它们分别是:
- 循环 - 其中请求以循环方式分发
- 最少连接 - 请求被发送到活动连接最少的服务器
- ip hash - 使用散列函数来确定发送请求的服务器
- weighted - 根据指定的服务器权重分配请求
我们将尝试通过描述一种架构来详细说明它,其中有一组静态内容可通过 NGINX 在域名上获得,并且这些静态内容具有某些从应用程序后端加载的动态方面,应用程序后端是这里的负载平衡。
让我们首先从我们的静态内容开始,并假设它在 /path/to/your/content 中可用。一个示例 NGINX 配置如下所示:
server {
server_name example.com;
root /path/to/your/content;
index index.html;
include /etc/nginx/mime.types;
}
其中域 example.com 指向我们在 /path/to/your/content 中可用的静态内容。
现在,为了呈现动态内容,你需要在静态文件中指定一种方法来指定应该从何处获取该内容,所以我们需要需要提供 API 详细信息。
让我们尝试通过 NGINX 配置来实现,通过 URI 即 /api,使 API 在上述配置中指示的同一域上可用。一种方法是在块配置中配置location指令, server {}
以将所有流量从指定的 URI 卸载到应用程序后端,其配置可能类似于
location /api/ {
proxy_pass http://api/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
proxy_pass
- 用于将请求传递给代理服务器proxy_http_version
- 将 HTTP 协议版本设置为 1.1proxy_set_header
- 用于设置从客户端到代理服务器的标头
但是你如何设置 NGINX /api 指向哪里呢?它是一般通过位于 nginx.conf 文件upstream
中的块内配置的指令来 完成的。
http {}
示例配置举例:
http {
upstream api {
server address-of-your-application-backend.com;
}
完成上述操作后,来自http://example.com/api的所有流量将被重定向到上游配置中指定的上游服务器。
例如,你的应用程序用户的信息可在应用程序后端的 /user/:id API 上获得。现在可以使用http://example.com/api/user/1轻松访问此信息。
此后,上游是事情开始变得有趣的地方,这是指定负载平衡指令的地方。我们可以在上游块内指定多个服务器
http {
upstream api {
server address-of-your-application-backend-1.com;
server address-of-your-application-backend-2.com;
server address-of-your-application-backend-3.com;
}
可以看到上面的配置中没有指定负载均衡方式,默认为round-robin。
所有获取动态数据的请求现在都以循环方式重新路由到上游块中指定的服务器。可以像这样在上游块内指定负载平衡方法:
http {
upstream api {
least_conn;
server address-of-your-application-backend-1.com;
server address-of-your-application-backend-2.com;
server address-of-your-application-backend-3.com;
}
简单举个例子,希望这能让你更好地了解 NGINX 负载平衡以及如何将其作为应用程序架构的一部分来实现。
原文作者: