개발 당시에는 localhost:3000 의 주소를 이용해서 nodejs socketio 서버랑 통신했었다.

이후 서버에 올리고 포트번호가 아닌 cname 을 통해서 통신하기 위해서 nginx 세팅을 했다.

 

server {
        listen 443 ssl;

        ssl_certificate /etc/letsencrypt/live/my.co.kr/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/my.co.kr/privkey.pem;

        server_name api.my.co.kr;
        access_log /var/log/nginx/my-access.log;
        error_log /var/log/nginx/my-access.log;

        location / {
                proxy_pass https://my.co.kr:3000;
        }
 }

이렇게 api.my.co.kr 을 3000번 포트로 연결해놨다.

그런데 아무리 해도 안되길래 

뭐지? ssl 세팅을 잘못했나? 하면서 삽질을 엄청했다.

그러다 그냥 클라이언트에서 3000번 포트 (https://my.co.kr:3000) 로 연결하니 바로 되길래 nginx 쪽이 문제구나 싶었다.

 

https://socket.io/docs/v3/reverse-proxy/ 

 

검색하니 바로 나오더라

해결방법은

 

server {
        listen 443 ssl;

        ssl_certificate /etc/letsencrypt/live/my.co.kr/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/my.co.kr/privkey.pem;

        server_name api.my.co.kr;
        access_log /var/log/nginx/my-access.log;
        error_log /var/log/nginx/my-access.log;

        location / {
                proxy_pass https://my.co.kr:3000;
        }

		# 아래 부분
        location /socket.io/ {
              proxy_pass https://my.co.kr:3000/socket.io/;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header Host $host;
              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
    }
 }

 

코드 블럭의 아래 location /socket.io 부분을 추가해주면 된다.

 

nginx 로그를 봤을 때 socketio 를 통신하면서 해당 주소의 /socket.io 와 통신해야하는데 이 부분이 문제가 생겨서 그런 듯 하다.

'Dev' 카테고리의 다른 글

[Nginx] 403 forbidden ( 13 : permission denied )  (48) 2021.11.23
[Nginx] 에러 로그 실시간 확인 하기  (51) 2021.11.23
Fail2ban 설치  (47) 2021.06.07
[Raspbian] 라즈베리 파이 VNC 접속하기  (14) 2021.03.17
[Linux] ssh server 자동 실행  (19) 2021.02.16
npm i -g npm-check-updates
ncu -u
npm install

 

알아서 최신 버전으로 업데이트 된다

nodejs express 서버를 로컬에선 오차없이 실행되다가 서버에만 올리면 이상해지길래 timezone 문제라고 생각이 들었다.

 

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

이후 nodejs 재실행하니 제대로 동작했다.

node.js 를 사용한 서버에서 new Date() 로 현재시간을 저장하는 코드가 있었다.

근데 서버를 하나 빌렸더니 외국 어딘가로 돼있어서 시간 저장이 이상하게 되더라...

서버 시간을 바꾸는 법도 있겠지만 가끔 docker 사용시 서버 시간이 외국으로 돼있는 경우도 있기에

그냥 nodejs 에서 처리하기로 생각

 

예전엔 moment.js 를 썼었는데 요새 크기가 너무 커지고 뭐 별로라해서 day.js 사용해봤다.

 

npm install dayjs

 

// node.js

const dayjs = require('dayjs');
const timezone = require('dayjs/plugin/timezone')
const utc = require('dayjs/plugin/utc');

dayjs.extend(utc)
dayjs.extend(timezone)

console.log(dayjs().tz("Asia/Seoul"))
console.log(new Date().toString());

 

root@002b13b84c41:/test# node t.js

// console.log(dayjs().tz("Asia/Seoul"))
d {
  '$L': 'en',
  '$d': 2021-04-13T18:03:55.594Z,
  '$x': { '$timezone': 'Asia/Seoul' },
  '$y': 2021,
  '$M': 3,
  '$D': 13,
  '$W': 2,
  '$H': 9,
  '$m': 3,
  '$s': 55,
  '$ms': 594,
  '$offset': 540,
  '$u': false }
  
// console.log(new Date().toString())
Mon Apr 12 2021 15:03:55 GMT-0900 (Hawaii-Aleutian Daylight Time)

 

하와이-알류샨 시간대에서 현재 한국 시간인 9시 3분을 구할 수 있다

nodejs 에서 즉시 실행 함수로 초기화 하려고 하는데 자꾸 

 

TypeError: {(intermediate value)} is not a function 가 뜬다.

에러 라인도 자꾸 선언한 함수의 라인을 표시하니 내가 뭘 잘 못했지 계속 찾고있는데..

 

해당 함수를 선언 한 윗 코드에 세미콜론을 안붙여서 뜨는 에러였다.

 

let appData = {
    lastUpdatedTime: undefined
} // <------ 여기!

(function async(){
})();

 

 저곳에 세미콜론을 붙여주면 정상작동한다.

 

그런데 왜 이런일이 벌어지는걸까?

 

let appData = {
    lastUpdatedTime: undefined
}(function async(){
})();

이렇게 인식을 하기때문.. 이렇게 생각하니 이해가 가더라.

삽질 끝

 

참조 : stackoverflow.com/questions/42036349/uncaught-typeerror-intermediate-value-is-not-a-function

+ Recent posts