aiohttp环境变量代理不生效?从 trust_env 到 NO_PROXY 逐层排查
悟空代理IP 2026-09-17 201
终端里已经设置 HTTP_PROXY 和 HTTPS_PROXY,curl 走代理,同一台机器上的 aiohttp 脚本却仍然直连。这种 aiohttp环境变量代理不生效的现象,通常不是代理 IP 本身故障,而是客户端默认行为与预期不一致。
aiohttp 官方文档明确说明:ClientSession 默认不会读取环境中的代理设置;只有创建 Session 时传入 trust_env=True,才会通过 Python 的 urllib.request.getproxies() 解析环境配置。因此,排查要先确认“程序有没有读”,再确认“读到了什么”,最后才检查网络、认证和目标端。
先分清四种常见现象
| 现象 | 更可能的原因 | 第一步检查 |
|---|---|---|
curl 走代理,aiohttp 直连 |
Session 未设 trust_env=True |
检查 Session 创建位置 |
| HTTP 请求生效,HTTPS 不生效 | HTTPS_PROXY 缺失、协议或 TLS 问题 |
分别打印脱敏后的变量存在性 |
| 部分域名直连 | NO_PROXY 命中 |
检查域名、后缀和端口规则 |
| 本地生效,容器或守护进程不生效 | 启动进程没继承变量 | 在实际运行进程内取证 |
最小可复现的正确写法
下面的代码让 aiohttp 信任环境代理,同时只记录必要的请求结果,不输出带凭据的代理 URL:
import asyncio
import aiohttp
async def main():
timeout = aiohttp.ClientTimeout(total=20, connect=8)
async with aiohttp.ClientSession(
trust_env=True,
timeout=timeout,
) as session:
async with session.get("https://example.com/health") as response:
print(response.status)
asyncio.run(main())
环境变量可在启动前注入:
export HTTP_PROXY="http://proxy-host:port"
export HTTPS_PROXY="http://proxy-host:port"
export NO_PROXY="localhost,127.0.0.1,.internal.example"
python app.py
HTTPS_PROXY 描述的是“HTTPS 目标请求使用哪个代理”,其值不一定以 https:// 开头。很多 HTTP 代理使用 http:// 入口,再通过 CONNECT 转发 HTTPS 目标。应以代理服务的实际入口协议为准,不要仅凭变量名修改 URL scheme。
用进程内证据代替“我明明 export 了”
对 systemd、Docker、CI 或 IDE 启动的程序,终端里看到的变量不等于运行进程继承到的变量。可在程序启动时检查键是否存在,但不要记录完整值:
import os
from urllib.request import getproxies
keys = ("HTTP_PROXY", "HTTPS_PROXY", "NO_PROXY")
print({key: bool(os.getenv(key)) for key in keys})
print({scheme: bool(value) for scheme, value in getproxies().items()})
第一行回答“进程是否收到变量”,第二行回答“Python 解析后识别到哪些类型”。若结果与预期不同,应检查容器 environment、systemd Environment、CI 变量作用域和进程是否重启,而不是先增加重试。
NO_PROXY 与显式 proxy 的优先级陷阱
aiohttp 官方说明,开启 trust_env 后,命中 NO_PROXY 的主机会绕过代理。因此“只有某个域名不生效”时,应优先做单变量对照:保持代理入口、目标和请求内容不变,临时移除对应的 NO_PROXY 项后再测。不要在生产环境直接清空整个列表。
如果代理只用于某一类受控请求,可以绕开环境变量,在请求中显式传入 proxy 和 proxy_auth。这样作用域更清楚,也更方便做与直连的对照。但不建议在日志、异常或代码仓库中保存带用户名和密码的完整 URL。
一套不混淆根因的排查顺序

- 用一条直连请求确认目标在当前环境可访问。
- 在同一进程中检查代理变量存在性和
getproxies()解析结果。 - 确认真正发请求的
ClientSession设了trust_env=True,而不是设在未使用的 Session 上。 - 检查
NO_PROXY,然后用显式proxy参数做一次受控对照。 - 环境代理已被采用后,再分开处理认证失败、TLS 失败、连接超时和目标返回的 4xx/5xx。
验证时可选择自有接口或明确允许的测试地址,对比直连与代理出口,不要用未授权的高并发请求来证明配置。需要核对代理协议、认证方式和出口时,可参考代理IP验证方法;使用统一入口时,以隧道代理 IP 公开说明和当前订单文档为准。
aiohttp环境变量代理不生效时,最短的修复路径通常是:在正确的 ClientSession 上启用 trust_env=True,确认运行进程确实继承了变量,排除 NO_PROXY 命中,再用显式代理请求做单变量对照。如果需要确认入口参数或脱敏协查,可通过悟空代理官网核对当前产品说明。

