IT/서버

nginx 웹소켓 proxy_pass 및 timeout 설정

thesse 2022. 10. 18. 15:11
300x250
반응형

 

기존 api 로케이션을 아래처럼 설정해뒀다

server{
        listen 80;
        allow all;

        location ~^/api/v1 {
                rewrite ^/api/v1(.*)$ $1 break;

                proxy_pass http://127.0.0.1:7000;
                proxy_redirect  off;

                proxy_set_header   Host                 $host:$server_port;
                proxy_set_header   X-Real-IP            $remote_addr;
                proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
                proxy_set_header   X-Forwarded-Proto    $scheme;
        }
}

 

http://1.1.1.1/api/v1/getUser와 같이 들어온 api 요청을

http://localhost:7000/getUser로 바꿔주는 것이었다.

 

웹소켓을 이와 같이 설정하려고 하니

처음엔 404가 떴다가

location을 잡아주니 403이 떴다가

최종적으로 400이 뜨면서 이런 에러가 떴다.

"Handshake failed due to invalid Upgrade header"

 

헤더에 Upgrade라는 항목을 넣어줘야 하는 것이다.

넣어주고 나면 그다음엔 이런 400 에러가 뜬다

"Handshake failed due to invalid Connection header[close]"

 

헤더에 Connection이란것도 넣어달라는 거다.

 

nginx conf 파일 설정을 아래처럼 하면 성공할 수 있다.

                proxy_set_header   Upgrade              $http_upgrade;
                proxy_set_header   Connection           "upgrade";

 


 

 

+ 로컬에서는 잘 붙어있던 웹소켓이 리눅스에 올려서 하면 1분만에 끊어진다.

알고보니 nginx에서 60초마다 끊어주는 듯하다..

 

CloseStatus code 1006을 띄우면서 정확히 60초만에 커넥션이 끊어진다.

 

1006 코드는 예상치못한 커넥션 종료일때 뜨는거라고 하는데

크롬 등 브라우저에서 끊어지기도 하고(여기도 60초)

AWS 등 클라우드 서버에 로드밸런서가 있을 경우 여기에서 자체적으로 60초마다 끊어준다고도 한다.

 

아무튼 60초 이상 연결을 유지해줄 필요가 있다면 nginx 컨프 파일에 다음 설정도 추가해준다.

 

                proxy_read_timeout 600s;
                proxy_send_timeout 600s;

이러면 서로 통신이 없어도 최대 10분까지는 유지된다.

 

 


 

 

최종적으로 아래처럼 하면 잘됨~

server{
        listen 80;
        allow all;

        location ~^/api/v1 {
                ...
        }
        
        location /websocket {
                proxy_pass http://127.0.0.1:7000;
                proxy_redirect  off;

                proxy_set_header   Upgrade              $http_upgrade;
                proxy_set_header   Connection           "upgrade";

                proxy_read_timeout 86400s;
                proxy_send_timeout 86400s;


        }


}

 

300x250
반응형