나의 개발일지(김지헌)
항해 99 62일차 11/19일 본문
오늘은 HTTPS 서버 배포 및 ec2 환경에서 mysql 설치를 했다.
ec2 인스턴스
꼭 서울에서 시작하자
인스턴스 이름을 정하고 우분투 18.04 를 쓸꺼기 때문에 우분투 18.04를 선택한다.
인스턴스 유형을 t2.micro 를 사용 할꺼고 키페어는 새키페어 생성을 눌러서 만들어주자 케피어이름을 만들어주고
RSA와 pem을 선택한다.
그러면 키페어 파일이 다운로드 될껀데 잘 보관 하자
그리고 EC2대시보드 클릭후 우측에 나오는 인스턴스 ID를 눌러주자
누르면 위쪽에 퍼블릭 IPv4 주소가 우리가 쓸 IP주소다.
조금 내려서 보면 보안에 보안그룹이 있을꺼다, 눌러주자
인바운드 규칙 편집 눌러주고 규칙 추가하기 눌러서 다음과 같이 세팅 한다. 그러면 EC2는 세팅이 끝났다.
그리고 우리는 HTTPS를 사용할꺼기 때문에 가비아에서 도메인을 하나 산다.
가비아에서 도메인을 사고 우측상단에 my가비아를 누른뒤 중앙에 도메인을 클릭한다.
우리고 DNS관리툴을 누른뒤
EC2 퍼블릭 IPv4 주소를 값/위치에 넣어주고 저장한다. 그러면 기본 세팅은 끝난거다.
우분투 접속하기
깃 베쉬를 열어준다(여기서는 Ctrl+C , Ctrl +V 즉 복사 및 붙혀넣기는 사용할수가 없다 마우스 우클릭으로 해야한다.)
ssh -i 키페어 ubuntu@퍼블릭 IPV4주소
다음에 나오는건 yes 누르면 된다. 그러면 접속은 완료했다.
방화벽 비활성
sudo ufw disable
시작전에 노드 js와 npm 설치해서 확인하기(위에서 부터 붙혀넣기)
sudo apt-get install curl
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get update
sudo apt-get install -y nodejs
node -v
npm -v
Nginx(중간 중간 용량을 더 사용한다고 나오는데 Y 눌러주면 된다)
sudo apt-get update
sudo apt-get install nginx
// 설치
sudo service nginx start
// 우분투 접속시 자동 실행 설정
sudo systemctl start nginx
// 상태 보기
sudo systemctl status nginx
// 버전 확인
sudo dpkg -l nginx
- SSL 인증서를 무료로 발급해주는 Let’s Encrypt를 사용할 계획입니다.
- Let’s Encyrpt는 Certbot 사용을 권장하고 있습니다.
- 시작하기 전에 ec2 인스턴스 보안탭에서 443번 포트를 IPv4로 열어 주어야 합니다.
- 그리고 포트포워딩을 위해 아래 명령어를 먼저 입력후 진행해주세요.
- 443과 80을 적어준다 뒤에 포트는 EC2에 등록한 포트 번호 적어주자
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3000
위에서 부터 순차적으로 진행
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot
인증서 발급
sudo certbot certonly --manual -d '*.도메인이름' -d 도메인이름 --preferred-challenges dns
ex)
sudo certbot certonly --manual -d '*.HELLO.shop' -d HELLO.shop --preferred-challenges dns
도메인 이름은 가비아에서 산 도메인 적어주면 된다.
입력하고 나면 다음과 같은 화면이 나오는데 이메일을 적어주면 된다.
IP being logged 나오면 Y 눌러주면 아래처럼 나온다.(총 두개의 키가 발급됨)
퍼블릭 IP 넣을떄 처럼 레코드 수정 눌러서 사진 처럼 붙혀 넣어주기 복사한 인증키는 "인증키" 이렇게 써주자
등록 다했으면 저장하고 조금 기다려준다.(3분 정도 기다렸던거 같다)
그리고 우분투에 돌아와서 앤터로 진행하면 아래 사진 처럼 나오면 성공이다.
/etc/letsencrypt/live/내도메인/fullchain.pem
/etc/letsencrypt/live/내도메인/privkey.pem
경로에 인증서를 저장 했다는 뜻
그리고 운영할 APP.JS에 넣어 주면 된다.
const fs = require('fs');
const HTTPS = require('https');
// 운영 환경일때만 적용
if(process.env.NODE_ENV == "production"){
try {
const option = {
ca: fs.readFileSync('/etc/letsencrypt/live/도메인이름/fullchain.pem'),
key: fs.readFileSync('/etc/letsencrypt/live/도메인이름/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/도메인이름/cert.pem')
};
HTTPS.createServer(option, app).listen(3000, () => {
console.log('HTTPS 서버가 실행되었습니다. 포트 :: ' + env.process.PORT);
});
} catch (error) {
console.log('HTTPS 서버가 실행되지 않습니다.');
console.log(error);
}
}else{
app.listen(port, () => {
console.log('HTTP 서버가 실행되었습니다. 포트 :: ' + env.process.PORT);
});
}
타입스크립트로 시퀄라이즈 이용시 사용코드(주석처리는 지우고 사용하면된다)
import express from 'express';
import cors from 'cors';
import cookieParser from 'cookie-parser';
import dotenv from 'dotenv';
import helmet from 'helmet'; //악성 스크립트 보호
import HTTPS from 'https';
import fs from 'fs';
/*
import { sequelize } from './src/database/models/sequlize';
import indexRouter from './src/api/routes/index';
import createData from './src/database/data';
import error from './src/middlewares/errorhandler';
*/
dotenv.config();
const app = express();
const prod: boolean = process.env.NODE_ENV === 'production';
const DOMAIN = process.env.DOMAIN
app.set('port', prod ? process.env.PORT : 3000);
app.use(express.json());
app.use(cookieParser());
/*
app.use('/', indexRouter);
//에러발생시 logger로 넘어옴
app.use(error.errorLogger);
//에러발생시 Handler로 이동
app.use(error.errorHandler);
*/
if (prod) {
app.use(helmet());
app.use(
cors({
origin: '*',
credentials: true,
})
);
try {
const options = {
ca: fs.readFileSync(`/etc/letsencrypt/live/${DOMAIN}/fullchain.pem`),
key: fs.readFileSync(`/etc/letsencrypt/live/${DOMAIN}/privkey.pem`),
cert: fs.readFileSync(`/etc/letsencrypt/live/${DOMAIN}/cert.pem`),
};
HTTPS.createServer(options, app).listen(app.get('port'), async () => {
console.log('https 서버가 실행되었습니다. 포트 :: ' + app.get('port'));
/*
await sequelize //시퀄라이즈 실행 코드
.authenticate()
.then(async () => {
console.log('DB 연결완료');
})
.catch((err) => {
console.log(err);
console.log('DB 연결실패');
});
*/
});
} catch (err) {
console.log('HTTPS 서버가 실행되지 않습니다.');
console.log(err);
}
} else {
app.listen(app.get('port'), async () => {
console.log('HTTPS 서버가 실행되지 않습니다.');
console.log(`${app.get('port')}로 실행중`);
/*
await sequelize
.authenticate()
.then(async () => {
console.log('DB 연결완료');
})
.catch((err) => {
console.log(err);
console.log('DB 연결실패');
});
});
*/
}
서버를 돌렸는데 연결이 실패한다면
permission denied, open '/etc/letsencrypt/live/kimgiheon.shop/fullchain.pem 뜬다면 권한을 읽을수 없기 떄문에 뜨는거같다.
루트계정 전환
sudo -s
입력하기
chmod 755 /etc/letsencrypt/live/
chmod 755 /etc/letsencrypt/archive/
or
chmod -R 755 /etc/letsencrypt/live/
chmod -R 755 /etc/letsencrypt/archive/
이렇게 해서도 안된다면 우분투를 껏다 켜보자
아래의 사이트에서 보고 해결했다
https://github.com/certbot/certbot/issues/5257
Permission denied: Unable to load certificate file · Issue #5257 · certbot/certbot
Hi, This is a small issue with the certbot rpm postscript script in the directories creation /etc/letsencrypt/. Directories archiveand live should be read accessible for any user so any daemon can ...
github.com
우리는 manual로 인증서 TXT로 발급 했기 때문에 3개월마다 갱신 해줘야한다.
당황 하지 말고 새로 발급 받으면 된다.
sudo certbot certonly --manual -d '*.도메인이름' -d 도메인이름 --preferred-challenges dns
다시 실행해서 2번을 눌러준다 갱신 or 재발급
PM2로 실행 하기
원하는 프로젝트 내에서
npm install -D pm2
npx pm2 install typescript
실행하면서 감시해서 자동으로 다시 켜준다
pm2 start app.js --watch
실행중인 파일 보기
pm2 list
실행중인거 다끄기
pm2 kill
실행중인 것 중에 원하는거만 끄기
pm2 delete 0
프로세스 상태 확인
pm2 status
메모리/cpu 사용량 확인한다
pm2 monit
실행중인 PM2 Daemon의 log를 확인하는 명령어
pm2 log
ec2에 mysql 로컬로 접속하기
위에 꺼를 다했다고 가정하고 시작한다.
에러 뜨면 루트계정으로 시작하자
//업데이트
apt-get update
//mysql 설치
sudo apt-get install mysql-server
//버전확인
mysql --version
mysql 사용해보기
외부접속 포트번호 열기
sudo ufw allow mysql
실행하기
sudo systemctl start mysql
서버 껏다 켜질떄 재시작
sudo systemctl enable mysql
접속하기
mysql -u root -p
sudo /usr/bin/mysql -u root -p
Access denied for user 뜨면
sudo -s
//권한주기
mysqladmin -u root -p password '설정할 비밀번호'
//재시작
sudo service mysql restart
재시작후
mysql -u root -p
sudo /usr/bin/mysql -u root -p
한글 설정 해주기
관리자 모드 사용
sudo -s
mysqld.cnf 폴더로 이동
cd /etc/mysql/mysql.conf.d
vi에디터로 파일 실행
vi mysqld.cnf
bind-address 를 0.0.0.0으로 변경
//맨 하단에 다 붙혀넣어주자[]도 똑같이 붙혀주기
[mysql]
default-character-set = utf8
[client]
default-character-set = utf8
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
init_connect=’SET NAMES utf8’
cd를 눌러서 빠져나온뒤
mysql -u root -p
유저를 만들어주고 사용하면 된다.
mysql> create user '사용할이름'@'%' identified by '1234';
mysql> grant all privileges on *.* to 사용할이름@'%';
그래도 Access denied for user 나 password no, password yes가 뜬다면
다시 mysql로 접속해서 다음 명령어를 써보자
//정보확인 해보고
mysql > SELECT User, Host, authentication_string FROM mysql.user;
//권한을 줬는데 또 Access denied for user뜰껀데 비밀번호로 접속이 가능하게 해주자
mysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
root라는 비밀번호로 사용이 가능하다.
mysql > set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');
삭제후 재설치
도저히 "Access denied for user 'root'@'localhost'"뜨고 접속이 불가 할 때
삭제
sudo apt-get remove --purge mysql*
재설치
apt-get install mysql-server --fix-missing --fix-broken
비밀번호 바꾸기
mysql > use mysql
mysql > update user set password=password('비밀번호') where user='사용자'; // 비밀번호 변경
mysql > flush privileges; // 변경사항 적용
권한부여후 업데이트 해주고
mysql > GRANT ALL ON *.* TO '계정'@'localhost' IDENTIFIED BY '비밀번호' WITH GRANT OPTION;
mysql > FLUSH PRIVILEGES;
"Access denied for user 'root'@'localhost'",뜰시
//정보확인 해보고
mysql > SELECT User, Host, authentication_string FROM mysql.user;
//권한을 줬는데 또 Access denied for user뜰껀데 비밀번호로 접속이 가능하게 해주자
mysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
root라는 비밀번호로 사용이 가능하다.
mysql > set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');
pm2 명령어
PM2로 실행 하기
원하는 프로젝트 내에서
npm install -D pm2
npx pm2 install typescript
실행하면서 감시해서 자동으로 다시 켜준다
pm2 start app.js --watch
실행중인 파일 보기
pm2 list
실행중인거 다끄기
pm2 kill
실행중인 것 중에 원하는거만 끄기
pm2 delete 0
프로세스 상태 확인
pm2 status
메모리/cpu 사용량 확인한다
pm2 monit
실행중인 PM2 Daemon의 log를 확인하는 명령어
pm2 log
'항해 99' 카테고리의 다른 글
항해 99 65일차 11/22일 (0) | 2022.11.23 |
---|---|
항해 99 64일차 11/21일 (0) | 2022.11.22 |
항해 99 61일차 11/18일 (0) | 2022.11.19 |
항해 99 60일차 11/17일 (0) | 2022.11.18 |
항해 99 59일차 11/16일 (0) | 2022.11.17 |