如何为EC2 Web服务器实例配置代理实现外部API请求转发
方案合理性验证
你选择的Squid作为正向代理的方案是完全可行的,适配你当前的需求场景,额外还能带来三个优势:
- 统一出口IP,外部API侧仅需要加白代理服务器的公网IP即可,无需调整Web服务侧的IP规则
- 可实现访问管控,限制Web服务仅能访问指定的外部API域名/IP,降低安全风险
- 自带请求日志审计能力,后续排查外部API调用异常问题更方便
具体配置步骤
Squid代理服务器侧配置
- 修改Squid核心配置文件,默认路径为
/etc/squid/squid.conf- 首先添加Web服务EC2的访问权限:
acl webserver src <你的Web服务EC2的IP地址/32> - 放行该来源的请求:
http_access allow webserver - 如需限制仅能访问指定外部API,可补充规则:
acl allowed_api dstdomain .your-target-api.com(替换为实际API域名),再把上面的放行规则修改为http_access allow webserver allowed_api - 监听端口默认是3128,可修改
http_port 3128行自定义端口 - 如需隐藏Web服务的真实IP,可补充两行配置:
forwarded_for off、request_header_access X-Forwarded-For deny all
- 首先添加Web服务EC2的访问权限:
- 配置完成后校验语法合法性:
squid -k parse,校验通过后重启服务生效:systemctl restart squid,同时设置开机自启:systemctl enable squid - 调整Squid实例的安全组规则:入方向放开3128端口,源地址仅填写Web服务EC2的IP,禁止放开0.0.0.0/0避免代理被恶意滥用
Web服务EC2侧配置
根据实际需求选择全局代理或者单应用代理即可:
场景1:全局系统代理(所有对外请求都走代理)
- 编辑系统环境变量配置文件
/etc/profile,添加如下内容:
export http_proxy=http://<Squid代理EC2的IP>:3128 export https_proxy=http://<Squid代理EC2的IP>:3128 export no_proxy=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
- 执行
source /etc/profile让配置生效,可通过curl 你的外部API地址测试连通性,也可以查看Squid侧/var/log/squid/access.log确认请求是否正常中转
场景2:仅Web应用走代理(无需全局生效)
不用修改系统配置,直接在Web应用代码中指定代理即可,不同语言参考配置:
- Node.js(axios)
const axios = require('axios'); const HttpsProxyAgent = require('https-proxy-agent'); const agent = new HttpsProxyAgent('http://<Squid代理IP>:3128'); axios.get('https://你的API地址', { httpsAgent: agent });
- Python(requests)
import requests proxies = { 'http': 'http://<Squid代理IP>:3128', 'https': 'http://<Squid代理IP>:3128', } requests.get('https://你的API地址', proxies=proxies)
- Java:启动时添加JVM参数
-Dhttp.proxyHost=<Squid代理IP> -Dhttp.proxyPort=3128 -Dhttps.proxyHost=<Squid代理IP> -Dhttps.proxyPort=3128
优化建议
- 给Squid实例绑定弹性公网IP,避免实例重启后公网IP变动,导致外部API白名单失效
- 定期清理Squid访问日志避免磁盘占满,也可以将日志投递到统一日志服务做长期留存分析
- 可用性要求高的场景可以部署多台Squid实例,前端挂载内网负载均衡,Web服务侧代理地址指向负载均衡地址,避免单台Squid故障导致业务中断
- 若传输敏感数据,可配置Squid的HTTPS代理,加密Web服务到Squid之间的传输链路
内容的提问来源于stack exchange,提问作者ConorIsAMelon
相关产品推荐
相关产品推荐

