-1

ELB가 SSL을 사용하도록 구성된 80 및 443을 열도록 ELB를 구성했습니다. 두 ELB 포트 모두 인스턴스의 80 포트를 가리 킵니다. ELB의 히트 체크는 ping 대상 HTTP : 80/index.html을 사용하고 있습니다. 최근에 http를 https로 리디렉션하기로 결정하기 전까지는 작동하지 않았습니다.AWS 뒤의 NodeJS ELB에서 http를 https로 리디렉션하지 못했습니다. 상태 확인에 실패했습니다.

이제 다음 코드는 server.js에있는 (내 새로 추가 된 코드가된다 // 내 코드) :

// 
app.use(function(req, res, next) { 
    if (config.env === 'prod' && req.get('X-Forwarded-Proto') !== 'https') { 
     console.log("redirecting") 
     console.log('https://' + req.get('Host') + req.url) 
     res.set('X-Forwarded-Proto', 'https'); 
     res.redirect('https://' + req.get('Host') + req.url); 
    } 
    else 
     next(); 
}); 
// 

app.use(express.static(path.join(__dirname, 'home'))); 
app.set('trust proxy'); // enable this to trust the proxy 

app.listen(app.get('port'), function() { 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

app.get("/*", function(req, res, next) { 
    res.sendFile(path.join(__dirname, 'home/index.html')); 
}); 

내가 위의 요청이 ELB 서버에 있지만 HTTPS를 모든 요청을 리디렉션합니다 가정 실험 계획안.

그러나 서버 시작 인쇄 :

redirecting 
https://10.x.x.xx/index.html 

그리고 다음 ELB가 https://10.x.x.xx/inde.html으로 실패하는 것은 사용할 수 없습니다.

그러나 {domain}/아래의 index.html 위치.

리디렉션 방식이 잘못되었을 수 있다고 생각합니다. 그러나 문제를 해결할 방법이 없습니다.

답변

0

로드 밸런서 상태 검사 요청에는 x-forwarded-proto 헤더가 없으므로 클라이언트에서 전달되지 않았으므로로드 밸런서에서 직접 전달됩니다. 리디렉션을 수행하기 전에 먼저 헤더가 먼저 있는지 확인해야합니다.

또한 SSL 설정에 대해 다소 혼란 스럽습니다. Load Balancer에서 SSL 종료를 수행하고 있지만 EC2 서버에서 SSL 인증서를 제공 중입니까? "두 ELB 포트 모두 인스턴스 80 포트를 가리 킵니다."라는 말은 EC2 서버에서 SSL 인증서를 제공하지 않는다는 의미이므로 상태 확인 URL은 https 대신 http이어야합니다.

또한 당신이 바로 리디렉션하기 전에이이 라인은 아무 것도 수행하지 :

res.set('X-Forwarded-Proto', 'https'); 
+0

나는이 같은 헤더 모든 요청을 설정합니다 생각? 이 헤더가없는 요청 만이이 줄에 들어갈 수 있습니까? – jamesdeath123

+0

SSL과 관련하여 - 현재 http : // {domain} 및 https : // {domain} 모두 작동합니다. 단지 http : {도메인}이 보호 기능을 가지지 않을 것입니다. SSL은 결국 ELB에서 이루어지며 결국 EC2의 포트 80에 대한 모든 요청을 처리하게됩니다. – jamesdeath123

+0

'x-forwarded-proto' 헤더의 전체적인 점은로드 밸런서가이를 설정하게하는 것입니다. 왜 그것을 서버에서 오버라이드하고 싶습니까? 리다이렉트를 발행하기 직전에 요청에 설정하면 요청을 버리기 때문에 아무 것도 수행하지 못합니다. –

1

내 솔루션 전에 리디렉션에 건강 API 경로를 확인하는 것이 었습니다./API에 대한 AWS 부하 분산에

  1. 설정 상태 검사/건강
  2. 추가 조건

if (config.env === 'prod' && req.get('X-Forwarded-Proto') !== 'https' && req.url !== '/api/health') { // redirect }