nginx 와 socket.io 연동

nodejs를 이용해 socket.io를 사용하는 경우 보통 포트번호가 다음과 같이 들어가기 마련이다.

somewhere.com:9000

하지만 포트 번호가 노출되는것이 영~ 깨림찍한 경우엔 앞딴에 nginx 나 apache 를 두고 뒷딴의 9000포트로 프록시를 하는 것이 보통이다. 개인적으로는 아파치도 좋치만 nginx를 더 자주쓰고 있다. nginx 를 쓴다면 아래와 같이 설정을 추가한다.

server {
    listen 80;

    root /app/node-server/dist/public;
    index index.html index.htm;

    # Make site accessible from http://localhost/
    server_name somewhere.com;

    location / {

      // A: Proxy 패스를 설정하고 싶은 경우, 
      proxy_set_header Host $http_host;
      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;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://somewhere.com:9000/;
      proxy_redirect off;

      // B: socket.io 사용시 아래설정 필수!!
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_http_version 1.1;

    }
    ... 이후 생략 ...
}

특히 socket.io를 이용하는 경우 B 설정은 필수다. B설정이 뭘해주는지는 솔직히 귀찮아서 찾아보진 않았다. 하지만 저 설정을 하지 않으면 ws:// 프로토콜로 웹소켓과 통신할때 핸드쉐이킹이 제대로 안되서 에러가 난다.