Socket.io nginx 설정하기

socket.io nginx 설정

socket.io nginx 설정하는 방법과 내 삽질 기록을 공유하고 한다.

에러내용 확인

socket.io nginx 설정

최근에 계속 서버이전으로 홈서버를 만들고 있는데 이전에는 잘 돌아가던게 이상하게 홈서버에 오면 잘 안돌아간다

그리고 그런건 보통 방화벽이나 port를 안열어 둘 가능성이 높았다.

그래서 이번에 저 오류도 port 문제겠지~ 하고 ufw 설정을 열심히 확인해 본다

sudo ufw status
socket.io nginx 설정

여기서 http를 이용하면 80, https를 이용하면 443은 반드시 열려 있어야 하니

안열려 있다면 이것부터 확인하면 된다.

sudo ufw allow 80
sudo ufw allow 443

근데 나는 이미 되어 있었고 생각해보니 socket.io는 http/https랑 같은 port를 쓰는데 안열려 있을리가 없다고 생각했다.

심지어

curl "서버주소/socket.io/?EIO=4&transport=polling"

위 명령어로 websocket이 아닌 polling 형식으로 넘겨주면 접속이 아주 잘 된다.

socket.io nginx 설정

그래서 뭐가 문제지 하고 머리를 꽁꽁 싸매고 있었는데 지나가는 형이 넌지시 nginx 설정 확인해보라고 했다.

어?!!! 하고 socket.io nginx 설정을 열심히 구글링 하기 시작했다.

socket.io nginx 설정

local과 서버가 다른점을 생각해 보았을 때 그것은 nginx 설정일 경우가 많다.

얼마전까지 reverse proxy 와 ssl 때문에 설정을 건들이고 있었기에 구글링을 하며 찾아보았다.

socket.io nginx 설정을 위해서 /etc/nginx/conf.d 폴더의 default.conf을 건들여 주면 된다.

sudo vi /etc/nginx/conf.d/default.conf

여기서 conf.d 안에 도메인 별로 파일을 만들어서 관리하기도 하지만

나는 일단 default.conf에서 관리 했다.

location /socket.io/ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_read_timeout 600s;
        proxy_pass http://서버 url;

    }

socket.io nginx 설정을 위해 이 부분을 추가해 주기만 하면 된다.

proxy pass는 reverse proxy를 해주는 곳인데 처음에 backend 주소/socket.io로 계속했는데 안됐었다.

당연히 socket.io로 들어왔으니 socket.io로 넘겨주어야 하는지 알았는데

그냥 backend 주소만 적어야 하는 것이었다.

ex) localhost:8080

꼭꼭 주의하자

socket.io nginx 설정 default.conf 전체는 아래와 같다.

server {

        listen 80;
        listen 443 ssl; 
        server_name 자신의 서버 도메인;
        server_tokens off;

    location / {
        proxy_pass http://serverIP:serverPort;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_http_version 1.1;

    }
        location /socket.io/ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_read_timeout 600s;
        proxy_pass http://serverIP:serverPort;    
        }


}

serverIP와 serverPort에는 자신의 것을 넣으면 된다.

나는 실제 서버가 열리는 port와 외부접속 port가 달라 / 루트 부분도 reverse proxy를 해주었지만

똑같거나 localhost 라면 그냥 /socket.io/부분만 추가하면 되겠다.

sudo nginx -s reload

nginx 재시작 해주면 이제 멀쩡하게 접속이 된다.

socket.io nginx 설정 끝!

socket.io nginx 설정 삽질 기록

location / {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://socket_nodes;
    }

처음에는 root로 접속하는 것에 추가해야 할줄 알고

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

이 부분을 /로 들어오는 곳에 추가를 해주었다.

socket.io nginx 설정

그랬더니 이런 warning이 계속 떴다.

socket이 접속이 되긴 하지만 이번에는 서버 자체 docs 에 접속이 안되는 일이 발생했다.

사실 왜 접속이 되었는지는 잘 모르겠다.

location /ws {
        proxy_pass   http://-/ws;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

두번째로는 / 위치가 아닌 /ws 로 들어오는 것을 넘겨주도록 하였었다.

web socket이니 이게 더 맞다는 생각도 들었다

하지만 전혀 되지 않았다.

그리고 오류 메시지를 확인하니 /socket.io/로 넘어올 때가 오류라는 것을 다시 확인했다.

/socket.io 로 들어오는 것을 reverse proxy 해주어야 했던 것이다.

모두 에러메시지를 잘 확인하도록 하자

socket.io 안돼서 답답했는데 일주일만에 해결해서 행복해졌다

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다