js

express 앱을 aws ec2에 올리는 과정(에러 많음)

발전생 2021. 8. 7. 22:06
sudo apt-get install nginx

aws가 깔린 우분투에 접속해서 위 명령을 치고

인바운드 규칙에서 http(포트 80)을 추가해준다. nginx가 서버 앱에 요청을 할 수 있어야 하기 때문이다.

 

sudo service nginx start

를 하면 nginx가 켜진다.

 

sudo service nginx status

를 통해 잘 켜졌는지 확인이 가능하다.

 

도메인을 통해 오는 모든 요청이 nginx로 가기 때문에 nginx가 express 서버 앱으로 요청을 보내주게 해야한다.

인바운드 규칙에 3000번 포트를 추가해줄 수도 있지만 리버스 프록시와 캐싱을 제공해주는 nginx를 사용하는 게 더 좋다.

cd /etc/nginx/sites-available

sudo rm default
sudo nano default

를 통해 파일을 새로 만들어준 뒤 location을 작성해준다. 이상하게 rm 안 하고 바로 접근하면 저장할 때 에러가 뜨니 삭제 후 새로 생성해주자.

server {
        listen 80;
        listen [::]:80;

        access_log /var/log/nginx/reverse-access.log;
        error_log /var/log/nginx/reverse-error.log;

        location / {
                    proxy_pass http://127.0.0.1:3000;
  }
}

이대로 default에 입력해준다

 

sudo nginx -t

를 통해 잘 되는지 테스트 해볼 수 있다

 

sudo service nginx restart

로 nginx를 재가동시켜준다

 

이제 ec2의 퍼블릭 IP로 접속 시 nginx 웰컴 페이지가 아닌 내가 만든 서버 앱으로 요청이 감을 확인할 수 있다

 

 

 

 

윈도우에서 ubuntu 설치해서 처음으로 aws ec2를 만들고 인바운드 보안규칙까지 추가 후 npm start를 입력했다. 그런데 내가 vercel을 통해 올린 vue에서 아무런 반응이 없다. 브라우저의 개발자 도구를 켜보니

 network error가 뜬다.

그래서 ubuntu에서 npx pm2 log를 입력했더니 

이렇게 소리 없이 에러를 내고 있었다.

pm2가 백그라운드에서 실행된다는데 에러 알림도 백그라운드로구만.

 

 

구글링 해보니 sudo를 앞에 붙이면 된다길래 한번 해보겠다.

전에도 에러 뜰 때 앞에 sudo를 붙였더니 해결되는 경우가 꽤 있었다.

기존에 백그라운드에서 돌던 pm2는 없애줘야 하니까 일단 npx pm2 kill부터 입력해준다. 

 

linux에서 어플리케이션 수행 시에는 1024보다 작은 포트에는 바인딩이 불가능하다고 한다. 웹 서버 포트로 80번을 선택했으니 바인딩이 불가능하지만 예외적으로 루트 사용자 권한이면 가능하다고 한다. 루트 권한으로 접근하려면 앞에 sudo를 붙이면 되는 것이다. 하지만 해봤는데 에러 로그는 안 잡히는데 SPA에서 여전히 데이터를 얻어오지 못 한다.

 

 


80번 포트에 서버 앱을 직접 연결하는 게 버그 때문에 좋지 않은 관행이라는 의견도 있어 nginx를 사용하는 걸로 변경했다.

ec2에 nginx를 깔고 실행했더니 80번 포트에 연결되어있다. 전에는 nginx를 깔지 않았었다.

그리고 express에서 포트번호 3000번으로 연결되게 했다. 그랬더니 전에는 보지 못했던 '3000번 포트에서 대기중'이 떴다. 밑에 port 번호 3306은 데이터베이스인 mysql이 설치되지 않아서 발생한 에러이다. 

그렇다면 nginx가 필요한 이유는 무엇일까? 그리고 서버를 직접 port 80번으로 연결하면 안 되는 이유는 무엇일까?

다음 포스트에서는 이에 대해 공부 후 적어보고자 한다.

 

sudo apt-get install mysql-server

이렇게 mysql을 ec2에 설치해줬다.

 

그 뒤에는 비밀번호를 안 쳤다고 에러가 뜰 것이다.

sudo mysql -u root -p

초기에 비밀번호가 없으니 그냥 엔터를 치면 된다.

그러면 mysql에 접속이 된다.

이제 비밀번호를 설정해야 한다.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new-password';

 

그 다음 mysql을 껐다 켠다

sudo service mysql stop
sudo service mysql start

참고 자료: https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost

 

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

I'm setting up a new server and keep running into this problem. When I try to login to the MySQL database with the root user, I get the error: ERROR 1698 (28000): Access denied for user 'root'@'

stackoverflow.com

 

npx sequelize-cli db:create

를 통해 sequelize의 config.js를 참고해서 데이터베이스가 생성된다.

 

 

 


기존에 80번 포트에 연결되어 있는 nginx를 3000번 포트에 연결된 서버 앱으로 경유하게 설정을 해준다.

cd /etc/nginx/sites-enabled

 default 파일 내용을 바꿔준다

server {
        listen 80;
        listen [::]:80;

        access_log /var/log/nginx/reverse-access.log;
        error_log /var/log/nginx/reverse-error.log;

        location / {
                    proxy_pass http://127.0.0.1:3000;
  }
}

정상 작동하는 지 확인

sudo nginx -t

nginx 재시작

sudo service nginx restart

 

하지만 아직 안 된다.

http로 api 호출은 되지만 https로는 호출이 안 되었다. 

aws ec2에 ssl 인증서가 필요하다. 하지만 알아보니 도메인을 구매해야 하나 보다.

그래서 vue 앱에서 axios api 설정을 https 가 아닌 http로 바꿔보기로 했다.

 

😂

https는 http 응답을 받을 수 없다?

이거 도메인을 사지 않고는 안 되는 건가?

'js' 카테고리의 다른 글

sequelize-auto로 테이블 생성 시 손수 설정해줘야 할 것들  (0) 2021.08.17
sequelize-cli와 sequelize-auto  (0) 2021.08.17
jwt secret key 만들기  (0) 2021.08.12
JWT 파헤치기  (0) 2021.08.12
클릭한 요소의 내용 가져오기  (0) 2021.02.06