express에서 socket.io를 사용중이고 ec2배포해봤습니다.

아래케이스 모두 PM2로 멀티코어로 동작시킨 상태입니다.


1. 

브라우져가 nginx를 안 거치고

3000번 포트로 바로 express에 접근하면,

브라우저에서 에러가 안 납니다.

(이 경우 트래픽 분산은 어떻게 되는 건지도 궁금하긴 합니다..)


2. 

브라우저가 앞단에서 nginx를 거쳐서 express서버에 요청하도록 하면,

ec2 퍼블릭ip에서 80번포트로 오는 걸
ec2 프라이빗ip의 3000번 포트로 오도록 프록시 설정해주고

(인바운드 규칙3000번은 닫고요)

이러면 

에러가 발생합니다.


이거랑

WebSocket connection to 'ws://아이피/socket.io/?EIO=4&transport=websocket&sid=AZZuFpu9Nep7noeUAAAB' failed: WebSocket is closed before the connection is established.

이거랑

POST http://아이피/socket.io/?EIO=4&transport=polling&t=OreNwLL&sid=45dMatSmazO9RRC-AAAI 400 (Bad Request)


이거랑

websocket.js:54 WebSocket connection to 'ws://아이피/socket.io/?EIO=4&transport=websocket&sid=AZZuFpu9Nep7noeUAAAB' failed:

번갈아가면서

에러가 발생합니다.

3. socket.io버전을 2.4.1로 낮추면 에러가 안 납니다.

(왜그럴까요..?)

4.

https://socket.io/docs/v4/pm2/

Usage with PM2 | Socket.IO

PM2 is a production process manager for Node.js applications with a built-in load balancer. It allows you to keep applications alive forever, to reload them without downtime and to facilitate common system admin tasks.

socket.io

여기 확인해보니까,
클라이언트 코드에서
const socket = io({
transports: ["websocket"]
}); 이러면 된다해서 해봣어요.

var socket = io.connect("http://아이피", {

transports: ["websocket"]

});

결과적으로 브라우저에서 400에러가 발생하는 건 사라졌습니다.


5. 여기서 궁금한게,

socket.io가 여러 전송방법 중에 websocket방식을 우선으로 한다고 문서에 나와있는데,

transports: ["websocket"] 이걸 명시적으로 선언해주면 에러가 안 나나요??


transports: ["websocket"]이게 있든 말든 websocket방식이 우선인데,

transports: ["websocket"]이걸 선언안하면,

왜 polling에러가 뜨는걸까요..???




위의 질문들도 궁금하긴 한데 

무엇보다 위의 과정들이 왜 에러가 나고 왜 에러가 안나는지

매번 물어볼 수도 없고 혼자 알아내고 싶은데

뭘 공부해야 이런 거 이해할 수 있을까요??