2016-12-12 5 views
0

https를 통해 HAPROXY와 통신하도록 nodejs 앱을 만들려고합니다. 아이디어는 nodejs가 https를 통해 haproxy에게 메시지를 보내고 haproxy가 메시지를 앞으로 라우팅한다는 것입니다.Node.js 설정 HAPROXY와 함께 작동하는 HTTPS

request.js 라이브러리를 사용했는데 모두 정상적으로 작동했지만 이제는 라이브러리없이이 작업을 수행해야합니다. 시나리오는 다음과 같습니다. 환경 변수가 1 인 경우 HTTP를 사용해야하며 다른 경우에는 -HTTPS를 사용해야합니다. 문제는 https와 haproxy를 사용할 때 "소켓 중단 오류"가 발생하지만 모든 것이 request.js와 잘 작동한다는 것입니다. 여기 내 코드가있다.

const protocol = process.env.NODE_ENV === 1 ? require('http') : require('https'); 

는 내가 구성 HTTPS

this.api = url.parse(app.get('API_HAPROXY')); 
this.options = { 
    port: this.api.port, 
    hostname: this.api.hostname, 
    path: '/api/report', 
    method: 'POST', 
    headers: { 
     "Content-Type": "application/json", 
    }, 
    rejectUnauthorized: false, 
    requestCert: true, 
    agent: false 
}; 

나는이 경우 NODE_TLS_REJECT_UNAUTHORIZED=0

reportData(json) { 
    const req = protocol.request(this.options, (res) => { 
     res.on('error', (err) => { 
      this.logger.error(`Failed to report ${err.message}`) 
     }) 
    }); 
    req.write(JSON.stringify(json)); 
    req.end(); 
    req.on('error', (err) => { 
     this.logger.error(`Failed to report ${err.message}`); 
    }); 
} 

를 사용하여 SSH 키 내가 소켓 끊기 오류 동안 얻을 유효성을 검사하는 CA를 사용하지 않기 때문에 HTTPS 사용

여기 내 요청 구성입니다.

request({ 
    uri: `${this.api}/api/report`, 
    method: 'POST', 
    json, 
}, (err, response) => { 
    if (err || response.statusCode !== 200) { 
     this.logger.error(`Failed to report : ${err ? err.message : response.statusCode}`); 
    } else { 
     this.logger.info(`Report was sent`); 
    } 
}); 
+0

프록시 URL에 포트가 포함되어 있습니까? –

+0

'process.env.NODE_ENV === 1' 나는 env 값이 문자열이기 때문에 언제나 false가 될 것이라고 느낍니다. –

+0

예. 그것은 포함되어 있습니다. 요청에 따라 작동합니다. 문제는 환경에 있지 않습니다. https를 사용하므로 확인했습니다. –

답변

0

content-length 헤더를 options.headers에 추가하여 문제가 해결되었습니다.

this.api = url.parse(app.get('API_HAPROXY')); this.options = { 
port: this.api.port, 
hostname: this.api.hostname, 
path: '/api/report', 
method: 'POST', 
headers: { 
"Content-Type": "application/json", 
"Content-Length: <calculated length of the object you want to send in bytes > 
}, 
rejectUnauthorized: false, 
requestCert: true, 
agent: false 
};