CentOS 7.9 的内网机器为了装依赖在 /etc/profile.d 里导出了 http_proxy,之后 curl 访问 10.0.8.12:8080 的健康检查一直超时,-v 显示请求被送到代理地址,代理那边回 502。

一开始怀疑是「systemd 服务不读 /etc/profile,代理变量却写进了 service 的 Environment」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。http_proxy 是全局导出的,curl 默认把所有请求都往代理送。少数情况下是no_proxy 没写或者只写了 localhost,内网网段没排除。

少数情况下是大写的 NO_PROXY 和小写混用,有些客户端只认其中一种。

先确认变量和实际走的路径

env | grep -i proxy && curl -v --max-time 5 http://10.0.8.12:8080/healthz 2>&1 | head -20

临时排除内网网段验证

curl --noproxy '10.0.0.0/8,127.0.0.1,localhost' -s -o /dev/null -w '%{http_code}
' http://10.0.8.12:8080/healthz

再往下把排除项写进全局配置

printf '%s
' 'export no_proxy=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16' 'export NO_PROXY=$no_proxy' >> /etc/profile.d/proxy.sh

等前面都确认过,再让 systemd 服务也带上排除项

systemctl show app -p Environment | tr ' ' '\n' | grep -i proxy

改完先别撤,确认这几项。curl 直连内网接口返回 200,-v 里不再出现 Trying 代理地址,服务重启后环境变量仍带 no_proxy。

补一句。no_proxy 里写网段要看客户端支持,curl 认 CIDR 但有些 SDK 只认域名后缀;改完要重新登录 shell,环境变量不会自动刷新。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189