Node.js axios立柱插座仅在docker中挂起
我有一个服务器,需要10分钟以上才能开始响应请求。我有一个nodejs客户端,它使用axios向该服务器发送post请求。我已将axios超时配置为30分钟 当直接在我的机器上运行代码时,axios会正确地等待响应,10分钟后我会收到200 OK。当相同的脚本在docker中运行时(节点:10 base image),5.5分钟后,我收到一个套接字挂起错误 服务器:Node.js axios立柱插座仅在docker中挂起,node.js,docker,http,request,axios,Node.js,Docker,Http,Request,Axios,我有一个服务器,需要10分钟以上才能开始响应请求。我有一个nodejs客户端,它使用axios向该服务器发送post请求。我已将axios超时配置为30分钟 当直接在我的机器上运行代码时,axios会正确地等待响应,10分钟后我会收到200 OK。当相同的脚本在docker中运行时(节点:10 base image),5.5分钟后,我收到一个套接字挂起错误 服务器: consthttp=require('http')) const server=http.createServer(函数(请求、响
consthttp=require('http'))
const server=http.createServer(函数(请求、响应){
if(request.method==“POST”){
变量体=“”
关于('data',函数(data){
body+=数据
console.log('部分正文:'+正文)
})
request.on('end',function(){
设置超时(()=>{
writeHead(200,{'Content-Type':'text/html'})
response.end('post received')
}, 1000 * 60 * 10);
});
}否则{
writeHead(200,{'Content-Type':'text/plain'});
响应。结束('Ok');
}
})
常数端口=5000
常量主机='10.0.0.50'
服务器设置超时(1000*60*30);
侦听(端口、主机)
log(`在http://${host}:${port}侦听`)
客户:
let axios = require('axios');
async function run () {
const axiosInstance = axios.create({
baseURL: 'http://livedoc.transmissionmedia.ca/',
timeout: (1000 * 60 * 30),
});
axiosInstance.defaults.timeout = (1000 * 60 * 30);
console.log(`${new Date().toISOString()} - start`);
// const resp = await axiosInstance.post(`http://10.0.0.50:5000/weatherforecast`);
const resp = await axiosInstance({
method: 'post',
url: `http://10.0.0.50:5000/weatherforecast`,
timeout: 1000 * 60 * 30
});
// const resp = await axiosInstance.post(`http://10.0.0.50:5000/weatherforecast`);
console.log(`${new Date().toISOString()} - end`);
}
run()
.then(() => { console.error('Succeeded!'); process.exit(0); })
.catch(err => { console.error('Failed!'); console.error(err); process.exit(-1); });
当客户端脚本在docker容器中运行时,我在大约5.5分钟后收到以下错误:
{ Error: socket hang up
at createHangUpError (_http_client.js:332:15)
at Socket.socketOnEnd (_http_client.js:435:23)
at Socket.emit (events.js:203:15)
at endReadableNT (_stream_readable.js:1145:12)
at process._tickCallback (internal/process/next_tick.js:63:19)
code: 'ECONNRESET',
...
}
我不知道这是否是您问题的解决方案,但我遇到了一个套接字挂起问题,API调用仅在docker中,在Google计算引擎上运行 当我直接执行代码时,一切正常,当我在docker中运行相同的代码时,如果有效负载大于某些看似任意但不固定的大小,我会得到套接字挂起错误(ERRCONNRESET) 最后,问题是默认docker网桥网络的MTU与主机网络的MTU不匹配 我还尝试了--network=host,但出现了错误: “无法在根网络命名空间中启用网络的情况下运行:未知” 这显然是其他人从未见过的 最后,我遵循了这里关于如何配置docker bridge网络MTU的建议: “使用命令ip link,您可以显示本地配置的网卡及其MTU:” 如果传出接口(在本例中为ens3)的MTU小于1500,则需要执行某些操作。如果MTU大于或等于1500,则此问题不适用于您 我编辑了我的/etc/docker/daemon.json文件,如下所示:
{
"runtimes": {
"runsc": {
"path": "/usr/bin/runsc"
}
},
"mtu": 1460
}
其中1460是主机网络接口的MTU,问题解决了
希望这对你或其他人有帮助,这让我头疼