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/
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에러가 뜨는걸까요..???
위의 질문들도 궁금하긴 한데
무엇보다 위의 과정들이 왜 에러가 나고 왜 에러가 안나는지
매번 물어볼 수도 없고 혼자 알아내고 싶은데
뭘 공부해야 이런 거 이해할 수 있을까요??
아 ㅠㅠ;
다시해보니깐 그냥 nginx상관없이 pm2멀티코어면 에러가 발생하네요..근데 그래도 본문에서 1번빼고 나머지는 그대로인듯합니다.
링크 아무리 읽어봐도, 관련 내용이 없는데;;
websocket으로 통신하겠다. 선언하는 코드를 넣지 않아도 우선적으로 websocket으로 통신하는데, 왜 저 선언을 해주면 에러가 발생 안하는지 안나와있는 거 같은뎅...;; 내 생각엔 선언 하나 안하나 어차피 websocket으로 우선통신하니까 에러가 안나야 되는데, 왜 websocket쓰겟다고 선언하면 에러가 안나고 websocket쓰겟다고 선언을 안하면 에러가 나는지 이게 궁금함
와씨....gpt이 새끼는 websocket을 우선적으로 쓴다고 해서 그런갑다 햇는데
https://socket.io/docs/v4/client-options/#transports
여기에서는
님 댓글대로 polling부터네....
gpt이제 안믿음
답변 정말 감사합니다. GPT는 믿지 않겟습니다. 감사합니다
지나가는 깃붕이입니다. nginx 에서 proxy 셋업하실때 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connectoin "Upgrade"; 붙여보시기바랍니다.