本文介绍在 Node.js 中配置代理服务器以应对高频请求被封禁的场景。详细讲解了 Squid 自建代理与阿布云第三方代理的区别,并提供了 Axios 和 Request 库的具体代码配置。针对 Axios 请求 HTTPS 时出现的 501 错误,给出了使用 axios-https-proxy-fix 或 tunnel 模块的解决方案,同时简述了 curl 命令行测试方法。
Node.js 配置请求代理服务器
先讨论一下应用场景,此前我编写过一个基于 Node.js 的小爬虫,一直仅作为练习项目使用。
某天不知为何有人频繁刷我的接口,导致我的 IP 被对方服务器拉黑。
有人建议我更换机器重新安装,但由于项目中依赖了图片处理库 sharp,重新安装过程较为繁琐,因此我决定研究是否可以通过配置代理服务器来解决这一问题。

大致架构如上图所示,用户的请求最终都会经由我的服务器转发至目标服务器,这导致在高频率请求下容易被封禁。
因此,我可以请求代理服务器,甚至构建一个代理池,将请求分散到不同的代理节点上。
既然方案已确定,接下来就开始进行测试。
首先自行尝试实现,同时考察是否有现成的代理服务可用。
代理服务器
Squid
Squid 是一款应用层代理软件,提供缓存加速及应用层过滤功能。
我的服务器可视为客户端,通过 Squid 代理服务器向目标服务器发起请求,主要达到两个目的:
缓存部分请求,避免同一地址在短时间内发起大量重复请求。
隐藏客户端的真实 IP 地址。

阿布云
阿布云是一家提供代理服务的厂商,其 HTTP 隧道功能可将每个请求从随机 IP 转发(每秒最多 5 个,上限 200 个,超出限制将返回 429 错误)。
在 Node.js 中如何配置代理服务器
Axios
若使用 Axios,Node.js 环境中支持 proxy 参数,参照官方文档配置即可。
const axios = require('axios');
// 要访问的目标页面
var targetUrl = "https://www.lilnong.top/cors/sf";
// 配置代理服务器信息
var proxy = {
host: "8.8.8.8", //代理服务器地址
port: 80,//端口
auth: { // auth认证信息,阿布云那边有,squid 的话不需要
username: '',password: ''
}
};
// https://github.com/axios/axios#request-config
axios.get(targetUrl,{proxy:proxy})
.then((response) => console.log(response.data))
.catch((error) => console.log(error))Axios 异常情况
配置代理服务器后,如何解决无法请求 HTTPS 地址的问题?
首先需明确两种情况:
- HTTP 请求可以正常发起。
- HTTPS 请求返回 501 错误。
该问题源于 Axios 的支持机制,有两种解决方法。
使用 axios-https-proxy-fix 版本替代原版 Axios。
使用 tunnel 模块处理隧道连接。
axios('https://www.lilnong.top/cors/sf2',{
proxy: false,
httpsAgent: tunnel.httpsOverHttp({proxy:{
host: '8.8.8.8',//代理服务器域名或者ip
port: 80 //代理服务器端口
}})
})
.then(v=>console.log(jsON.stringify(v.data)))
.catch(v=>console.log(v.message))Request
如果使用的不是 Axios,而是 Request 库,同样可以配置代理。
request({
url:'https://www.lilnong.top/cors/sf3',
proxy: 'http://8.8.8.8:80'//代理服务器地址
// "http://" + proxyUser + ":" + proxyPass + "@" + proxyHost + ":" + proxyPort;
}, function (error, response, body) {
console.log('body:', body);
});Request 异常情况
执行 npm install request 安装失败。
request has been deprecated, see https://github.com/request/request/issues/3142
由于 Request 不再开发新功能,官方不推荐继续使用。
同时因用户基数庞大,兼容性问题复杂,该库已转为维护模式。
此时可尝试使用 cnpm install request 进行安装。
其他测试请求代理服务器的方法
Curl
使用 Curl 可以在服务器上快速验证代理服务器是否生效。
curl -x "http://8.8.8.8:80" https://www.lilnong.top/cors/sf4-x 参数用于设置代理服务器地址,注意 x 为小写。
请勿写错,大写 -X 用于设置请求方式(如 -X POST)。
总结
以上为个人经验分享,希望能提供参考,也希望大家多多支持本站。