aws elb를 이용한 django channels 웹소켓 https 적용시 웹소켓 적용 안되는 문제 해결 방법.
let`s encrypt를 사용 하던 중 aws - acm을 elb에 적용하도록 바꾸는 일이 생겼다. 그런데 websocket이 붙질 않는다. 왜그럴까?
aws-acm을 이용하여 elb에 https를 적용 하고 nginx에서 http로 들어온 요청을 https로 리다이렉트 시켰을때 django channels의 웹 소켓의 connection 이 안되는 문제
로드 밸런스의 종류에 따라 해결 방법이 다르다.
Classic Load Balancer
로드 밸런서의 리스너에 HTTPS 를 SSL로 바꾸어 주어야 한다. 그리고 nginx에서의 HTTP요청에 대한 리다이렉트를 해준다.
HTTP는 TCP로 바꾸면 안된다.
if ($http_x_forwarded_proto = "http") {
return 307 https://$host$request_uri;
}
사실 이전에 쓰던 코드는
if ($http_x_forwarded_proto != "https") {
return 307 https://$host$request_uri;
}
인데 TCP 통신까지 모두 리다이렉트 시키는 바람에(추정) 무한 리다이렉션이 걸려 페이지가 뜨지 않음.
Application Load Balancer
Application Load Balancer는 WebSockets에 대한 기본 지원을 제공한다. HTTP 및 HTTPS 리스너 모두에서 WebSockets를 사용할 수 있다.
이 말은 Classic Load Balancer에서 HTTPS를 SSL로 바꾼 작업을 하지 않아도 로드밸런서가 알아서 처리 해준다는 말인것 같다.
그래서 단순히 HTTP/HTTPS설정만 하고 nginx는 Classis Load Balancer와 동일하다.
로드 밸런서의 헬스체크
로드 밸런서의 상태 검사에서 Ping을 HTTP:8000 /health-check로 수정하고 nginx에 로드밸런서 헬스체크용 포트를 지정한다.
server {
listen 8000;
server_name ...
...
location /health-check {
access_log off;
return 200;
}}
server {
listen 80;
...
더 좋은 방법이 있을것 같다.
참고
출처 : 삵(sarc.io)
Comments