代理配置
配置出站请求的代理设置
Apollo平台的一些功能(如托管联邦)需要 Apollo Server来发送出站请求至Apollo Studio。根据安全策略,您可能需要配置一个出站HTTP代理以便允许此类请求。
尽管 Apollo Server 支持通过 https.globalAgent
和 http.globalAgent
直接进行标准 Node.js "agent" 配置,但我们推荐使用 global-agent
包,以减少与创建自定义代理相关的必要配置。
global-agent
包允许使用环境变量(例如 HTTP_PROXY
、NO_AGENT
等)设置代理设置,这是 Node.js 本身所不支持的(可能永远都不会)。
配置代理代理
本指南涵盖了由 Node.js 版本 10 及更高版本支持的 global-agent
包。
安装 global-agent
依赖项
首先,使用您的依赖项管理器安装 global-agent
包:
npm install global-agent
启动 global-agent
代理代理
安装了global-agent
依赖后,请在创建Apollo Server之前调用其bootstrap
方法:
import { ApolloServer } from '@apollo/server';import { bootstrap } from 'global-agent';// Setup global support for environment variable based proxy configuration.bootstrap();// The following represents existing configuration, though its// important to bootstrap the agent before Apollo Server.const server = new ApolloServer({typeDefs,resolvers,});
使用环境变量配置代理
根据部署环境(例如AWS、Heroku、Kubernetes、Docker等),环境变量的设置可能会有所不同。以下说明将演示如何使用基于Unix的shell中的环境变量启动node进程。
默认情况下,以上初始化步骤将启用以下环境变量
-
GLOBAL_AGENT_HTTP_PROXY
这通常是设置最重要的且必需的环境变量。
-
GLOBAL_AGENT_HTTPS_PROXY
此变量定义HTTPS流量(即加密的SSL/TLS流量)应该代理的位置。如果不设置此变量,HTTPS流量将通过HTTP代理路由。
-
GLOBAL_AGENT_NO_PROXY
此变量允许排除特定域名进行代理。
设置这些环境变量后,可以配置用于出站请求的global-agent代理的创建。如果代理需要特殊的SSL/TLS请求证书,请查看本页后面的详细信息。
使用适当的 环境 变量定义,在启动服务器时进行设置。例如,要从一个Node.js服务器发送所有出站请求到http://proxy:3128,配置将是:
$ GLOBAL_AGENT_HTTP_PROXY=http://proxy:3128/ node index.js
还可以定义GLOBAL_AGENT_NO_PROXY
环境变量来排除某些URL的代理:
$ GLOBAL_AGENT_NO_PROXY='*.foo.com,10.0.1.100,baz.com' node index.js
如上所示,所有支持的环境变量都以GLOBAL_AGENT_
为前缀,以避免使用不常见的非前缀版本(例如HTTP_PROXY
)带来的不可取的副作用。了解更多信息要禁用这种默认的命名空间(即前缀),可以启动服务器时将GLOBAL_AGENT_ENVIRONMENT_VARIABLE_NAMESPACE
设置为空字符串:
$ GLOBAL_AGENT_ENVIRONMENT_VARIABLE_NAMESPACE="" HTTP_PROXY=http://proxy:3128/ node index.js
当然,也可以提供自定义命名空间。有关配置详情,请参阅《global-agent》的文档。
指定自定义SSL/TLS证书
根据代理通信的情况,可能需要扩展Node.js信任的默认“root”证书,以包括由代理管理员提供的证书。这些证书通常允许代理处理SSL/TLS流量,并允许代理分析此类流量。
这可以通过Node.js的NODE_EXTRA_CA_CERTS环境变量来实现:
- 相应的证书(即PEM文件)必须位于服务器运行所在的文件系统中。
- 启动服务器时,将
NODE_EXTRA_CA_CERTS
环境变量设置为该路径,并结合上述解释的现有代理配置变量:
$ NODE_EXTRA_CA_CERTS=/full/path/to/certificate.pem \GLOBAL_AGENT_HTTP_PROXY=http://proxy:3128/ \node index.js