AWS를 이용하여 서버 배포 및 HTTPS를 위해 Certbot으로 인증서 받기(2)
AWS를 이용하여 배포하기는 여러 절로 구성되어 있습니다.
해당글은 직접 경험을 바탕으로 정리한 것을 공유하는 글입니다.
혹시 잘못된 정보거나 부족한 정보에 대해 피드백을 주신다면 감사하겠습니다.
지난 시간에 AWS
를 통해서 EC2
로 가상 환경에 컴퓨터를 만들었고
우린 이 빈 컴퓨터에 서버 구동을 위한 도구들을 설치해 나갈 것이다
우선 EC2
가상환경에 접속을 하고
node.js
로 서버를 구성했기 때문에 node.js
를 설치하겠다
NVM
을 이용하여 Node.js
설치
sudo apt-get update
sudo apt-get install build-essential libssl-dev
curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh -o install_nvm.sh // 한 줄
bash install_nvm.sh
source ~/.profile
nvm --version # nvm 설치 확인
nvm ls-remote # 설치 가능한 버전 리스트를 보고 싶을때
nvm install {version} # node원하는 버전을 설치 예시 - nvm install 14.15.0
node --version # 확인
nvm alias default 버전 # 해당 버전을 default값으로 설정한다
이제 Node.js
가 설치가 완료되었으면 다음으로 nginx
로 웹서버를 돌려서 Certbot
을 이용하여 HTTTPS
를 위한 인증서를 발급 받을 것이다
2. Nginx 설치
sudo apt-get install nginx
/* 참고 사항
systemctl start nginx // nignx 시작 확인
systemctl status nginx // nginx 상태 확인
systemctl stop nginx // nginx 정지
*/
sudo vi /etc/nginx/sites-available/default
아래와 같이 server_name에 DNS
명을 입력하고
location / {} 안에 proxy_pass http://localhost:4000 을 추가해준다
중간에 보이는 root
와 index
값들은 아래처럼 주석처리 해준다
3. Certbot 설치
인증서를 발급 받기 위해 Certbot
을 설치해 준다
Certbot 해당 페이지에 상세한 설명이 나와있다.
위 페이지에 가서 install certbot
을 해준다. 그 후 나오는 페이지에서 우리는 Nginx
로 인증을 받기 때문에
Nginx
와 EC2
환경인 Ubuntu 20.04
를 선택한다.
그럼 설치를 단계별로 알려주는 페이지가 나오는데 그 과정을 살펴보면 snap
을 최신화하고 snap
을 이용하여 certbot
을 설치하여 nginx
를 통해 인증서를 발급 한다는 내용이다
특별한게 없으니 설명대로 따라가자.
snap
을 이용하여certbot
을 설치하기 때문에snap
을 설치 또는 최신버전인지 확인한다
sudo snap install --classic certbot
을 이용하여 설치한다sudo ln -s /snap/bin/certbot /usr/bub/certbot
명령어를 통해 복사해 온다
sudo certbot --nginx
를 이용하여 실행한다.
certbot
이 실행되면 아래와 같은 선택지가 나오는데 다음과 같이 따라하자- 본인의 이메일을 적어 넣자.
- 약관의 동의하는가?
Y
- EFF의 소식을 이메일로 받을 것인가?
N
- 4번째 항목에서는 위에서
nginx
server_name
에 추가한 주소가 나올 것이다. 콤마와 스페이스로 추가할 번호를 적어주자 ex) 1 2
성공적으로 발급이되면 아래와 같이 출력되는데 빨간선으로 SSL인증서
의 pem키
가 생성되니 해당 키를 이용하면 된다.
/etc/letsencrypt/live/DNS명/fullchain.pem
/etc/letsencrypt/live/DNS명/privkey.pem
파란색 선은 인증서의 만료일이니 만료되기 전 갱신하는 것을 잊지 말자.
위에서 발급된 key
를 본인이 작성한 서버에 추가하여 https 프로토콜로 구동해주면 된다
예제 코드는 다음과 같다
const express = require(‘express’); // const는 변수 선언입니다.
const https = require(‘https’);
const http = require(‘http’);
const fs = require(‘fs’);
const options = { // letsencrypt로 받은 인증서 경로를 입력해 줍니다.
ca: fs.readFileSync(‘/etc/letsencrypt/live/[도메인 이름]/fullchain.pem’),
key: fs.readFileSync(‘/etc/letsencrypt/live/[도메인 이름]/privkey.pem’),
cert: fs.readFileSync(‘/etc/letsencrypt/live/[도메인 이름]/cert.pem’)
};
const app = express();
http.createServer(app).listen(80);
https.createServer(options, app).listen(443); // 이 부분이 https서버를 만드는 부분
app.get(‘/’, function(req, res){ // 사이트 접속 시 나오는 내용입니다.
res.send(‘Hello World’);
});
이슈
1. 인증서 접근 에러 이슈
나는 위 모든 작업을 마무리하고 인증서와 서버를 연결할 때 아래와 같은 문제가 발생하였다.
sudo npm start
를 하면 쉽게 해결이 되지만 보안적인 측면으로 좋지 않은 방법이라고 하여 아래와 같이 진행하였다.
/etc/letsencrypt/live/{DNS명}/fullchain.pem
경로로 permission denied 에러가 발생한다면 우분투에 특정group
과user
를 생성하여 접근 권한을 주는 방식으로 해결하였다
stack overflow
에 해당 글을 참고하였다 stackoverflow
// Create group with root and nodeuser as members
$ sudo addgroup nodecert
$ sudo adduser nodeuser
$ sudo adduser nodeuser nodecert
$ sudo adduser root nodecert
// Make the relevant letsencrypt folders owned by said group.
$ sudo chgrp -R nodecert /etc/letsencrypt/live
$ sudo chgrp -R nodecert /etc/letsencrypt/archive
// Allow group to open relevant folders
$ sudo chmod -R 750 /etc/letsencrypt/live
$ sudo chmod -R 750 /etc/letsencrypt/archive
// nodeuser로 사용자 변경
$ su nodeuser
// 사용자 나가기?
$ exit
위 사용자변경 명령어를 입력한뒤 다시 서버를 구동하면 해결될 것이다.
2. 443포트에 접근할 수 없는 에러
위 방법을 해결하니 Error: listen EACCES: permission denied 0.0.0.0:443
이 에러가 발생했다.
찾아보니 위에 user
를 생성하여 해당 사용자 환경에서 서버를 구동하면 root
권한이 아니기 때문에
사용할 수 없다는 것을 알게 되었다.
일반 사용자가 1024 포트
아래의를 사용하기 위해서는, 1024포트
위의 숫자로 서버를 띄우고, 해당 포트로
들어오는 요청을 443 포트
로 리다이렉트 해줌으로써 해결한다
// 포트 확인
// netstat이 설치되어 있지 않다면 설치 명령어가 출력되니 설치하여 사용
$ netstat -ntl
// 포트 상태 확인
$ sudo iptables -t nat -L
// 리다이렉트
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8080
위 명령어를 사용하여 리다이렉트를 해주고 포트 상태 확인 명령어로 리다이렉트가 제대로 설정되었는지 확인한 뒤 기존 서버를 4000 포트 -> 8080 포트
(내 기존 포트는 4000 이었다)로 바꿔 구동하고 다시 nodeuser
로 가서 실행하면 해결된다.
3. nodeuser에 sudo 권한 설정
nodeuser
사용자로 pm2
가 설치 되지 않는 에러가 발생시 아래와 같이 sudo 권한
을 추가하여 진행하였다
// root로 접근
$ su
// 해당 파일에 특정 유저 계정이름이 추가되야 root 권한이 부여
$ vi /etc/sudoers
// 아래 명령어를 찾는다
root ALL=(ALL:ALL) ALL
// 위 명령어 하단에 유저 계정 추가
계정명 ALL=(ALL:ALL) ALL
ex] nodeuser ALL=(ALL:ALL) ALL
4. PM2 설치
PM2
는 우리가 OS를 종료하거나 컴퓨터를 종료하더라도 서버를 계속 유지시키는 process manager
이다
npm install pm2 -g
를 이용하여 설치하자
사용법은 아주 간단하다.
pm2 examples
를 치면 알기 쉬운 여러 예제들이 나오니 참고하여 실행하면 된다
// 서버를 실행할 스크립트를 넣는다
$ pm2 start app.js --name app
// pm2 상태 확인
$ pm2 status
// pm2 시작
$ pm2 start
// pm2 모니터로 로그확인
$ pm2 monit
AWS를 이용하여 배포하기는 여러 절로 구성되어 있습니다.
해당글은 직접 경험을 바탕으로 정리한 것을 공유하는 글입니다.
혹시 잘못된 정보거나 부족한 정보에 대해 피드백을 주신다면 감사하겠습니다.