如何使用 Digital Ocean DNS 和 Nginx 设置全局负载平衡?

2024-03-17

UPDATE:请参阅下面我提供的答案,了解我最终在 AWS 上设置的解决方案。

我目前正在尝试为 Digital Ocean 上的应用程序服务器实现全局负载平衡层的方法,但我还没有将一些内容放在一起。

The Goal

通过将所有连接路由到 SFO、NYC、LON 以及最终新加坡最近的服务器“集群”,为我的用户提供高度可用的服务。

此外,我最终希望通过编写一个可以监视、扩展和修复系统上任何服务器的守护进程来自动化维护。或者我将结合各种服务来实现相同的自动化目标。首先我需要弄清楚如何手动完成。

堆栈

  1. 乌班图14.04
  2. nginx 1.4.6
  3. node.js
  4. MongoDB 来自Compose.io http://www.compose.io(前身为 MongoHQ)

全球域名细分

一旦我安装好一切,我的域将如下所示:

**GLOBAL**
global-balancing-1.myapp.com
global-balancing-2.myapp.com
global-balancing-3.myapp.com

**NYC**
nyc-load-balancing-1.myapp.com
nyc-load-balancing-2.myapp.com
nyc-load-balancing-3.myapp.com

nyc-app-1.myapp.com
nyc-app-2.myapp.com
nyc-app-3.myapp.com

nyc-api-1.myapp.com
nyc-api-2.myapp.com
nyc-api-3.myapp.com

**SFO**
sfo-load-balancing-1.myapp.com
sfo-load-balancing-2.myapp.com
sfo-load-balancing-3.myapp.com

sfo-app-1.myapp.com
sfo-app-2.myapp.com
sfo-app-3.myapp.com

sfo-api-1.myapp.com
sfo-api-2.myapp.com
sfo-api-3.myapp.com

**LON**
lon-load-balancing-1.myapp.com
lon-load-balancing-2.myapp.com
lon-load-balancing-3.myapp.com

lon-app-1.myapp.com
lon-app-2.myapp.com
lon-app-3.myapp.com

lon-api-1.myapp.com
lon-api-2.myapp.com
lon-api-3.myapp.com

然后,如果在任何给定区域的任何给定层上有任何应变,我可以旋转一个新的液滴来帮助解决:nyc-app-4.myapp.com, lon-load-balancing-5.myapp.com, etc…

当前的工作方法

  • (最少)三人组global-balancing服务器接收所有流量。 这些服务器是“DNS 循环”平衡的,如下所示 (坦白说令人困惑)文章:如何配置 DNS 循环负载 平衡 https://www.digitalocean.com/community/tutorials/how-to-configure-dns-round-robin-load-balancing-for-high-availability.

  • 使用Nginx GeoIP 模块 https://nginx.org/en/docs/http/ngx_http_geoip_module.html and MaxMind GeoIP 数据 https://www.maxmind.com/en/geolocation_landing任何给定请求的来源都被确定为$geoip_city_continent_code.

  • The global-balancing然后将请求路由到最少的层 连接的服务器上load-balancing适当的层 簇:nyc-load-balancing-1, sfo-load-balancing-3, lon-load-balancing-2等等。这一层也是(最小)三重奏 飞沫。

  • 区域性load-balancing然后将请求路由到 应用程序或 API 层中连接最少的服务器:nyc-app-2, sfo-api-1, lon-api-3, etc…

Nginx功夫的细节可以在这个教程中找到:Village Idiot:在 AWS 上使用 GSLB/反向代理设置 Nginx https://gpeev.blogspot.ca/2013/02/setting-up-nginx-with-gslbreverse-proxy.html?m=1。提供了有关 Nginx 负载平衡的更多一般信息here https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-load-balancing/here http://subprint.com/blog/nginx-load-balancer-and-reverse-proxy-for-node.js-applications-on-digital-ocean.

问题

我该把global-balancing服务器?

让我感到奇怪的是,我要么把它们全部放在一个地方,要么将该层分散到全球各地。比如说,我把它们都放在纽约。然后来自法国的某人访问了我的域名。该请求将从法国发送至纽约,然后路由回 LON。或者,如果我在 SFO、NYC 和 LON 中分别放置一个,那么来自多伦多的用户(Parkdale,代表)是否仍然可能发送一个请求,最终发送到 LON,然后又被路由回 NYC?

后续请求是否会路由到同一 IP?

例如,如果来自多伦多的用户发送请求global-balancing层确定应该前往纽约市,来自该来源的下一个请求是否直接前往纽约市,或者它是否仍会碰上最近的运气global-balancing服务器(在本例中为纽约市)。

会议怎么样?

我已经将 Nginx 配置为使用ip_hash; https://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash指令,因此它将引导用户到相同的app or api端点(在我的例子中是一个节点进程),但是全局平衡将如何影响这一点(如果有的话)?

有 DNS 示例吗?

我不完全是 DNS 专家(我目前正在尝试找出为什么我的 CNAME 记录无法解析),但如果提供可靠的示例,我可以快速学习。有人以前经历过这个过程并且可以提供成功设置的 DNS 记录的示例吗?

SSL/TLS 怎么样?

我需要为每台服务器提供证书,还是只为三台服务器提供证书global-balancing服务器,因为这是唯一面向公众的网关?

如果您阅读了整篇文章,请奖励自己一个纸杯蛋糕。预先感谢您的任何帮助。


目标:通过将所有连接路由到 SFO、NYC、LON 以及最终新加坡最近的服务器“集群”,为我的用户提供高度可用的服务。

然后全局平衡层将请求路由到至少一个 连接的服务器...

如果我正确读取您的配置,那么您实际上是从全球平衡器代理到每个区域的平衡器。这不符合您将用户路由到最近区域的目标。

据我所知,可以通过三种方式获得您想要的东西:

  1. 30 倍重定向
    您的全局平衡器接收 HTTP 请求,然后根据 IP 地址将其重定向到它认为请求来自的区域内或附近的服务器组。这听起来像是您想要设置的。此方法对某些应用程序有副作用,并且还会增加用户获取数据所需的时间,因为您会增加大量开销。仅当您重定向到的资源非常大时,这才有意义,并且本地区域集群将能够更有效地提供服务。

  2. 任播(利用 BGP 路由)
    Akamai 等大公司将其用于 CDN。基本上,互联网上有多台服务器具有完全相同的可路由 IP 地址。假设我在多个地区有服务器,它们的IP地址是192.0.2.1。如果我在美国尝试连接到 192.0.2.1,而有人在欧洲尝试连接到 192.0.2.1,则我们很可能会被路由到最近的服务器。它使用互联网自身的路由来查找流量的最佳路径(基于网络条件)。不幸的是,您不能只使用这种方法。您需要自己的 AS 编号和物理硬件。如果您发现 VPS 提供商可以让您拥有其 Anycast 块的一部分,请告诉我!

  3. Geo-DNS
    有一些 DNS 提供商提供的服务通常被称为“Geo-DNS”。他们有一堆托管在任播地址上的 DNS 服务器,可以将流量路由到最近的服务器。如果客户端查询欧洲 DNS 服务器,它应该返回欧洲区域服务器的地址,而不是其他区域的服务器的地址。 Geo DNS 服务有许多变体。其他人只是维护一个地理 IP 数据库,并返回他们认为更接近的区域的服务器,就像重定向方法一样,但在发出 HTTP 请求之前返回 DNS。考虑到价格和易用性,这通常是不错的选择。

后续请求是否会路由到同一 IP?

许多负载均衡器都有一个“粘性”选项,表示来自同一网络地址的请求应路由到同一终端服务器(前提是终端服务器仍然启动并运行)。

会议怎么样?

这正是您想要这种粘性的原因。当涉及会话数据时,您必须找到一种方法来使所有服务器保持最新状态。实际上,这并不总是能保证。您如何处理它取决于您的应用程序。您能否保留一个 Redis 实例或其他任何实例,以便您的所有服务器能够从世界各地可靠地访问?您真的需要每个区域的会话数据吗?或者您可以让主要应用程序服务器在一个位置处理会话数据吗?

有 DNS 示例吗?

针对这些问题单独发布问题。每个人的“成功设置”看起来都不同。

SSL/TLS 怎么样?

如果您要代理数据,则只有全局平衡器需要处理 HTTPS。如果您要重定向,那么所有服务器都需要处理它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Digital Ocean DNS 和 Nginx 设置全局负载平衡? 的相关文章

  • WebSocket 和负载平衡是瓶颈吗?

    当有一堆充当 WebSocket 无人机的系统和这些无人机前面的负载均衡器时 当 WebSocket 请求进入 LB 时 它会选择一个 WebSocket 无人机 并建立 WebSocket 我在 ELB 上使用 AWS ELB tcp S
  • DHCP 服务器将任何 url 重定向到登陆页面

    我有一个 Linux DHCP 服务器 我需要将所有网络流量重定向到一个登陆页面 该页面将包含有关如何在网络上注册计算机的说明 无论用户输入什么 URL 都需要将用户重定向到网页 在 DHCP 服务器上 即 用户输入 google com
  • Kubernetes nginx 入口控制器返回 502,但仅适用于 AJAX/XmlHttpRequest 请求

    我有一个在 nginx 入口控制器后面运行 Kubernetes 的 Web 应用程序 它对于请求浏览工作正常 但来自浏览器的任何 AJAX XMLHTTPRequest 都会从 nginx 收到 502 错误 我捕获了常规请求和 AJAX
  • Nginx反向代理(proxy_pass)不传递子文件夹

    我想在子文件夹配置中运行应用程序 Mattermost 例如 https www example com mattermost https www example com mattermost location mattermost gzi
  • Node + Express + Nginx 未设置 Cookie

    我有一个使用 Express 的 Node 应用程序 我尝试为我的客户端设置 cookie 它在本地环境 http 上运行良好 但是一旦我投入生产 https 我就很好地收到了cookie 我可以在响应中看到它 但它没有设置 任何想法 Ng
  • 我应该担心“窗口未定义”JSLint 严格模式错误吗?

    这不会在严格模式下通过 JSLint use strict function w w alert w window 来自 jslint com 的错误如下所示 第 4 行第 3 行字符出现问题 window 未定义 window 隐含全局
  • 当请求太大时,Nginx(我认为)会以错误的权限保存文件

    所以 我对托管和 Linux 等都是完全陌生的 所以如果我说错了 请原谅我 我还在学习 我正在使用 Django 创建一个小型个人网站 我想把它放到网上看看是否一切正常 我从 linode 买了一台便宜的服务器 并使用 Digital Oc
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • nginx - 记录 SSL 握手失败

    我正在运行启用了 SSL 的 nginx 服务器 我的协议 密码设置相当安全 我已经在 ssllabs com 上检查过它们 但是 因为这是一个由我无法控制的 http 客户端调用的 Web 服务 所以我担心兼容性 重点是 有没有办法在我的
  • kubernetes 集群中 django 应用程序的 Nginx 配置

    我在为部署在 kubernetes 中的 django 应用程序创建 nginx 配置文件时遇到困难 Nginx 和 app 是同一集群中的两个独立容器 据我了解 容器可以通过 127 0 0 1 XX 和主机名相互通信 我为此使用 min
  • 使用 FastCGI 运行 Lua 脚本

    我目前正在尝试找出使用 FastCGI 与 lighttpd 或 Nginx 一起运行 Lua 脚本的方法 我唯一能挖到的是WSAPI http keplerproject github com wsapi 开普勒计划的一部分 但我想知道是
  • 是否可以为 IP 地址而不是域名提供 SSL 证书? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望我的网站使用类似的 URLhttp 192 0 2 2 and https 192 0 2 2 用于静态内容 以避免请求中不必要的
  • Docker:Nginx 和 php5-fpm docker 不说话

    我想进行完全 Docker 化的 Drupal 安装 我的第一步是让容器与 Nginx 和 php5 fpm 一起运行 两者都基于 Debian 我在 CoreOS alpha 频道 使用 Digital Ocean 我的 Dockerfi
  • nginx 反向代理 websocket

    nginx 现在支持代理 websockets 但我无法找到任何有关如何在没有单独的情况下执行此操作的信息location应用于使用 websocket 的 URI 的块 我见过一些人推荐这种方法的一些变体 location proxy h
  • 如何为digitalocean设置子域?

    我需要通过在 URL 中输入 sendy ambee app 来访问我的 Digitalocean 服务器 如果我输入 IP 地址 157 230 9 219 它就可以工作 但只要我输入 sendy ambee app 它就不起作用 Whe
  • Docker DNS 设置

    我尝试使用自定义网络和 dos 设置创建 docker 容器 docker网络创建 driver bridge opt com docker network bridge enable ip masquerade true opt com
  • nginx 和 uwsgi 非常大的文件上传(>3Gb)

    也许有人知道该怎么做 我正在尝试上传大于 3Gb 的文件 没问题 如果我使用以下配置上传高达 2Gb 的文件 Nginx client max body size 5g client body in file only clean clie
  • 使用nginx容器作为反向代理时的原始url

    我有一个 Web 应用程序部署为码头集装箱 我也有一个nginx容器 使用dnsmasq解析器 设置为充当 Web 应用程序前面的反向代理 它的 80 端口映射到主机 我的应用程序使用 SSO 身份验证 当我使用身份提供商登录时 回调 ur
  • Docker 中的 NGINX 缓存 IP 地址并提供错误的 Content-Type

    Summary 我想让NGINX 不是NGINX Plus 通过使用变量从DNS名称重新解析IP地址proxy pass 如建议的这篇 Nginx 官方文章 在变量中设置域名 部分 https www nginx com blog dns
  • NGINX 上的 SSL 终止

    我已经购买了 SSL 证书 并在验证模数时正确地将其捆绑在一起 即https kb wisc edu middleware 4064 https kb wisc edu middleware 4064 那么哈希值是相同的 我已将证书和密钥移

随机推荐