# 将代理服务器与运行器一起使用

可以在隔离环境中配置执行程序，以通过代理服务器与 GitHub 进行安全通信。

> \[!NOTE]
> GitHub Enterprise Server 目前不支持 GitHub 托管的运行器。

## 为 Linux 和 Windows 运行器配置代理服务器

如果运行程序需要通过代理服务器进行通信，则可以使用环境变量或系统级配置来配置代理设置。

| Variable      | Description                                                             | Example                                                                                     |
| ------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| `https_proxy` | HTTPS 流量的代理 URL。 如果需要，可以包括基本身份验证。                                       | `http://proxy.local`<br>`http://192.168.1.1:8080`<br>`http://username:password@proxy.local` |
| `http_proxy`  | 用于 HTTP 流量的代理 URL。 如果需要，可以包括基本身份验证。                                     | `http://proxy.local`<br>`http://192.168.1.1:8080`<br>`http://username:password@proxy.local` |
| `no_proxy`    | 以逗号分隔的主机或 IP 地址列表，这些主机或 IP 地址应绕过代理。 某些客户端只在直接连接到 IP 地址而不是主机名时才接受 IP 地址。 | `example.com`<br>`example.com,myserver.local:443,example.org`                               |

运行程序应用程序启动时会读取代理环境变量，因此在配置或启动运行程序应用程序之前，必须设置环境变量。 如果代理配置发生更改，则必须重启运行器应用。

在 Windows 计算机上，代理环境变量名称不区分大小写。 在 Linux 和 macOS 机器上，建议环境变量全部小写。 如果 Linux 或 macOS 上的环境变量具有小写和大写形式（例如 `https_proxy` 和 `HTTPS_PROXY`），自托管运行程序应用程序会使用小写环境变量。

自托管运行器与 GitHub 之间的连接通过 HTTP（端口 80）或 HTTPS（端口 443）进行。
若要确保通过 HTTPS 建立连接，请为其 GitHub Enterprise Server配置 TLS。 有关详细信息，请参阅 [配置 TLS](/zh/enterprise-server@3.22/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-tls)。

> \[!WARNING]
> 自托管运行器不支持在 `no_proxy` 环境变量中使用 IP 地址和 CIDR 范围。 如果你的 GitHub Enterprise Server 实例使用 IP 地址且你配置 `no_proxy` 绕过该地址的代理，运行器仍会无法连接。
> 如果你的 GitHub Enterprise Server 实例使用 IP 地址访问且连接必须绕过代理，运行器将无法连接，即使该 IP 地址列在 `no_proxy` 中。

### 示例配置

> \[!NOTE]
> 为了避免问题，无论所用操作系统和 shell 的行为为何，最好将环境变量视为区分大小写。

#### Linux 和 macOS

为运行器设置代理环境变量。

```shell copy
export https_proxy=http://proxy.local:8080
export http_proxy=http://proxy.local:8080
export no_proxy=example.com,localhost,127.0.0.1
```

#### Windows操作系统

在 Windows 上，可以通过设置环境变量或使用 [netsh 命令](https://learn.microsoft.com/en-us/windows/win32/winhttp/netsh-exe-commands#set-advproxy)来配置代理设置。
netsh 方法适用于依赖于 WinHTTP API 的应用程序和服务。

使用专用网络的运行程序仍需要设置环境变量。 是否需要配置 netsh 取决于工作流中使用的应用程序。

```shell copy
netsh winhttp set advproxy setting-scope=machine settings={\"Proxy\":\"proxy.local:8080\",\"ProxyBypass\":\"168.63.129.16;169.254.169.254\",\"AutoconfigUrl\":\"\",\"AutoDetect\":false} 
```

在自定义映像生成期间配置此配置时，用于 `setting-scope=machine` 确保在重新启动后和 VM 映像期间保留代理设置。

### 使代理设置持久化

在自定义映像生成过程中设置这些环境变量时，请确保配置在重新启动或映像重新生成期间保持。

#### Linux 和 macOS

将变量写入`/etc/environment`。

```shell
 echo 'http_proxy=http://proxy.local' >> /etc/environment
```

#### Windows操作系统

设置系统范围的环境变量。

```shell copy
[Environment]::SetEnvironmentVariable("http_proxy", "http://proxy.local", "Machine")
```

## 为 Azure 运行器配置代理

如果运行程序托管在 Azure 中，可以是自承载运行程序，要么是使用专用网络部署的 GitHub 托管的大型运行程序，则可能需要配置代理，以允许与 GitHub 服务的出站连接，同时保持网络隔离。

应将 Azure 元数据和管理 IP 添加到 `no_proxy` 列表中，以确保运行程序可以访问所需的 Azure 服务。 这些终结点允许 Azure 虚拟机检索正常运行所需的配置和标识信息。

这两个 Azure IP 包括：

* 168.63.129.16（请参阅 [Azure IP 地址 168.63.129.16 概述](https://learn.microsoft.com/en-us/azure/virtual-network/what-is-ip-address-168-63-129-16?tabs=linux)）
* 169.254.169.254（请参阅 [Azure 实例元数据服务](https://learn.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service?tabs=linux)）

## 使用 .env 文件设置代理配置

> \[!NOTE]
> 在 GitHub 托管的运行程序上无法使用 `.env` 文件来设置代理配置。

在自托管运行程序上，可以通过将变量添加到自托管运行应用程序目录（即下载并解压该运行程序软件的目录）中的 `.env` 文件来配置代理设置。 当运行程序配置为在系统帐户下作为服务运行时，此方法非常有用。 运行器启动时，它会读取在`.env`中设置的用于代理配置的变量。

### `.env` 代理配置示例

```shell copy
https_proxy=http://proxy.local:8080
no_proxy=example.com,myserver.local:443
```

## 设置 Docker 容器的代理配置

如果你在工作流中使用 Docker 容器操作或服务容器，则除了设置上述环境变量外，可能还需要配置 Docker来使用代理服务器。

有关所需 Docker 配置的信息，请参阅 Docker 文档中的[配置 Docker 以使用代理服务器](https://docs.docker.com/network/proxy/)。