

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 配置 Amazon IoT Greengrass 核心软件
<a name="configure-greengrass-core-v2"></a>

C Amazon IoT Greengrass ore 软件提供了可用于配置软件的选项。您可以创建部署以在每台 Amazon IoT Greengrass 核心设备上配置核心软件。

**Topics**
+ [部署 Greengrass Nucleus 组件](#configure-nucleus-component)
+ [将 Greengrass Nucleus 配置为系统服务](#configure-system-service)
+ [使用 JVM 选项控制内存分配](#jvm-tuning)
+ [配置运行组件的用户](#configure-component-user)
+ [配置组件的系统资源限制](#configure-component-system-resource-limits)
+ [通过端口 443 或网络代理进行连接](#configure-alpn-network-proxy)
+ [使用由私有 CA 签名的设备证书](#configure-nucleus-private-ca)
+ [配置 MQTT 超时和缓存设置](#configure-mqtt)
+ [在网络上配置 Greengrass Nucleus IPv6](#configure-ipv6)

## 部署 Greengrass Nucleus 组件
<a name="configure-nucleus-component"></a>

Amazon IoT Greengrass 将 Amazon IoT Greengrass 核心软件作为组件提供，您可以将其部署到 Greengrass 核心设备上。您可以创建一个部署，将同一配置应用于多个 Greengrass 核心设备。有关更多信息，请参阅[Greengrass Nucleus](greengrass-nucleus-component.md)和[更新 Amazon IoT Greengrass Core 软件（OTA）](update-greengrass-core-v2.md)。

## 将 Greengrass Nucleus 配置为系统服务
<a name="configure-system-service"></a>

要执行以下操作，您必须在设备的初始化系统中将 C Amazon IoT Greengrass ore 软件配置为系统服务：
+ 设备启动时启动 Amazon IoT Greengrass Core 软件。如果您管理大量设备，这是最佳实践。
+ 安装并运行插件组件。 Amazon提供的几个组件是插件组件，这使它们能够直接与 Greengrass 核接口。有关组件类型的更多信息，请参阅 [组件类型](develop-greengrass-components.md#component-types)。
+ 对核心设备的 Amazon IoT Greengrass 核心软件应用 over-the-air (OTA) 更新。有关更多信息，请参阅 [更新 Amazon IoT Greengrass Core 软件（OTA）](update-greengrass-core-v2.md)。
+ 允许组件在部署将组件更新到新版本或更新某些配置参数时重新启动 Amazon IoT Greengrass 核心软件或核心设备。有关更多信息，请参阅[引导生命周期步骤](component-recipe-reference.md#bootstrap-lifecycle-definition)。

**重要**  <a name="windows-system-service-requirement-important-note"></a>
在 Windows 核心设备上，必须将 Amazon IoT Greengrass 核心软件设置为系统服务。

**Topics**
+ [将核心配置为系统服务（Linux）](#configure-system-service-linux)
+ [将核心配置为系统服务（Windows）](#configure-system-service-windows)

### 将核心配置为系统服务（Linux）
<a name="configure-system-service-linux"></a>

Linux 设备支持不同的初始化系统，例如 initd、systemd 和 SystemV。在安装 Amazon IoT Greengrass Core 软件时，您可以使用`--setup-system-service true`参数将 nucleus 作为系统服务启动，并将其配置为在设备启动时启动。安装程序使用 systemd 将 Amazon IoT Greengrass 核心软件配置为系统服务。

您还可以手动配置核心，使其作为系统服务运行。以下示例是用于 systemd 的服务文件。

```
[Unit]
Description=Greengrass Core

[Service]
Type=simple
PIDFile=/greengrass/v2/alts/loader.pid
RemainAfterExit=no
Restart=on-failure
RestartSec=10
ExecStart=/bin/sh /greengrass/v2/alts/current/distro/bin/loader

[Install]
WantedBy=multi-user.target
```

配置系统服务后，您可以运行以下命令来配置启动设备以及启动或停止 Amazon IoT Greengrass Core 软件。
+ 检查服务的状态（systemd）

  ```
  sudo systemctl status greengrass.service
  ```
+ 让核心在设备开机时启动。

  ```
  sudo systemctl enable greengrass.service
  ```
+ 在设备开机时阻止核心启动。

  ```
  sudo systemctl disable greengrass.service
  ```
+ 启动 Amazon IoT Greengrass 核心软件。

  ```
  sudo systemctl start greengrass.service
  ```
+ 停止 Amazon IoT Greengrass 核心软件。

  ```
  sudo systemctl stop greengrass.service
  ```

### 将核心配置为系统服务（Windows）
<a name="configure-system-service-windows"></a>

在安装 Amazon IoT Greengrass Core 软件时，您可以使用`--setup-system-service true`参数将 nucleus 作为 Windows 服务启动，并将其配置为在设备启动时启动。

配置服务后，您可以运行以下命令来配置启动设备以及启动或停止 Amazon IoT Greengrass Core 软件。必须运行命令提示符或以管理员 PowerShell 身份运行这些命令。

------
#### [ Windows Command Prompt (CMD) ]
+ 检查服务状态

  ```
  sc query "greengrass"
  ```
+ 让核心在设备开机时启动。

  ```
  sc config "greengrass" start=auto
  ```
+ 在设备开机时阻止核心启动。

  ```
  sc config "greengrass" start=disabled
  ```
+ 启动 Amazon IoT Greengrass 核心软件。

  ```
  sc start "greengrass"
  ```
+ 停止 Amazon IoT Greengrass 核心软件。

  ```
  sc stop "greengrass"
  ```
**注意**  <a name="windows-ignore-shutdown-signal-behavior-note"></a>
在 Windows 设备上， Amazon IoT Greengrass 酷睿软件在关闭 Greengrass 组件进程时会忽略此关闭信号。如果您运行此命令时， Amazon IoT Greengrass Core 软件忽略了关机信号，请等待几秒钟，然后重试。

------
#### [ PowerShell ]
+ 检查服务状态

  ```
  Get-Service -Name "greengrass"
  ```
+ 让核心在设备开机时启动。

  ```
  Set-Service -Name "greengrass" -Status stopped -StartupType automatic
  ```
+ 在设备开机时阻止核心启动。

  ```
  Set-Service -Name "greengrass" -Status stopped -StartupType disabled
  ```
+ 启动 Amazon IoT Greengrass 核心软件。

  ```
  Start-Service -Name "greengrass"
  ```
+ 停止 Amazon IoT Greengrass 核心软件。

  ```
  Stop-Service -Name "greengrass"
  ```
**注意**  <a name="windows-ignore-shutdown-signal-behavior-note"></a>
在 Windows 设备上， Amazon IoT Greengrass 酷睿软件在关闭 Greengrass 组件进程时会忽略此关闭信号。如果您运行此命令时， Amazon IoT Greengrass Core 软件忽略了关机信号，请等待几秒钟，然后重试。

------

## 使用 JVM 选项控制内存分配
<a name="jvm-tuning"></a>

如果您在内存有限的设备 Amazon IoT Greengrass 上运行，则可以使用 Java 虚拟机 (JVM) 选项来控制最大堆大小、垃圾收集模式和编译器选项，这些选项控制 Amazon IoT Greengrass 核心软件使用的内存量。JVM 中的堆大小决定了在[垃圾回收](https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/introduction.html)发生之前或应用程序耗尽内存之前，应用程序可以使用的内存量。最大堆大小指定了在占用大量内存的活动期间扩展堆时，JVM 可分配的最大内存量。

要控制内存分配，请创建一个新部署或修改包含核心组件的现有部署，然后在[核心组件配置](greengrass-nucleus-component.md#greengrass-nucleus-component-configuration-jvm-options)的 `jvmOptions` 配置参数中指定您的 JVM 选项。

根据您的要求，您可以在减少内存分配或最小内存分配的情况下运行 C Amazon IoT Greengrass ore 软件。

**减少内存分配**  
要在减少内存分配的情况下运行 Amazon IoT Greengrass Core 软件，我们建议您使用以下示例配置合并更新在 nucleus 配置中设置 JVM 选项：

```
{
  "jvmOptions": "-XX:+UseSerialGC -XX:TieredStopAtLevel=1"
}
```

**最低内存分配**  
要以最少的内存分配运行 Amazon IoT Greengrass Core 软件，我们建议您使用以下示例配置合并更新在 nucleus 配置中设置 JVM 选项：

```
{
  "jvmOptions": "-Xmx32m -XX:+UseSerialGC -Xint"
}
```

**重要**  
以最少的内存分配运行 Amazon IoT Greengrass Core 软件可能会对低规格系统产生显著的性能影响，因为 JVM 在使用更少的内存时会进行更多的处理。我们建议调整选项以平衡内存和性能需求。

这些示例配置合并更新使用了以下 JVM 选项：

`-XX:+UseSerialGC`  
指定对 JVM 堆空间使用串行垃圾回收。与其它 JVM 垃圾回收实施相比，串行垃圾收集器虽然速度较慢，但占用的内存更少。

`-XX:TieredStopAtLevel=1`  
指示 JVM 使用一次 Java just-in-time (JIT) 编译器。由于 JIT 编译后的代码占用设备内存空间，因此多次使用 JIT 编译器比单次编译消耗的内存更多。

`-XmxNNm`  
设置最大 JVM 堆大小。  
将最大堆大小设置得太低可能会导致性能下降或出 out-of-memory错。我们建议先测量您当前的堆使用量，然后再使用 `-XmxNNm` 选项设置最大大小。使用 JVM 选项配置 `-XX:NativeMemoryTracking=detail` JVM。然后，使用 [jcmd 实用程序](https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html)中的 `VM.native_memory` 命令请求来衡量您当前的堆使用量。
如果无法对堆进行衡量，请将 `-Xmx64m` 作为起始值，以将堆大小限制为 64 MB。然后，再在此基础上逐渐减小最大堆大小。对于最低内存分配，请使用 `-Xmx32m` 作为起始值，将堆大小限制为 32 MB。  
您可以根据自己的实际需求增大或减小 `-Xmx` 值；但是我们强烈建议您不要将最大堆大小设置为 16 MB 以下。所需的 JVM 堆大小也可能会随着时间的推移而变化，具体变化取决于部署到核心设备的插件组件。如果最大堆大小对于您的环境来说太低，则 Amazon IoT Greengrass Core 软件可能会因为内存不足而遇到意外错误。如果由于内存不足而导致性能下降或遇到错误，请恢复到已知的正常设置。例如，如果您正常提交的堆大小为 `41428KB`，请使用 `-Xmx40m` 来略微限制堆的使用量。

`-Xint`  
指示 JVM 不要使用 just-in-time (JIT) 编译器。而指示 JVM 在“仅解释”模式下运行。此模式比运行 JIT 编译后的代码慢（在低端系统上部署可能会慢 20 倍）；但是，编译后的代码不占用任何内存空间。

有关创建配置合并更新的信息，请参阅[更新组件配置](update-component-configurations.md)。

## 配置运行组件的用户
<a name="configure-component-user"></a>

 Amazon IoT Greengrass Core 软件可以以不同于运行该软件的系统用户和组的身份运行组件进程。这可以提高安全性，因为您可以以 root 用户或管理员用户身份运行 C Amazon IoT Greengrass ore 软件，而无需将这些权限授予在核心设备上运行的组件。

下表显示了 Amazon IoT Greengrass 核心软件可以以您指定的用户身份运行的组件类型。有关更多信息，请参阅 [组件类型](develop-greengrass-components.md#component-types)。


| 组件类型 | 配置组件用户 | 
| --- | --- | 
|  Nucleus  |  <a name="polaris-no-para"></a> ![\[No\]](http://docs.amazonaws.cn/greengrass/v2/developerguide/images/icon-no.png)没有   | 
|  插件  |  <a name="polaris-no-para"></a> ![\[No\]](http://docs.amazonaws.cn/greengrass/v2/developerguide/images/icon-no.png)没有   | 
|  通用  |  <a name="polaris-yes-para"></a> ![\[Yes\]](http://docs.amazonaws.cn/greengrass/v2/developerguide/images/icon-yes.png) 是   | 
|  Lambda（非容器化）  |  <a name="polaris-yes-para"></a> ![\[Yes\]](http://docs.amazonaws.cn/greengrass/v2/developerguide/images/icon-yes.png) 是   | 
|  Lambda（容器化）  |  <a name="polaris-yes-para"></a> ![\[Yes\]](http://docs.amazonaws.cn/greengrass/v2/developerguide/images/icon-yes.png) 是   | 

您必须先创建组件用户，然后才能在部署配置中指定该用户。在基于 Windows 的设备上，您还必须将用户的用户名和密码存储在账户的凭据管理器实例中。 LocalSystem 有关更多信息，请参阅 [在 Windows 设备上设置组件用户](#create-component-user-windows)。

在基于 Linux 的设备上配置组件用户时，您还可以选择指定组。您使用以下格式指定由半角冒号（`:`）分隔的用户和组：`user:group`。如果您未指定群组，则 Amazon IoT Greengrass Core 软件将默认为该用户的主群组。您可以使用名称或 ID 来标识用户和组。

在基于 Linux 的设备上，您还能够以不存在的系统用户（也称为未知用户）身份运行组件，以提高安全性。Linux 进程可以向同一用户运行的任何其它进程发出信号。未知用户不会运行其它进程，因此您能够以未知用户身份运行组件，以防止组件向核心设备上的其它组件发出信号。要以未知用户身份运行组件，请指定一个核心设备上不存在的用户 ID。您还可以指定一个不存在的组 ID，以便以未知组身份运行。

您可以为每个组件和每个核心设备配置用户。
+ **为组件配置**

  您可以将每个组件配置为使用特定于该组件的用户运行。创建部署时，您可以为该组件的 `runWith` 配置中的每个组件指定用户。如果您配置组件， Amazon IoT Greengrass Core 软件将以指定用户身份运行组件。否则，它将默认以您为核心设备配置的默认用户的身份运行组件。有关在部署配置中指定组件用户的更多信息，请参阅[创建部署](create-deployments.md)中的 [`runWith`](create-deployments.md#component-run-with-config) 配置参数。
+ **为核心设备配置默认用户**

  您可以配置 C Amazon IoT Greengrass ore 软件用来运行组件的默认用户。当 Amazon IoT Greengrass 核心软件运行某个组件时，它会检查您是否为该组件指定了用户，并使用它来运行该组件。如果组件未指定用户，则 Amazon IoT Greengrass Core 软件将以您为核心设备配置的默认用户身份运行该组件。有关更多信息，请参阅 [配置默认组件用户](#configure-default-component-user)。

**注意**  
在基于 Windows 的设备上，您必须至少指定一个默认用户来运行组件。  
在基于 Linux 的设备上，如果您没有配置运行组件的用户，则需要考虑以下注意事项：  
如果您以 root 用户身份运行 Amazon IoT Greengrass Core 软件，则该软件将无法运行组件。如果您以根用户身份运行，则必须指定默认用户来运行组件。
如果您以非 root 用户身份运行 Amazon IoT Greengrass Core 软件，则该软件将以该用户身份运行组件。

**Topics**
+ [在 Windows 设备上设置组件用户](#create-component-user-windows)
+ [配置默认组件用户](#configure-default-component-user)

### 在 Windows 设备上设置组件用户
<a name="create-component-user-windows"></a>

**在基于 Windows 的设备上设置组件用户**

1. 在设备上的 LocalSystem 帐户中创建组件用户。

   ```
   net user /add component-user password
   ```

1. 使用 [Microsoft 的 PsExec 实用程序](https://docs.microsoft.com/en-us/sysinternals/downloads/psexec)将组件用户的用户名和密码存储在 LocalSystem 帐户的凭据管理器实例中。

   ```
   psexec -s cmd /c cmdkey /generic:component-user /user:component-user /pass:password
   ```
**注意**  
在基于 Windows 的设备上，该 LocalSystem 帐户运行 Greengrass 核，您必须使用该 PsExec 实用程序将组件用户信息存储在帐户中。 LocalSystem使用凭据管理器应用程序将此信息存储在当前登录用户的 Windows 帐户中，而不是 LocalSystem帐户中。

### 配置默认组件用户
<a name="configure-default-component-user"></a>

您可以使用某个部署在核心设备上配置默认用户。在此部署中，您更新[核心组件](greengrass-nucleus-component.md)配置。

**注意**  
在安装 C Amazon IoT Greengrass ore 软件时，也可以使用`--component-default-user`选项设置默认用户。有关更多信息，请参阅 [安装 Amazon IoT Greengrass Core 软件](install-greengrass-core-v2.md)。

[创建一个部署](create-deployments.md)，通过该部署为 `aws.greengrass.Nucleus` 组件指定以下配置更新。

------
#### [ Linux ]

```
{
  "runWithDefault": {
    "posixUser": "ggc_user:ggc_group"
  }
}
```

------
#### [ Windows ]

```
{
  "runWithDefault": {
    "windowsUser": "ggc_user"
  }
}
```

**注意**  
您指定的用户必须存在，并且该用户的用户名和密码必须存储在您的 Windows 设备上该 LocalSystem 帐户的凭据管理器实例中。有关更多信息，请参阅 [在 Windows 设备上设置组件用户](#create-component-user-windows)。

------

以下示例定义了将 `ggc_user` 配置为默认用户和将 `ggc_group` 配置为默认组的基于 Linux 的设备的部署。`merge` 配置更新需要序列化 JSON 对象。

```
{
  "components": {
    "aws.greengrass.Nucleus": {
      "version": "2.16.1",
      "configurationUpdate": {
        "merge": "{\"runWithDefault\":{\"posixUser\":\"ggc_user:ggc_group\"}}"
      }
    }
  }
}
```

## 配置组件的系统资源限制
<a name="configure-component-system-resource-limits"></a>

**注意**  
[此功能适用于 Greengrass nucleus 组件的 v2.4.0 及更高版本。](greengrass-nucleus-component.md) Amazon IoT Greengrass 目前不支持在 Windows 核心设备上使用此功能。

您可以配置每个组件进程可在核心设备上使用的最大 CPU 和 RAM 用量。

下表显示了支持系统资源限制的组件类型。有关更多信息，请参阅 [组件类型](develop-greengrass-components.md#component-types)。


| 组件类型 | 配置系统资源限制 | 
| --- | --- | 
|  Nucleus  |  <a name="polaris-no-para"></a> ![\[No\]](http://docs.amazonaws.cn/greengrass/v2/developerguide/images/icon-no.png)没有   | 
|  插件  |  <a name="polaris-no-para"></a> ![\[No\]](http://docs.amazonaws.cn/greengrass/v2/developerguide/images/icon-no.png)没有   | 
|  通用  |  <a name="polaris-yes-para"></a> ![\[Yes\]](http://docs.amazonaws.cn/greengrass/v2/developerguide/images/icon-yes.png) 是   | 
|  Lambda（非容器化）  |  <a name="polaris-yes-para"></a> ![\[Yes\]](http://docs.amazonaws.cn/greengrass/v2/developerguide/images/icon-yes.png) 是   | 
|  Lambda（容器化）  |  <a name="polaris-no-para"></a> ![\[No\]](http://docs.amazonaws.cn/greengrass/v2/developerguide/images/icon-no.png)没有   | 

**重要**  
在 [Docker 容器中运行 C Amazon IoT Greengrass ore 软件时，](run-greengrass-docker.md)不支持系统资源限制。

您可以为每个组件和每个核心设备配置系统资源限制。
+ **为组件配置**

  您可以为每个组件配置特定于该组件的系统资源限制。创建部署时，您可以为部署中的每个组件指定系统资源限制。如果组件支持系统资源限制，则 Amazon IoT Greengrass Core 软件会将限制应用于组件进程。如果您没有为组件指定系统资源限制，则 Amazon IoT Greengrass Core 软件将使用您为核心设备配置的任何默认值。有关更多信息，请参阅 [创建部署](create-deployments.md)。
+ **为核心设备配置默认值**

  您可以配置 C Amazon IoT Greengrass ore 软件应用于支持这些限制的组件的默认系统资源限制。当 Amazon IoT Greengrass 核心软件运行某个组件时，它会应用您为该组件指定的系统资源限制。如果该组件未指定系统资源限制，则 Amazon IoT Greengrass Core 软件将应用您为核心设备配置的默认系统资源限制。如果您未指定默认的系统资源限制，则默认情况下， Amazon IoT Greengrass Core 软件不会应用任何系统资源限制。有关更多信息，请参阅 [配置默认系统资源限制](#configure-default-component-system-resource-limits)。

### 配置默认系统资源限制
<a name="configure-default-component-system-resource-limits"></a>

您可以部署 [Greengrass Nucleus 组件](greengrass-nucleus-component.md)，以为核心设备配置默认系统资源限制。要配置默认的系统资源限制，请[创建一个部署](create-deployments.md)，通过该部署为 `aws.greengrass.Nucleus` 组件指定以下配置更新。

```
{
  "runWithDefault": {
    "systemResourceLimits": {
      "cpu": cpuTimeLimit,
      "memory": memoryLimitInKb
    }
  }
}
```

以下示例定义了一个部署，该部署将 CPU 时间限制配置为 `2`，这相当于在具有 4 个 CPU 内核的设备上使用 50% 的时间。此示例还将内存使用量配置为 100 MB。

```
{
  "components": {
    "aws.greengrass.Nucleus": {
      "version": "2.16.1",
      "configurationUpdate": {
        "merge": "{\"runWithDefault\":{\"systemResourceLimits\":\"cpus\":2,\"memory\":102400}}}"
      }
    }
  }
}
```

## 通过端口 443 或网络代理进行连接
<a name="configure-alpn-network-proxy"></a>

Amazon IoT Greengrass 核心设备 Amazon IoT Core 使用带有 TLS 客户端身份验证的 MQTT 消息协议与之通信。按照惯例，基于 TLS 的 MQTT 使用端口 8883。但是，作为一项安全措施，限制性环境可能会将入站和出站流量限制到一个较小的 TCP 端口范围。例如，企业防火墙可能会为 HTTPS 流量打开端口 443，但关闭不常用协议使用的其他端口，例如用于 MQTT 流量的端口 8883。其它限制性环境可能要求所有流量经由代理连接到互联网。

**注意**  
运行 Greengrass 核心组件 v2.0.3 及更早版本的 [Greengrass 核心设备使用端口 8443 连接到数据](greengrass-nucleus-component.md)平面端点。 Amazon IoT Greengrass 这些设备必须能够通过端口 8443 连接到此端点。有关更多信息，请参阅 [允许设备流量通过代理或防火墙](allow-device-traffic.md)。

为了在这些情况下启用通信， Amazon IoT Greengrass 提供了以下配置选项：
+ **通过端口 443 进行 MQTT 通信**。如果您的网络允许连接到端口 443，则可以将 Greengrass 核心设备配置为使用端口 443（而非默认端口 8883）进行 MQTT 通信。这可以是与端口 443 的直接连接，也可以是通过网络代理服务器的连接。与使用基于证书的客户端身份验证的默认配置不同，端口 443 上的 MQTT 使用[设备服务角色](device-service-role.md)进行身份验证。

  有关更多信息，请参阅 [通过端口 443 配置 MQTT](#configure-mqtt-port-443)。
+ **通过端口 443 进行 HTTPS 通信**。默认情况下， Amazon IoT Greengrass 核心软件通过端口 8443 发送 HTTPS 流量，但您可以将其配置为使用端口 443。 Amazon IoT Greengrass 使用[应用层协议网络](https://tools.ietf.org/html/rfc7301) (ALPN) TLS 扩展来启用此连接。与默认配置一样，端口 443 上的 HTTPS 使用基于证书的客户端身份验证。
**重要**  
要使用 ALPN 并通过端口 443 启用 HTTPS 通信，您的核心设备必须运行 Java 8 更新 252 或更高版本。Java 版本 9 及更高版本的所有更新也支持 ALPN。

  有关更多信息，请参阅 [通过端口 443 配置 HTTPS](#configure-https-port-443)。
+ **通过网络代理连接**。您可以配置一个网络代理服务器来充当连接到 Greengrass 核心设备的媒介。 Amazon IoT Greengrass 支持针对 HTTP 和 HTTPS 代理的基本身份验证。

  <a name="https-proxy-greengrass-nucleus-requirement"></a>Greengrass 核心设备必须运行 [Greengrass Nucleus](greengrass-nucleus-component.md) v2.5.0 或更高版本才能使用 HTTPS 代理。

  C Amazon IoT Greengrass ore 软件通过`ALL_PROXY`、`HTTP_PROXY``HTTPS_PROXY`、和`NO_PROXY`环境变量将代理配置传递给组件。组件必须使用这些设置才能经由代理进行连接。组件使用通常默认使用这些环境变量的公用库（例如 boto3、URL 和 python `requests` 程序包）建立连接。如果组件还指定了这些环境变量，则 Amazon IoT Greengrass 不会覆盖它们。

  有关更多信息，请参阅 [配置网络代理](#configure-network-proxy)。

### 通过端口 443 配置 MQTT
<a name="configure-mqtt-port-443"></a>

您可以在现有核心设备上配置通过端口 443 的 MQTT，也可以在新的核心设备上安装 Amazon IoT Greengrass Core 软件时进行此配置。

**Topics**
+ [在现有核心设备上配置通过端口 443 的 MQTT](#configure-mqtt-port-443-deployment)
+ [在安装过程中通过端口 443 配置 MQTT](#configure-mqtt-port-443-installer)

#### 在现有核心设备上配置通过端口 443 的 MQTT
<a name="configure-mqtt-port-443-deployment"></a>

您可以使用某个部署在单个核心设备或一组核心设备上配置通过端口 443 的 MQTT。在此部署中，您更新[核心组件](greengrass-nucleus-component.md)配置。当您更新核心的 `mqtt` 配置时，核心会重新启动。

要通过端口 443 配置 MQTT，请[创建一个部署](create-deployments.md)，通过该部署为 `aws.greengrass.Nucleus` 组件指定以下配置更新。

```
{
  "mqtt": {
    "port": 443
  }
}
```

以下示例定义了一个部署，该部署配置了通过端口 443 的 MQTT。`merge` 配置更新需要序列化 JSON 对象。

```
{
  "components": {
    "aws.greengrass.Nucleus": {
      "version": "2.16.1",
      "configurationUpdate": {
        "merge": "{\"mqtt\":{\"port\":443}}"
      }
    }
  }
}
```

#### 在安装过程中通过端口 443 配置 MQTT
<a name="configure-mqtt-port-443-installer"></a>

在核心设备上安装 Amazon IoT Greengrass 核心软件时，可以通过端口 443 配置 MQTT。使用 `--init-config` 安装程序参数配置通过端口 443 的 MQTT。在使用[手动预置](manual-installation.md)、[实例集预置](fleet-provisioning.md)或[自定义预置](custom-provisioning.md)进行安装时，您可以指定此参数。

### 通过端口 443 配置 HTTPS
<a name="configure-https-port-443"></a>

此功能需要 [Greengrass Nucleus](greengrass-nucleus-component.md) v2.0.40 或更高版本。

您可以在现有核心设备上配置通过端口 443 的 HTTPS，也可以在新的核心设备上安装 Amazon IoT Greengrass Core 软件时进行此配置。

**Topics**
+ [在现有核心设备上配置通过端口 443 的 HTTPS](#configure-https-port-443-deployment)
+ [在安装过程中配置通过端口 443 的 HTTPS](#configure-https-port-443-installer)

#### 在现有核心设备上配置通过端口 443 的 HTTPS
<a name="configure-https-port-443-deployment"></a>

您可以使用某个部署在单个核心设备或一组核心设备上配置通过端口 443 的 HTTPS。在此部署中，您更新[核心组件](greengrass-nucleus-component.md)配置。

要通过端口 443 配置 HTTPS，请[创建一个部署](create-deployments.md)，通过该部署为 `aws.greengrass.Nucleus` 组件指定以下配置更新。

```
{
  "greengrassDataPlanePort": 443
}
```

以下示例定义了一个部署，该部署配置了通过端口 443 的 HTTPS。`merge` 配置更新需要序列化 JSON 对象。

```
{
  "components": {
    "aws.greengrass.Nucleus": {
      "version": "2.16.1",
      "configurationUpdate": {
        "merge": "{\"greengrassDataPlanePort\":443}"
      }
    }
  }
}
```

#### 在安装过程中配置通过端口 443 的 HTTPS
<a name="configure-https-port-443-installer"></a>

在核心设备上安装 Amazon IoT Greengrass 核心软件时，可以通过端口 443 配置 HTTPS。使用 `--init-config` 安装程序参数配置通过端口 443 的 HTTPS。在使用[手动预置](manual-installation.md)、[实例集预置](fleet-provisioning.md)或[自定义预置](custom-provisioning.md)进行安装时，您可以指定此参数。

### 配置网络代理
<a name="configure-network-proxy"></a>

按照本节中的步骤将 Greengrass 核心设备配置为经由 HTTP 或 HTTPS 网络代理连接到互联网。有关核心设备使用的端点和端口的更多信息，请参阅[允许设备流量通过代理或防火墙](allow-device-traffic.md)。

**重要**  
如果您的核心设备运行的 [Greengrass Nucleus](greengrass-nucleus-component.md) 版本低于 v2.4.0，则设备的角色必须具有以下权限才能使用网络代理：  
`iot:Connect`
`iot:Publish`
`iot:Receive`
`iot:Subscribe`
这是必要的，因为设备使用来自令牌交换服务的 Amazon 凭证来验证与 MQTT 的连接。 Amazon IoT设备使用 MQTT 接收和安装来自的部署 Amazon Web Services 云，因此，除非您对其角色定义这些权限，否则您的设备将无法运行。设备通常使用 X.509 证书对 MQTT 连接进行身份验证，但是设备在使用代理时无法使用此证书进行身份验证。  
有关如何配置设备角色的更多信息，请参阅[授权核心设备与 Amazon 服务交互](device-service-role.md)。

**Topics**
+ [在现有核心设备上配置网络代理](#configure-network-proxy-deployment)
+ [在安装过程中配置网络代理](#configure-network-proxy-installer)
+ [使核心设备信任 HTTPS 代理](#https-proxy-certificate-trust)
+ [networkProxy 对象](#network-proxy-object)

#### 在现有核心设备上配置网络代理
<a name="configure-network-proxy-deployment"></a>

您可以使用某个部署在单个核心设备或一组核心设备上配置网络代理。在此部署中，您更新[核心组件](greengrass-nucleus-component.md)配置。当您更新核心的 `networkProxy` 配置时，核心会重新启动。

要配置网络代理，请为 `aws.greengrass.Nucleus` 组件[创建一个部署](create-deployments.md)，通过该部署合并以下配置更新。此配置更新包含 [networkProxy 对象](#network-proxy-object)。

```
{
  "networkProxy": {
    "noProxyAddresses": "http://192.168.0.1,www.example.com",
    "proxy": {
      "url": "https://my-proxy-server:1100"
    }
  }
}
```

以下示例定义了一个部署，该部署配置了网络代理。`merge` 配置更新需要序列化 JSON 对象。

```
{
  "components": {
    "aws.greengrass.Nucleus": {
      "version": "2.16.1",
      "configurationUpdate": {
        "merge": "{\"networkProxy\":{\"noProxyAddresses\":\"http://192.168.0.1,www.example.com\",\"proxy\":{\"url\":\"https://my-proxy-server:1100\",\"username\":\"Mary_Major\",\"password\":\"pass@word1357\"}}}"
      }
    }
  }
}
```

#### 在安装过程中配置网络代理
<a name="configure-network-proxy-installer"></a>

在 Amazon IoT Greengrass 核心设备上安装 Core 软件时，可以配置网络代理。使用 `--init-config` 安装程序参数配置网络代理。在使用[手动预置](manual-installation.md)、[实例集预置](fleet-provisioning.md)或[自定义预置](custom-provisioning.md)进行安装时，您可以指定此参数。

#### 使核心设备信任 HTTPS 代理
<a name="https-proxy-certificate-trust"></a>

将核心设备配置为使用 HTTPS 代理时，必须将代理服务器证书链添加到核心设备中，使其能够信任 HTTPS 代理。否则，核心设备在尝试通过代理路由流量时可能会遇到错误。将代理服务器 CA 证书添加到核心设备的 Amazon 根 CA 证书文件中。

**使核心设备信任 HTTPS 代理的步骤**

1. 在核心设备上找到 Amazon 根 CA 证书文件。
   + 如果您安装了具有[自动配置功能](quick-installation.md)的 C Amazon IoT Greengrass ore 软件，则 Amazon 根 CA 证书文件位于中`/greengrass/v2/rootCA.pem`。
   + 如果您使用[手动](manual-installation.md)或[队列配置](fleet-provisioning.md)安装 Amazon IoT Greengrass 核心软件，则 Amazon 根 CA 证书文件可能存在于`/greengrass/v2/AmazonRootCA1.pem`。

   如果这些位置不存在 Amazon 根 CA 证书，请查看 `/greengrass/v2/config/effectiveConfig.yaml` 中的 `system.rootCaPath` 属性，来查找其位置。

1. 将代理服务器 CA 证书文件的内容添加到 Amazon 根 CA 证书文件中。

   以下示例显示了添加到 Amazon 根 CA 证书文件中的代理服务器 CA 证书。

   ```
   -----BEGIN CERTIFICATE-----
   MIIEFTCCAv2gAwIQWgIVAMHSAzWG/5YVRYtRQOxXUTEpHuEmApzGCSqGSIb3DQEK
   \nCwUAhuL9MQswCQwJVUzEPMAVUzEYMBYGA1UECgwP1hem9uLmNvbSBJbmMuMRww
   ... content of proxy CA certificate ...
   +vHIRlt0e5JAm5\noTIZGoFbK82A0/nO7f/t5PSIDAim9V3Gc3pSXxCCAQoFYnui
   GaPUlGk1gCE84a0X\n7Rp/lND/PuMZ/s8YjlkY2NmYmNjMCAXDTE5MTEyN2cM216
   gJMIADggEPADf2/m45hzEXAMPLE=
   -----END CERTIFICATE-----
   
   -----BEGIN CERTIFICATE-----
   MIIDQTCCAimgF6AwIBAgITBmyfz/5mjAo54vB4ikPmljZKyjANJmApzyMZFo6qBg
   ADA5MQswCQYDVQQGEwJVUzEPMA0tMVT8QtPHRh8jrdkGA1UEChMGDV3QQDExBBKW
   ... content of root CA certificate ...
   o/ufQJQWUCyziar1hem9uMRkwFwYVPSHCb2XV4cdFyQzR1KldZwgJcIQ6XUDgHaa
   5MsI+yMRQ+hDaXJiobldXgjUka642M4UwtBV8oK2xJNDd2ZhwLnoQdeXeGADKkpy
   rqXRfKoQnoZsG4q5WTP46EXAMPLE
   -----END CERTIFICATE-----
   ```

#### networkProxy 对象
<a name="network-proxy-object"></a>

使用 `networkProxy` 对象指定有关网络代理的信息。该对象包含以下信息：

`noProxyAddresses`  
（可选）不使用代理的 IP 地址或主机名的逗号分隔列表。

`proxy`  
要连接的代理。该对象包含以下信息：    
`url`  
代理服务器的 URL，格式为 `scheme://userinfo@host:port`。  <a name="nucleus-component-configuration-proxy-url-segments"></a>
+ `scheme` – 方案，必须是 `http` 或 `https`。
**重要**  
<a name="https-proxy-greengrass-nucleus-requirement"></a>Greengrass 核心设备必须运行 [Greengrass Nucleus](greengrass-nucleus-component.md) v2.5.0 或更高版本才能使用 HTTPS 代理。  
如果您配置 HTTPS 代理，则必须将代理服务器 CA 证书添加到核心设备的 Amazon 根 CA 证书中。有关更多信息，请参阅 [使核心设备信任 HTTPS 代理](#https-proxy-certificate-trust)。
+ `userinfo` –（可选）用户名和密码信息。如果您在 `url` 中指定此信息，则 Greengrass 核心设备将忽略 `username` 和 `password` 字段。
+ `host` – 代理服务器的主机名或 IP 地址。
+ `port` –（可选）端口号。如果您未指定端口，则 Greengrass 核心设备将使用以下默认值：
  + `http` – 80
  + `https` – 443  
`username`  
（可选）代理服务器进行身份验证时使用的用户名。  
`password`  
（可选）用于对代理服务器进行身份验证的密码。

## 使用由私有 CA 签名的设备证书
<a name="configure-nucleus-private-ca"></a>

如果您使用自定义私有证书颁发机构（CA），则必须将 Greengrass Nucleus 的 **greengrassDataPlaneEndpoint** 设置为 **iotdata**。您可以在部署或安装期间使用 **--init-config** [ 安装程序参数](configure-installer.md)设置此选项。

您可以自定义设备连接的 Greengrass 数据面板端点。您可以将此配置选项设置为 **iotdata**，以将 Greengrass 数据面板端点设置为与 IoT 数据端点相同的端点，您可以使用 **iotDataEndpoint** 指定该端点。

## 配置 MQTT 超时和缓存设置
<a name="configure-mqtt"></a>

在 Amazon IoT Greengrass 环境中，组件可以使用 MQTT 进行 Amazon IoT Core通信。 Amazon IoT Greengrass 核心软件管理组件的 MQTT 消息。当核心设备与 Amazon Web Services 云断开连接时，软件会缓存 MQTT 消息，以便稍后在连接恢复后重试。您可以配置消息超时和缓存大小等设置。有关更多信息，请参阅 [Greengrass Nucleus 组件](greengrass-nucleus-component.md)的 `mqtt` 和 `mqtt.spooler` 配置参数。

Amazon IoT Core 对其 MQTT 消息代理施加服务配额。这些配额可能适用于您在核心设备和 Amazon IoT Core之间发送的消息。有关更多信息，请参阅 *Amazon Web Services 一般参考* 中的 [Amazon IoT Core 消息代理服务配额](https://docs.amazonaws.cn/general/latest/gr/iot-core.html#message-broker-limits)。

## 在网络上配置 Greengrass Nucleus IPv6
<a name="configure-ipv6"></a>

 [Greengrass Nucleus 通过 Greengrass 与之交谈。 Amazon IoT Core APIs](https://docs.amazonaws.cn/general/latest/gr/greengrassv2.html)双栈环境下支持 APIs Greengr IPv6 ass。

要启用双栈端点，请执行以下操作： IPv6
+  添加系统属性 `aws.useDualstackEndpoint=true` 和 `java.net.preferIPv6Addresses=true` 至 `jvmOptions` 
+  将 `s3EndpointType` 设置为 `DUALSTACK` 

 在[部署](https://docs.amazonaws.cn/greengrass/v2/developerguide/create-deployments.html)期间设置此选项，或者使用 `--init-config` [安装程序参数](https://docs.amazonaws.cn/greengrass/v2/developerguide/configure-installer.html)手动配置。请参阅[使用 Amazon S3 双堆栈端点](https://docs.amazonaws.cn/AmazonS3/latest/API/dual-stack-endpoints.html)了解更多详细信息。

**Example 部署代码：**  

```
{
    "jvmOptions": "-Daws.useDualstackEndpoint=true",
    "s3EndpointType":"DUALSTACK"
}
```

**Example 通过手动配置进行 `config.yaml`：**  

```
---
system:
  ...
services:
  aws.greengrass.Nucleus:
    ...
    configuration:
      ...
      jvmOptions: "-Daws.useDualstackEndpoint=true -Djava.net.preferIPv6Addresses=true"
      s3EndpointType: "DUALSTACK"
```