목표

  1. 하나의 instance에서 react app과 node app을 배포
  2. nginx의 reverse proxy 기능을 활용하여 uri가 /api로 시작하는 경우 node app이 실행 중인 포트 3001로 요청을 넘김

에러

  1. SyntaxError: Cannot use import statement outside a module

    1. 구글링: https://bobbyhadz.com/blog/node-js-unexpected-token-import
    2. 문제: ES6 문법을 node가 실행하지 못하는 문제였음.
    3. 해결: 배포 단계에서 ES5로 전환하는 것은 말도 안 되는 방법이기에 node의 버전을 업데이트 하여 해결
  2. nginx 500 internal server error

    1. 500 error는 반드시 error.log를 읽어봐야 정확한 진단을 할 수 있다.
      • 명령어
  3. ERROR LOG: rewrite or internal redirection cycle

    1. 구글링 (https://serverfault.com/questions/505098/what-does-this-nginx-error-rewrite-or-internal-redirection-cycle-mean)
    2. 문제
      1. nginx가 URL 요청을 받아 실행할 파일을 지정해주는 문법인 try_files에서 무한 loop에 빠지는 것이다.

      2. nginx 문법

        location / {
        		root /home/ubuntu/MaeilMail/client/build;
        		index index.html;
        		try_files $uri $uri/ /index.html;
        }
        
        location /api {
            proxy_pass <http://127.0.0.1:3001>;
        }
        
        1. location: 경로를 파라미터로 받고 서버 url의 오리진 뒷 부분부터 라우팅이 이루어진다.
        2. root: 라우팅 이후 실행할 파일을 찾아 탐색할 경로에 해당한다.
        3. index: 탐색 중에 index 파일로 지정할 파일명을 의미한다.
        4. try_files: 요청 URL의 오리진 뒷 부분 uri를 root 경로 아래에서 탐색한 후 index file를 실행하는 것을 의미한다. 파라미터로 uri 2개를 받으며 해당 파라미터를 root dir 아래에서 발견하지 못하면 index.html을 정적 호스팅하게 된다.
      3. try_files 문법에서 root dir 아래에 uri를 발견하지 못하여 index.html를 실행하였는데 nginx location / 문법으로 다시 들어와버리는 무한 loop가 발생한 것

      4. 해결 방법

        1. root dir 아래에 index.html이 있는지 확실히 확인하기
  4. nginx 404 not found error

    1. 문제: nginx의 라우팅이 실패한 것
      1. 문법 문제: conf 파일에서 문법 문제를 테스트하는 방법으로 nginx -t 명령을 실행해보자
      2. root directory 문제: 실행하고자 하는 react app의 루트를 정확히 발견해야 함. 보통 git clone으로 app을 가져온 경우 /home/ubuntu/… 일 것.
  5. nginx 403 Forbidden

    1. 문제: nginx의 사용자가 빌드 파일에 접근 권한이 없는 경우 발생
    2. 구글링: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=cloverloop&logNo=140208992571
    3. 해결
      1. root 계정이 아닌 ubuntu 계정에 권한을 주어야 한다.
      2. 허가할 계정?
        1. 물론 실행한 클라우드 환경에서의 접속자 계정에 따라 권한을 부여할 계정은 달라진다.
        2. 필자는 aws ec2를 설정할 때 ubuntu를 활용했기에, 인스턴스에 접속하면 자동으로 ubuntu로 접속된다.