出站代理
部分模型无法从俄罗斯境内的服务器直接访问。为了不让这件事变成每一位运维人员都要自己动手完成的配置, AiHummer 在安装时下发出站代理的地址,并且自行决定每个请求究竟走哪一条路。
两句话讲清楚
代理地址由厂商下发,落到服务器上的一个私有文件里 —— 它不保存在 gateway.env 中,
也不会进入日志。如果代理未设置或不可达,请求就走 直连:实例继续工作,而不是停摆。
什么走哪条路
| 去向 | 怎么走 |
|---|---|
| 外部模型(境外提供方) | 走代理,前提是它已配置且可用 |
| 代理不可达时的同一模型 | 直连,并在日志中留下一条警告 |
localhost、*.localhost、实例自身的内部地址 |
始终直连,绕过代理 |
表格的最后一行很重要:实例访问自身时永远不会被裹进代理,否则本地调用就会依赖外部通道。
兜底路径:没有代理不等于拒绝
在 1.2.8 版本之前,未设置或不工作的代理意味着请求出错。现在的行为不同:
- 代理已配置且可用 → 请求经由它发出;
- 代理 未配置 → 请求直接发出,日志中会写入一次警告,原因为“未配置”;
- 代理已配置,但 取值不可用 → 请求直接发出,警告中的原因是“配置不可用”。
警告 每次启动只输出一次,而不是每个请求都输出:否则它会淹没日志,也就没人再读了。
:::note 直连是兜底方案,而不是代理的替代品。如果提供方不接受来自俄罗斯地址的请求,直连请求同样 到不了它那里 —— 但这次拒绝的是提供方,响应里看到的正是这一点,而不是笼统的“无法应用配置”。 :::
地址存放在哪里
取值存放在一个 私有文件 中,其路径由 AIHUMMER_OUTBOUND_PROXY_URL_FILE 指定。
对该文件的要求:
- 绝对路径;
- 普通文件,权限 不宽于
0600; - 大小不超过 4096 字节。
这样做是有意为之:代理地址中含有口令,因此它不应放在 gateway.env 里 ——
后者在日常维护中会被读取和复制。
:::caution
把地址“直接写在取值里”的 AIHUMMER_OUTBOUND_PROXY_URL 变量只为开发构建而存在。
发布构建不会读取它 —— 生产环境中只接受指向文件的路径。
:::
接受哪些地址
无论是在下发配置的时刻,还是在使用配置的时刻,校验都是同一套,因此不可用的取值会被 立即拒绝,而不会在日后变成日志里一行都没有的“境外模型又不工作了”。
接受的形式:http 或 https 方案、非空主机、无查询串、无片段、无路径(/ 除外)。
🔴 非本机主机上的裸 http 是被有意拒绝的。 在未加密的 http 上,
Proxy-Authorization 头会在每次连接时以明文发送 —— 也就是说代理口令会持续泄露。
对非本机主机请使用 https。
如何查看正在发生什么
# What is configured right now (the value is never printed — only whether it is set)
aihummer doctor
# Gateway log: the direct-route warning when the proxy was not applied
journalctl -u aihummer-gateway -n 200 | grep -i proxy
拒绝应用配置时会说明 原因 ——“未配置”“配置不可用”—— 而不是笼统的“无法应用”。 这正是把“地址没送到”和“地址送到了,但不正确”区分开来的地方。
运维人员该做什么
通常什么都不用做:地址在安装时下发。需要介入的只有两种情况。
- 用自己的代理替代厂商的。 把地址放进一个权限为
0600的私有文件,并在AIHUMMER_OUTBOUND_PROXY_URL_FILE中指出该路径,然后重启网关。 - 完全不需要代理(实例所在的位置可以直接访问模型)。什么都不用指定: 未设置的代理就意味着直连请求。