// 웹 서비르를 개발하고 완료되면 배포를 해서 사용자에게 소프트웨어를 전달 해야 하는데
// 배포를 하기 위해 필요한게 제 3자가 접속 할 수 있는 서버 컴퓨터가 필요하다.
// 365일 내내 24시간 켜져 있어야 하는데
// 서버 컴퓨터를 대여해주는 호스팅 업체를 통해 배포를 진행한다.
// 호스팅에는 두가지로 나뉘는데 (서버 호스팅)(웹 호스팅)
// 서버 호스팅은 : 무리 서버를 단독으로 임대 및 구매
// 웹 호스팅: 서버의 일부 공간을 임대하는 개념 (컴퓨터를 잘게 쪼갠 거라고 보면 됨)
// 웹 호스팅의 장점 서버나 인프라 구축이 필요없고 비용이 저렴하다는 장점
// 단점은 웹 호스팅은 자원이 한정적 단독 서버에 비해 사용량이 제한적이라는 단점
// 웹 호스팅 업체중 하나인 AWS 통해서 서버를 배포 할 것
// IaaS: 컴퓨터 자원만 제공하는 형태 (AWS) Infrastructure as a service
// PaaS: 헤로쿠 등 넷플리파이 등등 기존 환경에서 서비스를 올려주는 형태
// 인스턴스 만들기 전에 오른쪽 상단에 리전 확인 서버컴퓨터 가깝게 설정
// 인스턴스의 사용 운영체제 선택 => ubuntu 프리티어
// 키페어 잘 보관 해놓자 혹시나 전달해야 할 경우 저장매체 사용 USB 등
// ssh TCP 프로토콜 포트 범위 22 기본으로 가지고 있는 디폴트 포트라고 생각하면된다.
// 인스턴스에 접근을 하기 위해서
// 보안 그룹 설정 HTTP,HTTPS,MYSQL
// 업데이트
// sudo apt-get update
// sudo apt-get install mysql-server
// 데이터 베이스 세팅
// 우리가 사용할 데이터 베이스 하나 만들어보자
// 쿼리문 그대로 사용해서 만들자
// CREATE database 이름;
// 데이터 베이스 확인
// show databases;
// 데이터 베이스를 사용할 때 우리가 사용할 유저를 만들어주자
// 사용할 유저 생성
// CREATE USER 이름 @% identified by 비밀번호
// CREATE USER 'root'@'%' IDENTIFIED BY 'q1w2e3R$';
// 권한 설정
// GRANT ALL ON 데이터베이스 이름. TO 유저이름@%
// GRANT ALL ON zero. TO 'root'@'%';
// 권환 확인
// SHOW GRANTS FOR 유저이름;
// 외부애서 인스턴스의 mysql에 접속을 해보자
// sudo service mysql restart
// 보안 그룹에 mysql을 허용 해놓고 이미.
// mysql 외부 접근 허용
// sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf;
// 파일을 열고 i 눌러서 수정모드 진입
// esc풀고
// :wq! :저장후 종료
// :q! 종료
// :w! 강제 저장
// 프로젝트 설치 받자
// git에 올린 프로젝트를 설치
// 포트 포워딩을 해서 80 http로 접속 했을 때 8080포트로 재 매핑 시켜주자
// sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000;
// 포트 포워딩 확인 명령어
// sudo iptables -t nat -L --line-numbers
// 포트 포워딩 삭제 명령어
// sudo iptables -t nat -D PREROUTING 인덱스 번호
// 그리고 서버대기가 종료 되는데
// 백그라운드에서 서버를 대기시켜서 계속 동작하게
// pm2 설치
// npm i pm2
// pacakge.json 부분에서 실행 스크립트 명령어를 node app.js로 실행했을 텐데
// pm2 start app.js로 수정
// 서버가 종료되어도 백그라운드에서 노드 서버 실행
// 서버 종료는 npx pm2 kill:종료
// 리스트 확인 npx pm2 list:리스트
// 오늘은 도메인이랑 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
// 인스턴스에 v4주소는 우리가 인스턴스를 실행하거나 다시 실행하면
// 동적으로 ip주소가 할당 된다.
// 예)ec2-13-125-251-30.ap-northeast-2.compute.amazonaws.com
// 도메인을 연결을 이 v4로 연결 해 놓았는데
// 이 주소가 바뀌면 연결이 끊기겠죠?...
// 그러면 안되니까.. 탄력적 ip를 설정을 하면 고정 아이피를 할당 받을 수 있다.
// Nginx를 사용해서 프록시 설정
// 프록시는 말 그대로 대신
// 통신을 할 때 중간에서 대신 통신을 해주는 역할을 해준다.
// 중계역할을 해주는 것이 프록시 서버
// 클라이언트와 서버 사이에 중계 서버
// 클라이언트는 프록시 서버를 서버로 알고있다.
// 서버는 프록시 서버를 클라이언트라고 알고있다.
// 서버의 위치에 따라서 포워드 프록시 리버스 프록시로 구분되는데
// 리버스 프록시는 프록시 서버가 서버의 앞에 위치하고 클라이언트가 서버에 요청을 하면
// 리버스 프록시가 호출되고 리버스 프록시는 서버에게 요청해서 응답을 받고 클라이언트한테 전송
// 클라이언트가 서버에 직접 요청하느느게 아니고 프록시 서버가 요청을 받고 서버로 요청해서
// 서버의 응답을 받게된다.(서버를 감춰준다==== 보안 좋음)
// Nginx를 사용해서 리버스 프록시를 만들어 보자.
// 클라이언트 => 인터넷=>프록시 서버=> 서버
// 서버 => 프록시 서버=> 인터넷=>클라이언트
// aws 인스턴스 접속하고
// nginx설치
// 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 http://127.0.0.1:8080;
// proxy_redirect off;
// }
// proxy_set_header 부분은 요청이 들어온 브라우저의 host내용을 넘겨준다는 뜻
// proxy_pass 80으로 포트를 듣고 들어온 요청을 8080포트로 전달하겠다는 뜻
// proxy_redirect off는 SPA일 경우 redirect 없애겠다는 위미 spa가 아니면 굳이 써줄 필요는 없다.
// spa 싱글페이지 어플리케이션만!
// 설정파일을 수정했으면
// 설정 파일이 정상적인지 확인을 먼저 해주자
// 문법에 오류가 있는지 체크
// sudo nginx -t
// 이제 재실행
// sudo service nginx restart
// 탄력적 ip주소를 도메인으로 교체하자.
// 가비아에서 도메인을 구입해서 사용할 예정
// 이 도메인을 사용해서 탄력적 아이피로 요청이 갈 수 있게
// aws Route 53을 사용할 것
// 호스팅영역 클릭해서 도메인 입력한 후에 호스팅 영역 생성
// 상세정보를 보면 레코드
// DNS레코드는 도메인의 이름과 관련된 정보를 나타내는 데이터
// NS(Name Server)는 인터넷에서 도메인을 ip주소로 변환하는 역할을 담당
// 도메인을 입력하면 NS에게 도메인 ip주소를 요청한다.
// 그래서 웹사이트에 접근을 할 수 있게 해준다.
// 레코드 추가
// A레코드 : 도메인 이름을 v4주소로 매핑
// A레코드에 탄력적 아이피를 값으로 작성
// CNAME 레코드: 서브 도메인으로 설정
// www.'도메인' 으로 접속 했을 때 '도메인' 으로 이동하게 해줌
// https 로 보안이슈 해결
// 검증된 사이트라는 것이고
// https요청할 때 인증서를 발급받아서 인증을 요청을 하는데
// https 설정
// 배포한 서버에 https를 설정해서 보안 이슈를 해결
// 인증서를 발급받을곳은 무료로 인증서를 3개월짜리를 발급해주는 곳이 있는데
// 3개월마다 재발급받아서 무제한으로 무료 이용
// 모질라라는 곳에서
// certboot이라는 친구를 사용해서 https를 간편하게 설정 할 수 있다.
// 3개월마다 우리가 직접 인증서를 재발급 받을 필요가 없이
// 알아서 3개월마다 재발급 받고 우리 메일로 알려줌.
// nginx랑도 호환이 되는 갓 라이브러리=>간단하게 인증서 발급 및 갱신이 가능하다.
// sudo snap install core
// certboot 실행파일에 링크 설정
// sudo ln -s /snap/bin/certboot/user/bin/certboot
// nginx관련 certboot 실행
// sudo certbot --nginx
// nginx에 default파일을 수정
// default파일에 있다!
// 수정을 한 뒤 server_name 도메인;
// 다시 home/ubuntu로 돌아가서
// 문법 오류 확인
// 3개월 마다 재발급을 해야하나?...
// sudo certbot renew <= 입력시 3개월마다 재발급됨
// 인증서 재발급 신청 시뮬레이션 돌려보기
// sudo certbot renew --dry-run