2014-09-10 1 views
0

사용자가 파일을 업로드하고 다운로드 할 수있는 웹 응용 프로그램 기능이 있습니다. 익스프레스로 앱을 제공하지만 파일은 다른 서버에 저장되므로 요청을 해당 서버로 프록시 처리합니다. 여기에 request 라이브러리를 사용하여 프록시 코드는 :이 파일을 다운로드를 포함하여, 내 모든 요청에 ​​대해 잘 작동대용량 파일 스트리밍으로 인해 서버가 중단됨

module.exports = function(req, res) { 
    req.headers['x-private-id'] = getId(); 

    var url = rewriteUrl(req.url); 

    var newRequest = request(url, function(error) { 
     if (error) console.log(error); 
    }); 

    req.pipe(newRequest).on('response', function(res) { 
     delete res.headers['x-private-id']; 
    }).pipe(res); 
}; 

. 그러나 파일을 스트리밍 할 때 문제가 발생합니다. 스트리밍을하면 fancybox을 사용하여 video 태그를 사용하여 동영상을 표시한다는 의미입니다. 처음 몇 번 비디오가 잘 표시됩니다.

그러나 fancybox를 닫은 다음 충분한 시간 (구체적으로 5 번) 다시 열면 그 후에 작업이 종료됩니다. 비디오가 더 이상 나타나지 않습니다. Express 서버 전체가 중단되어 더 이상 요청을 처리 할 수 ​​없습니다. 서버를 다시 시작하면 모든 것이 정상입니다. 내게는 프록시 요청의 소켓이 제대로 닫히지 않은 것처럼 보이지만 이유를 알 수 없습니다. 프록시 코드에 문제가 있습니까?

+0

상자를 닫은 후에도 fancybox가 비디오를 백그라운드로 전송하고 있습니까? 브라우저의 디버깅 패널에서 네트워크 요청을 확인하십시오. 또한 URL을 다시 쓸 때 여전히 동일한 서버 호스트 및 포트를 가리 킵니까? – mscdex

+0

처음에는 요청이 아직 열리지 않은 것처럼 보였습니다. 크롬은 그들이 끝났다고 말했다. 그러나 나는 그것이 가능하지 않았을지도 모른다라고 생각한다. 또한 요청이 다른 서버로 프록시되고 있습니다. – GJK

+0

"동일한 서버"는 Express 서버가 아닌 동일한 원격 서버를 의미합니다. – mscdex

답변

1

귀하는 이후 기본값을 request() 설정에 전달 된 pool.maxSockets 값을 증가하거나 필요 5, 또는 request() 설정에 pool: false와 모두 연결 풀링을 거부 노드의 HTTP 에이전트의 maxSockets.

+0

그게 근본 원인을 해결할 것인가 아니면 그냥 덮어 버릴 것입니까? 그 소켓이 닫혀 있어야하고 수영장에 다시 넣어 져야하는 것처럼 보입니다. – GJK

+0

그들은 즉시 닫히지 않습니다, 소켓은 동일한 호스트/포트에 대한 이후의 요청에 대해 http keepalive를 사용합니다. – mscdex

+0

좋습니다. keep-alive time을 줄이는 것이 또한 의미가 있습니까? 또한 수영장 크기를 늘리거나 수영장을 사용하지 않아야합니까? (나는 이전 버전을 생각하고있다.) – GJK

관련 문제