NGINX와 웹소켓을 연결해보자

Alex·2024년 12월 19일
0

Plaything

목록 보기
49/118

현재 보안과 관련해서 엔진엑스로 배드봇의 IP를 차단해야 한다는 이슈가 생겼다.

그런데, 엔진엑스를 붙이면 웹소켓과 관련된 설정들을 해줘야 한다.
아직 배포서버에서는 HTTPS를 붙이지 못한 상태라
NGINX 설정이 웹소켓과 잘 호환되는지 확인할 방법이 없다.

그래서, 우선 로컬에 nginx를 설치해서 설정값들이 잘 맞는지 확인해보기로 했다.

NGINX를 설치해보자.

https://nginx.org/en/download.html
여기서 윈도우에서 사용할 nginx를 설치할 수 있다.

stable 윈도우 버전을 다운받고서, 압축을 해제해주고 실행하면 된다.


conf 파일을 보면 80포트로 띄워져 있다.

WebSocket Proxy 로 NGINX 사용하기

이 글을 봤는데 번역체 특유의 느낌 때문에 잘 이해가 안됐다.
원문을 봐보자.

NGINX as a WebSocket Proxy

웹소켓 프로톨은 HTTP 프로토콜과는 다르지만, 웹소켓 핸드쉐이크는 HTTP와 호환된다. 그래서, HTTP Upgrade facility를 이용해서 연결을 HTTP에서 웹소켓으로 변경한다.(처음에 HTTP 요청을 보내고서 핸드쉐이크를 하고 웹소켓으로 업그레이드된다는 뜻으로 보인다)

이를 통해서 웹소켓이 HTTP로 구축된 인프라에서 사용이 될 수 있는데, 예를 들면 80/443 포트를 웹소켓이 쓸 수 있도록 하는것이다(방화벽)

웹소켓은 보통 오랜 시간에 걸쳐 커넥션을 연결해둔다. 이러한 사정으로 인해 리버스 프록시 서버(엔진엑스)가 해결해야 하는 여러 문제들이 있다.

하나는 웹소켓이 hob-by-hop 프로토콜이라는 점이다. 그래서 프록시 서버가 클라이언트로부터 Upgrade request를 가로챌 때, 프록시 서버가 자체적으로 업그레이드 리퀘스트를 백엔드로에 보내줘야 한다.

또한, 웹소켓은 연결이 오래 유지되기 때문에 리버스 프록시는 이러한 연결이 오래 유지될 수 있도록 허용해야 한다.

location /wsapp/ {
    proxy_pass http://wsbackend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;
}

이렇게 설정해주면 된다!

이 내용만 추가해주면 된다.
location 뒤에는 웹소켓의 엔드포인트를 넣어준다.


        location /ws-stomp {
            proxy_pass http://wsbackend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header Host $host;
        }

        # 일반 HTTP API용
            location / {
                proxy_pass http://wsbackend;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
            }



# 설정 파일 문법 체크
nginx -t

# 문법이 정상이면 reload
nginx -s reload

그럼 이제 이렇게 80포트로 보내면 정상적으로 포워딩된다.

근데 이상하게 웹소켓과 stomp로 연결이 안 됐다.

로그를 보면 301응답이 남은 걸 보니 리다이렉션은 된다.

로그를 error 수준에 맞춰서 봐보자
이렇게 설정을 바꿔주면 된다.

이 내용을 보면 기본 설정파일의 소켓번호를 가져오는 거 같은데
이게 유효하지 않은 값인 거 같다.

혹시 설정이 제대로 적용이 안된건가? 싶어서 리로드 방식 말고 아예 NGINX를 껐다 키니까 무사히 잘 작동한다...!

설정을 리로드하지말고 아예 껐다 켜야 하나보다..!

taskkill /F /IM nginx.exe (엔진엑스 끄기)

nginx (엔진엑스 시작)

보완

이 부분은 HTTPS를 적용하고 다시 시도해봤다.

처음에 ws로 요청을 보내니

"Handshake failed due to invalid Upgrade header: null"
이런 로그가 떴다.

이런식으로 설정을 하고 ws 요청을 보내도 작동을 안했다. 여전히 보안에 문제가 있다는 로그가 콘솔에 떠서

이렇게 wss로 보내니 잘 된다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글