// AWS EC 배포하기
// 1. EC2 ubuntu로 인스턴스 // AWS 페이지에 로그인하고 서비스탭 옆에 EC2 검색 // EC2 클라우드 가상서버 클릭
// 오른쪽 상단에 아이디 옆에 지역 : 최대한 가깝게 // 한국이 안될때 거의 일본 씀 : 먼지역하면 시간 오래걸림 // 인스턴스 클릭 해서 인스턴스 창으로 이동 // 실행중인 인스턴스 있으면 중지 시키기, 종료는 인스턴스 삭제시키기임
// 인스턴스 시작 클릭 // 인스턴스 이름 작성 // 아래 애플리케이션 및 OS 이미지 => ubuntu 클릭 // 인스턴스 유형 : 프리티어 사용 가능 확인 // 키 페어(로그인) => 새 키 페어 생성 // 키페어는 절대 노출 금지 // 카톡, 메시지로 저장하지말고 이동시에 저장매체에 담아서 옮기는게 보안에 좋다. // 키페어 이름 작성 // 키페어 생성 // 다운로드된 pem 파일 사용할 app.js에 옮겨줌
// 인스턴스 시작 , 다시 인스턴스창 진입 // 인스턴스에서 실행중 확인
// 연결 방법 // 1. 인스턴스 들어가서 위에 연결 클릭 // EC2 인스턴스 연결 > 연결 -> 서버 컴퓨터로 들어가짐
// 2. ssh클라이언트에서 아래 예 복사 // ssh -i "mykey.pem" ubuntu@ec2-3-38-165-236.ap-northeast-2.compute.amazonaws.com // vs code 터미널 경로 pem과 맞춰주기 // vs code 터미널에 붙여넣기
// 인스턴스 ubuntu에 mysql 설치 // ubuntu 서버 업데이트 -> mysql-server 설치 // ubuntu 서버 업데이트 명령어 : sudo apt-get update // mysql-server 설치 명령어 : sudo apt-get install mysql-server
// EC2 ubuntu mysql 접속 // sudo mysql -u root -p // 비밀번호 입력창 뜨면 안쓰고 그냥 엔터
// 데이터베이스 세팅 - mysql접속한 터미널 사용 // 1. 사용할 데이터베이스 하나 만들기 // create database 데이터베이스이름; // create database testdb; // 확인 : show databases;
// 이 데이터베이스를 사용해야하니까 유저를 만들어서 사용하자 // 접속할때 유저 정보가 있어야 접속이 가능하니까 // 사용할 유저 생성 // create user '유저이름'@'%' identified by '비밀번호'; // create user 'admin'@'%' identified by 'admin123!';
// 만든 유저에게 데이터 베이스 권한을 주기 // grant all on 데이터베이스이름.* to '유저이름'@'%'; // grant all on testdb.* to 'admin'@'%';
// 권한 주어졌는지 확인 // show grants for '유저이름'%'; // show grants for 'test';
// 외부에서 접속 하기 // 인스턴스 페이지 // 하단에 보안 클릭 , 보안그룹 클릭
// 인바운드 규칙 : 네트워크에 들어오는 정보 // 클라이언트에서 서버로 향하는것
// 아웃바운드 규칙 : 네트워크에서 나가는 정보 // 클라이언트에서 요청을 하고 서버에서 클라이언트로 다시 보내주는것
// 인바운드 규칙편집, 규칙추가 // HTTP, HTTPS , MYSQL/Aurora 소스유형 IPv4
// 사용자 정의 8080 포트를 열어서 확인하기도한다.
HTTP 80
MYSQL 3306
SSH 22
HTTPS 443 // 아웃바운드에도 똑같이 3개 추가
// 보안그룹 규칙설정 끝낸후 우리가 EC2에 설치한 MYSQL 접속 허용 설정하기 // 터미널 새로 열기 (ubuntu 접속) // mysql 파일들어가서 수정해줘야함 // sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf; // 수정모드는 i 눌러서 들어가기 // 이 파일에서 수정할 부분은 bind-address의 127.0.0.1 부분을 0.0.0.0으로 설정 // 방향키로 내리다 보면 나옴 // 바꾸고 esc누르고 :wq // :wq! 저장후 종료 // :q! 종료 // :w! 강제 저장
// mysql 서버 재실행 // sudo service mysql restart
// 로컬에 워크벤치 켜고 // connection 추가 // name 암거나 쓰고 // hostname : 만들었던 ec2다시 들어가서 퍼블릭 IPv4 DNS 주소 입력 // port는 3306 // username : 아까 허용 설정해줬던 아이디 // password : store in vault 누르고 아까 설정한 비밀번호
// 프로젝트 올라가있는 github접속 // 본인이 올릴 프로젝트를 깃허브에 올리고 // config.js 잘 확인하고 데이터베이스 이름과 비밀번호 유저 이름을
// .env 파일 조정
// ex
SESSION_KEY=mysessionKey DATABASE_USERNAME=admin DATABASE_PASSWORD=admin123! DATABASE_NAME=testdb DATABASE_HOST=127.0.0.1 ACCESS_TOKEN_KEY=myaccessToken // EC2 ubuntu에 설치한 mysql의 접속 옵션과 동일하게 바꿔준다. // 인스턴스 터미널에 git init 하고 // git remote add origin 깃저장소주소
// userid : 깃허브 아이디 // 비밀번호 : 깃허브 personal access token 만들고 이거 복사해서 붙여넣기
// 서버 pc에 풀 땡긴거라 서버에 들어가있음 // ls -a : 서버에 뭐가 들어가있는지 확인
// nodejs를 설치 // sudo apt-get update // sudo apt-get install -y build-essential // sudo apt-get install curl // curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -- // sudo apt-get install -y nodejs
깃설치
sudo apt install git
git --version
// curl : 서버에서 서버로 통신을 요청하도록 할수 있게함 // node 버전 확인 node -v // npm 버전 확인 npm -v
// npm i 로 모듈들 설치 // npm start
// 프로젝트 포트번호를 3000 번으로 설정해놨음 => 인스턴스는 80번 포트로 설정되있음 // 80번을 열어놔도 3000번을 연것처럼 포트 포워딩 필요
// http 80, https 443 포트 // sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
// 인스턴스에서 퍼블릭 IPv4 주소 복사에서 주소창에 붙여넣으면 서버연결 성공
1 차적인 기능 도메인 탄력적 ip를 사용하지않은 기준
// 오늘은 도메인이랑 https 설정까지 진행할예정 Nginx
// nvm 노드 버전 매니저
// nodejs 설치하고 다른버전으로 설치할때
// 삭제하고 다시설치할필요없이
// 버전관리가 편하다.
// 원하는 버전을 설치받고 바로 스위치 가능
// curl -o- <https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh>
// curl -o- <https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh> | bash
// 소스 파일 적용
// source ~/.bashrc
// 전체 목록 확인
// nvm list-remote
// 원하는 버전을 선택하고 설치
// nvm install 16(여기에 숫자 버전)
npm i
npm i pm2
인스턴스 보안설정
인바운드설정 사용자정의 8080 포트 오픈 0.0.0.0
ipv4 dns 복사:8080/login
// 인스턴스에 v4 주소는 우리가 인스턴스를 실행하거나 다시 실행하면
// 동적으로 ip 주소가 할당된다.
// 예)ec2-3-39-233-103.ap-northeast-2.compute.amazonaws.com
// 도메인을 연결을 이v4로 해놓았는데
// 이주소가 바뀌면 연결이 끊긴다
// 그러면안되니까.. 탄력적 ip를 설정을 하면 고정 아이피를 할당받을수있다.
// 왼쪽 네비게이션바에 네트워크및 보안
// 탄력적 ip할당을 받을수있다.
// 할당을 받으면 인스턴스와 연결이 가능하다. 이 ip는 껐다 켜도 변하지않는다.
// Nginnx 를 사용해서 프록시 설정
// 프록시는 말그대로 대신 무엇을 대신하는가?
// 통신할때 중간에서 대신 통신을 해주는 역할을 해준다
// 중계역활을 해주는것이 프록시 서버
// 클라이언트와 서버 사이의 중계서버
// 클라이언트는 프록시 서버를 서버로 알고있다.
// 서버는 프록시 서버를 클라이언트라고알고있다.
// 서버의 위치에 따라 포워드 프록시 리버스 프록시로 구분되는데
// 리버스 프록시는 서버가 서버의 앞에 위치하고 클라이언트가 서버에 요청을하면
// 리버스 프록시가 호출되고 리버스 프록시는 서버에게 요청을해서 응답을 받고 클라이언트한테 전송
// 클라이언트가 서버에 직접 요청하는게 아니고 프록시 서버가 요청을 받고 서버로 요청해서
// 서버의 응답을 받게된다
// Nginx를 사용해서 리버스 프록시 만들어보자.
// 클라이언트 -> 인터넷 -> 프록시 서버-> 서버
// 서버-> 프록시서버 -> 인터넷 -> 클라이언트
// aws인스턴스 접속하고
// nignx설치
// sudo apt install nginx
// nginx 시작
// sudo service nginx start
// nginx 상태확인
// sudo service nginx status
// nginx 종료
// sudo service nginx stop
// 웹사이트 호스팅을 할때 설정에대한값이
//default 파일이 생성이 됩니다.
// cd/etc/nginx/sites-enabled
// default파일은 가상호스트파일
//
// 파일 안에 로케이션안에
// location / {
// # First attempt to serve request as file, then
// # as directory, then fall back to displaying a 404.
// #try_files $uri $uri/ =404;
// proxy_set_header HOST $host;
// proxy_pass ;
// proxy_redirect off; 리액트나 뷰쓰면 off다
// }
// proxy_set_heade 부분은 요청이 들어온 브라우저의 host내용을 넘겨준다는듰
// proxy_pass 80으로 포트를 듣고 들어온 요청을 8080포트로 전달하겠다는뜻
// proxy_redirect off; 는 SPA일 경우 redirect 없애겠다는 의미 SPA가 아니면 굳이 써줄필요는없다
// SPA 싱글페이이지 어플리케이션 react vue등
// 설정파일을 수정했으면
// 설정파일이 정상적인지 확인을 먼저해주자.
// 문법에 오류가 있는지 체크.
// sudo nginx -t
// 성공적이라면 test is successful 이라는 문구를 띄어준다.
// 원래경로로 돌아가기
// cd /home/ubuntu
// nginx 재실행
// sudo service nginx restart
// 탄력적 ip주소를 도메인으로 교체하자.
// 가비아에서 도메인을 구입해서 사용할예정
// <https://www.gabia.com/>
// 이도멘인을 사용해서 탄력적 아이피로 요청이 갈수있게
// aws Route 53 을검색 호스팅영역 클릭 영역생성 도메인이름에 가비아에서 가져온거 붙여놓기
// 호스팅역역클릭
// 도메인 입력후에 호스팅영역 생성
// 상세정보를 보면 레코드
// DNS 레코드는 도메인의 이름과 관련된 정보를 나타내는 데이터
// 유형 NS 는 네임서버라는것이다. 인터넷에서 도메인을 아이피주소로 변환하는 역할을담당한다
// 도메인을 입력하면 네임서버에게 도메인 ip주소를 요청한다.
// 그래서 웹사이트에 접근을 할수있게해준다.
// 받은 네임서버를 가비아에 가서 도메인 관리에 네임서버 설정에 기존의 것을 지우고 바꾼다.
// 레코드 추가
// A 레코드: 도메인 이름을 v4주소로 매핑
// A 레코드에 탄력적 아이피를 값으로 작성 (기존의 것을 지우고)
// 레코드 하나 더만들어서 서브도메인을 추가하게된다
// 유형은 CNAME 값은 도메인으로 해준다. 이름앞에 www 를 붙여준다.
// www.jeonhyunwook.co.kr로 접속했을때 처으멩 했던 주소로 가게해주는것
// 물론 난 jeonghyunwook.store 이다.
// https 로 보안이슈 해결
// 검증된 사이트라는 것이고
// https요청할때 인증서를 발급받아서 인증을 요청을하는데
// https 설정
// 배포한 서버에 https을 설정해서 보안이슈를 해결
// 인증서를 발급받을곳은 무료로 인증서를 3개월짜리를 발급해주즌곳이있는데
// 3개월마다 재발급받아서 무제한으로 무료 이용
// 모질라라는곳에서
// certboot이라는 친구를 사용해서
// https를 간편하게 설정할수있다.
// 3개월마다 우리가 직접인증서를 재발급 받을필요가없이
// 알아서 3개월마다 재발급 받고 우리 메일로알려줌.
// certboot nginx랑도 호환이 좋다. 간단하게 인증서 발급 갱신이 가능하다.
// <https://certbot.eff.org/>
// 이사이트가 가정 정확하게 알려준다.
// 설명대로 해본다 .
//sudo snap install core
//sudo snap refresh core
// sudo snap install --classic certbot
// sudo snap install --classic certbot
// certbot 실행파일에 링크 설정
// sudo ln -s/snap/bin/certbot /usr/bin/certbot
// nginx 관련 certbot 실행
// sudo certbot --nginx
// nginx에 default파일을 수정
// cd /etc/nginx/sites-enabled/에 있는 파일
// server_name 도메인; 이렇게 수정을 한뒤
// 도메인 이를 테면 jeonhyunwook.store ㅇ
// 저장후 종료
// 다시 경로로 돌아가서 cd /home/ubuntu/
// 문법 오류 확인
// sudo nginx -t
// nginx 재시작
// sudo service nginx restart
// 3개월마다 재발급 해줘야하나?
// 3개월마다 재발급 해주게 명령어
// sudo certbot renew
// 인증서 재발급 체크
// 실제로 인증서를 갱신하지않고 시뮬레이션으로 체크
// 방글합때 사전에 문제가 생길지 여뷰를 체크
// sudo certbot renew --dry-run
// sudo certbot renew --dry-run
nginx를 실행했을때 나오게된다.
ubuntu@ip-172-31-43-102:~$ sudo certbot --nginx Saving debug log to /var/log/letsencrypt/letsencrypt.log Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): gusdnr205@gmail.com
Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must agree in order to register with the ACME server. Do you agree?
(Y)es/(N)o: y 핵심
Would you be willing, once your first certificate is successfully issued, to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom.
(Y)es/(N)o: y 핵심 Account registered. Please enter the domain name(s) you would like on your certificate (comma and/or space separated) (Enter 'c' to cancel): c 이때 도메인 이름입력해야한다. Please specify --domains, or --installer that will help in domain names autodiscovery, or --cert-name for an existing certificate name. Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details. ubuntu@ip-172-31-43-102:~$ sudo certbot --nginx Saving debug log to /var/log/letsencrypt/letsencrypt.log Please enter the domain name(s) you would like on your certificate (comma and/or space separated) (Enter 'c' to cancel): jeonghyunwook.store 그래서 다시 입력하는과정
Requesting a certificate for jeonghyunwook.store
ubuntu@ip-172-31-43-102:~$ sudo nginx -t nginx: [warn] conflicting server name "jeonghyunwook.store" on 0.0.0.0:80, ignored nginx: [warn] conflicting server name "jeonghyunwook.store" on [::]:80, ignored nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
문법 검사 시에 괜찮다고하는데 실제로 괜찮은지? 는 의문
pm2가 깔려있지않다면 pm2를 설치해야하며
npm start로 시작된 pm2 는 npx pm2 kill 로 종료 할수있다.
만약 도메인이 작동하는데 정상적으로 실행이되지않는다면 코드 상의 문제일가능성이 높다.
이경우 node app.js로 직접파일을 실행해서 테스트해봄이 바람직하다.