728x90
nvm(Node version Manager)
- node.js의 버전 관리 매니저로 시스템에 여러 개의 node.js를 설치하고 사용할 버전을 쉽게 전환할 수 있게 도와주는 shell script이다.
- node.js를 설치하고 다른 버전을 설치할 때 삭제하고 다시 설치할 필요없이 버전 관리가 편리하다.
- 원하는 버전을 설치받고 바로 스위치가 가능하다.
도메인을 설정하여 웹 서버를 배포하자(HTTPS)
Ⅰ. AWS에서 인스턴스 생성
- AWS 접속 > EC2 클릭 > 좌측 카테고리에서 인스턴스 선택 > 좌측 상단의 인스턴스 시작 클릭
- 이름 및 태그 - 임의로 인스턴스의 이름을 설정
- 애플리케이션 및 OS 이미지
- Quick Start - Ubuntu
- 프리티어로 설정한다 - 무료로 사용하기 위해서
- 키 페어 - 원하는 키 페어를 선태하거나 새로운 키 페어를 생성한다.
- 키 페어 생성 - 새 키페어 생성 클릭 > 키 페어 이름은 임의의 값으로 입력한다. > 키 페어 유형 RSA > 프라이빗 키 파일 형식 .ppm > 하단의 키 페어 생성 을 클릭하여 키 페어를 생성한다.
- 네트워크 설정 - 좌측 상단의 편집 버튼을 클릭하여 편집을 진행한다.
- 인바운드 보안 그룹 규칙 - 하단의 보안 그룹 규칙 추가 를 클릭하여 보안 그룹을 추가할 수 있는 탭을 열고 새로운 보안 규칙을 추가한다.
- 유형 HTTP / 원본 0.0.0.0/0
- 유형 HTTPS / 원본 0.0.0.0/0
- 유형 MYSQL/Aurora / 원본 0.0.0.0/0
- 유형 사용자 지정 TCP / 원본 0.0.0.0/0 / 포트범위 (연결할 프로젝트가 대기중인 포트번호)
- 인바운드 보안 그룹 규칙 - 하단의 보안 그룹 규칙 추가 를 클릭하여 보안 그룹을 추가할 수 있는 탭을 열고 새로운 보안 규칙을 추가한다.
- 가장 하단의 인스턴스 시작 을 눌러 인스턴스를 생성 및 실행을 시작한다.
Ⅱ. EC2로 인스턴스에 mysql, git프로젝트 등을 연결한다.
✏️ mysql 연결
- 가장 먼저 업데이트를 진행한다.
- sudo apt-get update
- mysql을 설치한다.
- sudo apt-get install mysql-server
- sudo 권한으로 mysql에 접속한다.
- sudo mysql -u root -p
- 접속이 완료되면, 입력 창이 mysql> 로 변경된다.
- mysql에 데이터베이스를 생성한다.
- create database 생성할 데이터베이스 이름;
- mysql에서는 끝에 세미콜론(;)을 찍어줘야 한다.
- create database 생성할 데이터베이스 이름;
- 데이터베이스 목록을 확인한다.
- show databases;
- 데이터베이스에서 사용할 유저를 생성한다.
- create user '유저 이름 '@ '%' 'identified by '사용할 비밀번호';
- 생성한 유저에게 권한을 설정한다.
- grant all on 데이터베이스 이름.(데이터 베이스이름 뒤에 점)* to '유저이름'@'%';
- 해당하는 데이터베이스의 모든 테이블에 접근이 가능하다.
- grant all on 데이터베이스 이름.(데이터 베이스이름 뒤에 점)* to '유저이름'@'%';
- 유저의 권한을 확인한다.
- show grants for '유저 이름';
- mysql의 외부 접속을 허용하기 위해 모든 아이피를 허용하도록 설정을 변경한다.
- 아이피 설정 파일이 있는 폴더에 접근한다.
- sudo /etc/mysql/mysql.conf.d
- 아이피 설정을 할 수 있는 파일을 vi 를 이용하여 열어준다.
- sudo vi mysqld.cnf
- 열린 파일에서 bind-address 목록을 찾아 값을 0.0.0.0으로 수정 후 저장한다.
- 열린 파일에서 목록을 찾기 위해서 마우스 휠이 아닌 키보드 방향키로 움직인다.
- 수정을 진행하기 위해서 i 를 눌러 수정모드로 진입한다.
- 내용을 수정하고 나서 esc를 눌러 수정모드에서 나간다.
- 수정한 내용을 저장하고 mysqld.cnf 파일을 나가기 위해서 :wq!를 입력한다.
- 아이피 설정 파일이 있는 폴더에 접근한다.
Ⅲ. mysql 워크벤치에 새로운 connection을 생성한다.
- 커넥션 생성 팝업에서 name, Hostname, Username, Password 등의 내용을 입력한다.
- name: 임의의 값으로 입력.
- Hostname: aws의 인스턴스에서 "퍼블릭 IPv4 DNS"의 주소를 복사하여 넣는다.
- Username: mysql을 연결하여 생성한 이름을 넣는다. 지금의 경우는 "testadmin"
- Password: 'Store in Vault ...' 을 클릭하여 mysql 생성 후 입력한 비밀번호를 입력해준다. 지금의 경우 "1234"
- 'Test Connection'을 클릭하여 생성가능 여부를 확인하고 'OK'를 눌러 생성한다.
Ⅳ. git 프로젝트를 연결한다.
✏️ git 연결
- 깃을 설치한다.
- git init
- 깃의 레포스토리지를 연결한다.
- git remote add origin 깃 레퍼스토리지 주소 (HTTP)
- 연결한 레포스토리에 등록된 파일들을 내려받는다.
- git pull origin master
- 깃이 올린 내용이 업데이트 되도록 한다.
- sudo apt-get update
- package.json의 모듈을 받기 위해, npm 을 인스톨 한다.
- 첫 번째 시도에서는 인스톨 하지 않아도 npm이 동작했지만, 두 번째 시도에서 npm을 인스톨 받으라고 했기 때문에 설치를 진행하여 npm을 동작하였다.
- sudo apt install npm
- 깃의 package.json에 등록되어 있는 모듈을 내려받는다.
- npm i
- pm2를 설치하여 서버가 끊기지 않도록 백그라운드 환경에서 동작할 수 있도록한다.
- pm2 설치
- npm i pm2
- pm2로 서버를 열도록 package.json 파일을 열어 실행 컨텍스트를 수정
- "start": "pm2 start app.js"
- pm2 설치
Ⅴ. nvm을 설치하여 적용시킨다.
- curl 명령어를 사용하여 num을 설치한다. 해당 명령어를 입력하면 nodejs의 원하는 버전을 설치하고 사용할 수 있다.
- curl: 커맨드 라인에서 URL을 통해 데이터를 전송하고 받는 도구
- -o- 옵션: 다운로드한 내용을 표준 출력으로 보내라는 의미
- curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
- 소스파일을 적용시킨다.
- source ~/.bashrc
- 전체 목록을 확인한다.
- nvm list-remote
- 원하는 node.js의 버전을 선택하여 설치한다.
- nvm install 16(여기에 숫자 버전)
👩🏫
Nginx
- 동시접속 처리에 특화된 웹 서버 프로그램이다.
- 동시접속자(약 700명) 이상이라면 서버를 증설하거나 Nginx 환경을 권장한다고 한다.\
- Nginx를 사용해서 프록시를 설정할 수 있다.
프록시 서버
- 프록시 서버는 클라이언트에서 서버로 접속을 할 때 직접적으로 접속하지 않고 중간에 대신 전달해주는 서버를 의미한다.
- 통신을 할 때 중간에서 대신 통신을 해주는 역할을 수행한다.
- 프록시 서버를 사용하는 가장 큰 이유는 보안이라고 볼 수 있다.
- 서버의 ip주소를 숨길 수 있기 때문이다.
프록시는 위치에 따라 포워드 프록시와 리버스 프록시로 구분된다.
포워드 프록시(forward proxy server)
- 포워드 프록시 서버는 상단의 그림처럼 클라이언트 앞에 놓여있다.
- 클라이언트가 인터넷 웹 서버에 요청을 보내면 중간에서 그 요청을 프록시 서버가 가로챈다.
- 프록시 서버는 해당 요청을 웹 서버에게 다시 보내고 웹 서버에게 받은 응답을 다시 클라이언트에게 전달한다.
사용하는 이유?
- 기업과 기관은 해당 기간에 속한 사람들의 제한적인 인터넷 사용을 위해 방화벽을 사용하는데 이런 제한을 위해 사용
- 기관에 속한 유저가 특정 컨텐츠(사이트 등)에 접근하는 것을 방지하는데 사용한다.
- 프록시 서버를 사용하면 유저의 정체를 숨길 수 있다.
- 프록시 서버를 사용하면 ip를 역추적해도 정체를 파악하기 어려워 익명성을 보장한다.
리버스 프록시(reverse proxy server)
- 프록시 서버가 웹 서버의 앞에 위치한다.
- 클라이언트가 서버에 요청을 보내면 리버스 프록시가 호출되고 리버스 프록시는 서버에게 요청해서 서버의 응답을 받게된다.
사용하는 이유?
- 리버스 프록시 서버는 로드 밸런싱(load balancing)에 사용된다.
- 유명한 웹 사이트는 하루에도 수백만명이 방문한다. 그리고 그러한 대량의 트래픽을 하나의 싱글 서버로 감당해 내기 어렵다.
- 하지만 리버스 프록시 서버를 여러개의 서버 앞에 두면 특정 서버가 과부화 되지 않게 로드밸런싱이 가능하다.
- 리버스 프록시를 사용하면 본래 서버의 IP 주소를 노출시킬 필요가 없다.
- 따라서 해커들의 DDoS 공격과 같은 공격을 막는데 유용하다.
- 대신 CDN과 같은 리버스 프록시 서버가 공격의 타겟이 될 수 있다.
- 따라서 해커들의 DDoS 공격과 같은 공격을 막는데 유용하다.
- 리버스 프록시 서버에는 성능 향상을 위해 캐시 데이터를 저장할 수 있다.
- 만약 어떤 한국에 있는 유저가 미국에 웹서버를 두고 있는 사이트에 접속할때, 리버스 프록시 서버가 한국에 있다고 해봅시다.
- 그러면 한국에 있는 유저는 한국에 있는 리버스 프록시 서버와 통신합니다.
- 따라서 리버스 프록시 서버에 캐싱되어 있는 데이터를 사용할 경우에는 더 빠른 성능을 보여줄수 있는 것입니다.
- 만약 어떤 한국에 있는 유저가 미국에 웹서버를 두고 있는 사이트에 접속할때, 리버스 프록시 서버가 한국에 있다고 해봅시다.
- 마지막으로 SSL 암호화에 좋다.
- 본래 서버가 클라이언트들과 통신을 할때 SSL(or TSL)로 암호화, 복호화를 할 경우 많은 비용이 발생한다.
- 그러나 리버스 프록시를 사용하면 들어오는 요청을 모두 복호화하고 나가는 응답을 암호화해주므로 클라이언트와 안전한 통신을 할수 있으며 본래 서버의 부담을 줄여준다.
Ⅵ. Nginx로 리버스 프록시를 적용시킨다.
- aws 인스턴스에서 nginx를 설치한다.
- sudo apt install nginx
- nginx를 시작한다.
- sudo service nginx start
- nginx의 상태를 확인한다.
- sudo service nginx status
- nginx를 종료한다.
- sudo service nginx stop
- 웹 사이트 호스팅에 대한 설정 값을 변경해야 하므로 해당 설정이 있는 default파일에 접근하여 수정을 진행한다.
- default 파일 접근
- cd /etc/nginx/sites-enabled/
- default 파일 수정하기 위해 열어준다.
- sudo vi default
- 열린 파일을 수정한다.
- try_files 을 찾아 해당 줄을 주석 처리한다. - 코드 앞에 #을 추가하면 주석처리 된다.
- # try_files $uri $uri/ =404;
- 해당 내용을 try_files 아래에 추가해준다.
- proxy_set_header HOST $host;
- 요청이 들어온 브라우저의 host내용을 넘겨준다는 뜻
- proxy_pass http://127.0.0.1:7777(서버가 대기 중인 포트번호 입력);
- proxy_pass 80으로 포트를 듣고 들어온 요청을 7777포트로 전달하겠다는 뜻
- proxy_redirect off;
- SPA일 경우 redirect 없애겠다는 의미. SPA가 아니면 굳이 써줄 필요는 없다.
- SPA는 단일 페이지 어플리케이션을 의미한다.
- SPA일 경우 redirect 없애겠다는 의미. SPA가 아니면 굳이 써줄 필요는 없다.
- proxy_set_header HOST $host;
- 열려있는 default 파일을 저장 후 종료한다.
- :wq!
- try_files 을 찾아 해당 줄을 주석 처리한다. - 코드 앞에 #을 추가하면 주석처리 된다.
- 수정이 완료되었으면 문법적 요류를 체크해 준다.
- sudo nginx -t
- 원래 경로로 이동한다.
- cd /home/ubuntu/
- nginx를 재 실행한다.
- sudo service nginx restart
- default 파일 접근
Ⅶ. 탄력적 IP 주소를 도메인으로 교체하기 위해서 탄력적 IP 주소를 할당한다.
- AWS의 EC2에서 좌측 카테고리의 네트워크 및 보안 > 탄력적 IP > 우측 상단에 탄력적 IP 주소 할당 을 클릭한다.
- 초기 설정 값 그대로 하단의 할당 버튼을 눌러 할당한다.
- 할당 된 IPv4주소 열에서 원하는 IP를 클릭 > 우측 상단에 탄력적 IP 주소 연결
- 인스턴스에서 연결할 인스턴스를 선택 > 프라이빗 IP 주소를 클릭하여 자동으로 뜨는 주소를 넣어준다. > 하단의 연결을 클릭하여 IP 주소를 연결한다.
Ⅷ. AWS의 route 53을 이용하여 도메인 이름을 등록한다.
❗ 먼저, 교체될 도메인이 준비되어 있어야 한다!
- 나는 이번 시간에 "가비아"에서 도메인을 구입하였다.
레코드
- DNS 레코드: 도메인의 이름과 관련된 정보를 나타내는 데이터이다.
- NS(네임서버): 인터넷에서 도메인을 ip 주소로 변환하는 역할을 담당한다.
- 도메인을 입력하면 네임서버에게 도메인 ip주소를 요청해서 웹 사이트에 접근할 수 있도록 한다.
- A 레코드: 도메인 이름을 v4주소로 매핑한다.
- CNAME 레코드: 서브 도메인으로 설정해준다.
- 예. www. testURL.com로 접속했을 때 testURL.com로 이동하게끔 해주는 개념이다.
- AWS 페이지 상단의 검색창에 route 53 검색하여 접속 (추후, 상단 서비스에서 바로 확인할 수 있다.) > 좌측 카테고리에서 호스팅 영역 클릭 > 상단의 호스팅 영역 생성 클릭
- 도메인 이름 영역 - 도메인 사이트에서 구입한 도메인을 입력 (예. testURL.com) > 하단의 호스팅 영역 생성 클릭
- 생성한 도메인 이름을 클릭하면 기본적으로 2개의 레코드가 확인된다. 그 중 NS유형의 값/트래픽 라우팅 대상에 입력되어 있는 값을 도메인 사이트로 이동해서 호스팅의 네임서버로 추가해준다.
- aws에서 값/트래픽 라우팅 대상의 값은 예를 들어 ns-345 sdfjnd-56.net. 등의 값이 있는데 해당 값의 맨 마지막의 점(.)을 제외하고 도메인 사이트에 추가해야 한다.
- 도메인 사이트에서 이용중인 도메인의 관리를 클릭 > 네임서버 탭에서 설정 클릭 > 원래 저장되어 있던 값들은 지우고 aws의 값으로 추가해준다.
- 나의 경우에는 값/트래픽 라우팅 대상의 값이 총 4개가 있었는데 해당 값을 순차적으로 입력해주어야 한다고 들었다.
- aws의 연결을 원하는 도메인을 클릭 > 레코드 탭의 레코드 생성 클릭
- 두 개의 레코드를 등록한다.
- 레코드 유형 - A / 값 - 탄력적 IP 주소 > 하단의 레코드 생성 클릭
- 레코드 이름 - www / 레코드 유형 - CNAME / 값 - 도메인주소 입력(예. testURL.com) > 하단의 레코드 생성 클릭
Ⅸ. HTTPS를 설정하여 보안이슈를 해결한다.
- 도메인 연결에서 이슈가 터져 해당 부분 추후 수정예정
// https로 보안이슈 해결
// 검증된 사이트라는 것이고
// https를 요청할 때 인증서를 발급받아서 인증을 요청하는데
// https설정
// 배포한 서버에 https를 설정해서 보안 이슈를 해결한다.
// 인증서를 발급받을 곳은 무료로 인증서를 3개월짜리 발급받을 것이다.
// 3개월마다 발급을 받으면 무제한으로 무료이용이 가능하다.
// 모질라 라는 곳에서 certbot이라는 친구를 사용해서
// https를 간편하게 설정할 수 있다.
// 3개울마다 우리가 직접 인증서를 재발급 받을 필요가 없이
// 알아서 3개월마다 재발급 받고 우리 메일로 알려준다.
// certbot: nginx랑도 호환이 좋고 간단하게 인증서 발급 갱신이 가능하다.
// https://certbot.eff.org/
// 설명대로 설치를 하자
// sudo snap install core
// sudo snap refresh core
// sudo snap install --classic certbot
// certbot 실행파일에 링크 설정
// sudo ln -s /snap/bin/certbot /usr/bin/certbot
// nginx관련 certbot 실행
// sudo certbot --nginx => 도메인 작성(weeeji.site)
// nginx에 default파일을 수정
// cd /etc/nginx/sites-enabled/에 있는 파일
// location 위에
// server_name 도메인/
// 문법 오류 확인
// sudo nginx -t
// 경로 원래 경로로 가자
// cd /home/ubuntu/
// nginx 재시작
// sudo service nginx restart
// 3깨월마다 재발급 해주는 명령어
// sudo certbot renew
// 인증서 재발급 체크
// 실제로 인증서를 갱신하지 않고 시뮬레이션으로 체크한다.
// 발급할 때 사전에 문제가 생길지 여부를 체크한다.
// sudo certbot renew --dry-run
더보기
- nvm
- Nginx
- 프록시
728x90
'블록체인_9기 > 💚 Node.js' 카테고리의 다른 글
41강_230531_Node.js(호스팅, 클라우드 서비스 모델(Iaas, Paas, SaaS), AWS 배포) (1) | 2023.06.02 |
---|---|
40강_230530_Node.js(multer) (0) | 2023.06.02 |
39강_230526_Node.js(로그인, 회원가입, 게시판 페이지 구현_html로 front 작업) (0) | 2023.06.02 |
38강_230525_Node.js(socket을 이용하여 채팅방 만들기) (0) | 2023.06.02 |
37강_230524_Node.js(web socket, socket.io) (0) | 2023.05.31 |