容器环境
概述
了解 Galaxy 在什么环境中运行您的应用。
Galaxy 使用 Docker 容器平台在一组容器中运行您的应用。
运行的实际代码由“基础镜像”决定——无论是 默认基础镜像 还是 自定义基础镜像。
Galaxy 在 UTC 时区的 64 位 Linux 机器上运行您的应用。
容器如何停止
当 Galaxy 想要关闭您的容器(因为您部署了新版本,因为您正在缩减规模,因为 Galaxy 正在替换底层机器,或其他原因)时,它首先会向您的容器发送 SIGTERM 信号,等待 30 秒的宽限期,然后发送 SIGKILL 信号。如果您希望在容器终止前执行一些清理工作,您可以捕获 SIGTERM 信号(例如,在 Node 中使用 `process.on('SIGTERM')`)。SIGKILL 信号无法捕获;收到此信号的容器会立即终止。您可以在应用的设置页面上调整宽限期。Galaxy 通过 METEOR_SIGTERM_GRACE_PERIOD_SECONDS 环境变量通知您的应用宽限期持续时间。如果您的应用有很多用户,在此宽限期内您可能希望做的一件事是逐步关闭传入连接。您可以使用我们的 `@meteorjs/ddp-graceful-shutdown` npm 包(如 这篇博文 中所述)轻松完成此操作。
环境变量
Galaxy 在设置以下环境变量的情况下运行您的应用
环境变量 | 默认值 | 含义 |
---|---|---|
APM_* | 各种 | 启用了 Meteor APM 的 Galaxy Pro 应用具有几个以 APM_ 开头的环境变量来配置其 APM 代理。 |
GALAXY_APP_ID | 应用标识符,例如 Ss8o4Y6KrvFBKKkqM | 您的应用的内部标识符。 |
GALAXY_APP_VERSION_ID | 整数,例如 123 | 容器的应用版本。 |
GALAXY_CONTAINER_ID | 包含应用 ID 的容器 ID,例如 Ss8o4Y6KrvFBKKkqM-3n28 | 此容器的内部标识符。 |
GALAXY_LOGGER | system | 出于历史原因,指示您的容器日志收集由 Galaxy 处理。 |
HTTP_FORWARDED_COUNT | 1 | 告诉您的应用它正在代理后面运行。 |
KADIRA_OPTIONS_HOSTNAME | 简短的容器 ID,例如 3n28 | 出于历史原因,用于配置基于 Meteor APM 的第三方 Kadira 服务。 |
METEOR_SETTINGS | JSON 对象,在 部署应用时设置 | 可作为 `Meteor.settings` 使用。Galaxy 可能会向您的设置对象添加字段以启用诸如 prerender 之类的功能,并且可能会重新格式化 JSON 对象。 |
METEOR_SIGTERM_GRACE_PERIOD_SECONDS | 30 | 容器终止宽限期 的长度。 |
PORT | 整数,例如 3000 | 您的应用应监听的端口. |
ROOT_URL | 您的应用的默认主机名,以 http:// 或 https:// 为前缀,具体取决于您是否使用强制 HTTPS | 由 `Meteor.absoluteUrl()` 用于生成链接。 |
您可以添加自己的环境变量并覆盖除特定于容器的变量(GALAXY_CONTAINER_ID 和 KADIRA_OPTIONS_HOSTNAME)和 GALAXY_LOGGER 之外的任何变量 通过您的 settings.json 文件。
网络环境
传入连接
Galaxy 在防火墙网络环境中运行您的应用容器。只有一个端口公开用于外部连接。Galaxy 通过 $PORT 环境变量告诉您的应用要监听哪个端口,该变量包含一个数字,例如 3000。
Galaxy 将您应用配置的 域名 上的 HTTP 连接(端口 80)转发到公开用于外部连接的端口。如果您已 配置加密,HTTPS 连接(端口 443)也将转发到此端口。您不能在任何其他端口上提供服务。
Galaxy 尽最大努力保持最新的安全协议最佳实践,同时仍然允许我们的用户向使用旧版浏览器的用户提供对其网站的访问。我们目前支持 TLS 1.0 连接,这些连接确实存在一些已知的缺陷。但是,据我们所知,TLS 1.0 中的主要缺陷(BEAST 攻击)可以通过正确的服务器实现来阻止,而我们的服务器实现(基于 Go TLS 库) 确实做到了这一点。放弃对 TLS 1.0 的支持将破坏所有使用低于 11 版的 MS Internet Explorer 的用户,而对于 Galaxy 的所有用户来说,我们还没有准备好做出这样的决定。
如果您即使使用 Go BEAST 缓解措施也无法允许 TLS 1.0 连接,我们确实提供了以应用为基础的方式进行配置的选项
- 转到设置 -> 安全
- 在“SSL TLS 协议支持”部分中选择“最低 1.2”
这样,我们将阻止所有使用 TLS < 1.2 的连接。
传出连接和 IP 白名单
当您的应用连接到其他服务(如您的数据库)时,这些服务的连接将始终显示来自一组固定的 IP 地址之一。这些 IP 地址不是您的容器运行的各个机器的 IP 地址,因此如果它们不匹配,请不要感到惊讶。(这些地址与我们的“入口”DNS 地址指向的地址不同——不要将您的 DNS 指向那里!)
某些服务可以配置为仅允许来自 IP 地址列表的访问。Galaxy 专业版客户可以在该服务上使用这些 IP 地址作为“白名单”,以获得额外的安全层。
白名单对于数据库尤其常见,并且您的数据库提供商可能需要它。
请注意,白名单 IP 地址在所有 Galaxy 专业版客户之间共享。虽然白名单旨在保护您的应用免受非目标攻击,但您仍然应该通过其他方式控制对服务的访问。
要查找您应该使用的 IP 地址,请转到您的应用的“设置”页面并复制显示在那里的 IP 地址。如果您尚未升级到 Galaxy 专业版容器,则需要在此处进行升级。
如果您的软件需要您将白名单指定为 CIDR 列表而不是 IP 地址列表,只需在每个 IP 地址的末尾添加三个字符 /32。
IPv6 支持
随着全球 IPv4 地址池每天都在缩减,组织正在以前所未有的速度部署 IPv6。但有时这确实很难,尤其是在需要彻底改造网络时。
使用 Galaxy 时,我们可以非常轻松地为您的应用启用 IPv6。我们可以为您提供一个 IPv6 地址,您可以在您的 DNS 提供商中配置“DNS 指向”。
IPv6 支持仅适用于专业版计划上的应用,只需转到您的应用设置并启用它,如下面的图片所示

健康检查和负载均衡
Galaxy 期望您的容器将提供一个在 $PORT 环境变量中给定的端口上侦听的 HTTP 服务器。Galaxy 期望 HTTP 服务器将在 5 秒内以格式良好的 HTTP 响应响应 GET / 请求。健康检查设置一个包含字符串 Galaxybot/ 的 User-Agent 标头。(Galaxy 目前仅验证响应是否为格式良好的 HTTP 响应,但最好确保此响应没有 5xx 状态代码,因为我们可能会在将来改进我们对“健康”的定义。)如果您的容器在给定端口上没有功能正常的 HTTP 服务器侦听,Galaxy 将认为该容器“不健康”。
新客户端连接被路由到“负载最低”的健康容器。“负载最低”定义为具有最少现有客户端连接的容器。
如果容器的内存或 CPU 使用量增长,则现有的客户端连接不会被重新路由,除非该容器被标记为不健康。也就是说:Galaxy 目前不会主动在健康容器之间重新平衡现有客户端。如果容器崩溃或被标记为不健康,其用户将被路由到健康容器。
如果一个新容器保持不健康状态 10 分钟,或者一个曾经健康的容器变得不健康并在该状态下持续 5 分钟,Galaxy 将用一个新容器替换它。此外,Galaxy 将至少等待 10 分钟(对于具有多个容器的应用,时间更长),以等待新部署的应用版本的全部容器都变为健康状态,然后才能宣布部署成功,并在失败时返回到之前活动的版本。您可以在应用设置页面上的“不健康容器替换”下禁用本段中所有行为。
不健康容器
如果您的容器没有按预期响应 Galaxy 健康检查,则可以将其视为不健康。
自 2020 年 5 月 1 日起,Galaxy 开始在服务日志中记录您的容器不健康时的信息。Galaxy 还为这些事件提供了通知。
重要的是要理解,不健康容器不是 Galaxy 服务器问题或 Galaxy 不可用的问题。不健康容器意味着您的容器无法响应 Galaxy 健康检查,这通常发生在您的容器以 100% 的 CPU 使用率(或接近该值)运行或使用 100% 的内存(RAM)时。在这两种情况下,您的容器都不会响应 Galaxy 健康检查。
许多原因可能导致您的容器使用所有可用的 CPU 或内存。有时您正在执行的任务的本质对于您正在使用的容器大小来说过于繁重,因此您需要增加容器大小。其他时候,这是因为您的代码无法处理您的应用当前收到的连接数量。在这种情况下,您需要增加正在运行的容器数量。
小型容器:此容器大小专为业余项目和开源演示而设计,因此如果您使用此大小,您可能会收到更多不健康警告。
此外,请记住,您的代码也可以改进,以提高容器在 CPU 和内存(RAM)方面的容量。很难准确估计每个容器大小可以处理多少内容,因为它更多地取决于您的应用代码,而不是 Node.js 或 Meteor 本身。
识别瓶颈的一个重要工具是Meteor APM,因为它会显示您正在运行的方法和发布。尤其是在 CPU 使用率出现峰值的情况下,也要注意后台作业(了解更多),也许它们正在消耗您所有的 CPU,然后您的容器变得不健康。Node.js 是单线程的,因此务必注意应用中的繁重 CPU 操作,尤其是在您在用户使用 UI 的同一应用中运行后台作业任务时。
您还可以像在任何 Node.js 项目中一样分析您的 CPU,此包可以帮助您生成配置文件并将其发送到 S3。如果您的问题与内存有关,您可以使用此包从您的容器获取堆转储。
如果您预计您的容器由于繁重的进程或任何其他导致容器不健康的进程而每天需要使用 100% 的 CPU 几次,则可以禁用此通知。如果您的应用可以执行超过 5 分钟的长任务,则还应禁用不健康容器替换,否则 Galaxy 将替换容器。
如果所有容器都不健康,Galaxy 也会将您的应用视为不可用,因为所有容器的健康检查都将失败。
不健康容器替换
启用不健康容器的自动替换时
- 如果健康容器开始出现健康检查失败,它将在 5 分钟后被替换。
- 新容器将获得 10 分钟的时间来变为健康状态,然后才会被替换。
- Galaxy 将至少等待 10 分钟(对于具有多个容器的应用,时间更长),以等待新部署的应用版本的全部容器都变为健康状态,然后才能宣布部署成功,并在失败时返回到之前活动的版本。
更新于:2024/05/07
谢谢!