AWS?
AWS EC2(Amazon Elastic Compute Cloud)는 클라우드 환경에서 가상 서버를 쉽게 생성하고 관리할 수 있는 서비스입니다. EC2는 사용자가 필요에 따라 컴퓨팅 리소스를 유연하게 사용할 수 있도록 돕습니다. 초기 비용을 절감할 수 있고, 관리 효율성과 확장성을 제공하는 장점이 있습니다.
팀 프로젝트할 때 로컬 환경에서만 작업하다가 클라우드 환경으로 옮겼었는데 엄청 편리해졌습니다..
부트캠프에서 프로젝트할 때 EC2를 지급받는데 시간이 좀 걸렸었는데,
"어? 내 컴퓨터에서는 되는데 왜 님 컴에서는 안됨?"
같은 상황이 많이 발생했습니다. 하지만 EC2를 받고 인프라 세팅을 하고 나서는 그런 일이 발생하지 않았죠.
그러니 ASAP.. 초기 인프라 작업을 ..
기본 Setting
노션에 메모해 놨던 내용들을 복기하면서 적는 거라 스크린샷은 따로 준비해두지 않았습니다. 어차피 CLI 환경이니 크게 상관은 없지만.. 나머지는 프로젝트를 진행하면서 필요하다 싶으면 그때 설정해 주면 됩니다.
pem 파일은 Putty를 사용할 경우에는 따로 ppk파일로 변환해서 접속해야 하지만, MobaXterm을 사용하면 엄청 편리하니 참고하세요. 파일 전송도 MobaXterm이 잘되어있습니다. 다만 Mac 버전은 없습니다 ..
ubuntu 계정 초기 비밀번호 설정
예전부터 곁에서 봐왔던 보안 이슈로 인해 root 계정과 ubuntu 계정의 비밀번호를 제일 먼저 설정하였습니다.
sudo passwd root
-----------------
sudo su -
passwd ubuntu
패키지 업데이트
sudo apt-get -y update && sudo apt-get -y upgrade
시스템 패키지 목록을 최신화하고, 설치된 패키지를 최신 버전으로 업그레이드합니다. y 옵션은 명령 실행 중 발생하는 모든 yes/no 질문에 대해 자동으로 yes 해주는 옵션입니다.
timezone 설정
sudo timedatectl set-timezone Asia/Seoul
로그 기록과 시스템 작업에 중요한 서버 시간 설정. 한국 시간대에 맞게 바꿔줍니다.
우분투 패키지 저장소 변경 : 미러 서버
sudo sed -i 's/ap-northest-2.ec2.archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
기존 패키지 서버를 통해 패키지를 받아도 되긴 하지만, 패키지 업데이트 속도를 높이기 위해 가까운 지역의 패키지 미러 서버를 사용하는 것이 좋습니다.
Swap Memory 설정
여기서 잠깐 스왑 메모리에 대해서 짚고 넘어가겠습니다. 스왑 메모리는 시스템의 물리적 RAM이 부족할 때 임시 저장 공간으로 사용되는 디스크 영역입니다. 스왑 공간을 설정하면 메모리 관리를 더 효율적으로 할 수 있으며, 시스템의 성능과 안정성을 높일 수 있습니다. 프로젝트를 할 때, 배포 환경에서 갑자기 서비스가 터지던 이유 중 하나가 메모리 부족이었습니다. 그걸 이제 스왑 메모리를 통해 방지하는 거죠.
일반적으로는 권장 스왑 메모리는 RAM의 2배라고는 하는데 글쎄요. RAM이 너무 작지 않은 이상 20% 정도로 해도 충분합니다.
sudo fallocate -l 4G /swapfile
먼저 필요한 크기의 스왑 파일을 생성합니다.
sudo chmod 600 /swapfile
권한도 파일 소유자만 읽고 쓸 수 있게 설정합니다.
sudo mkswap /swapfile
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
no label, UUID=9a362582-ec25-488e-8a93-e102ce024999
스왑 파일을 스왑 공간으로 사용하기 위해 초기화합니다.
sudo swapon /swapfile
sudo echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
/swapfile none swap sw 0 0
초기화된 스왑 파일을 활성화하고 시스템에서 사용할 수 있도록 합니다. 추가로, 시스템 재부팅 시 스왑 파일이 자동으로 활성화되도록 설정합니다.
free -h
total used free shared buff/cache available
Mem: 15Gi 773Mi 13Gi 1.0Mi 952Mi 14Gi
Swap: 4.0Gi 0B 4.0Gi
그 후 스왑 메모리가 잘 할당됐는지 확인합니다.
ufw (우분투 방화벽) 포트 설정하기
일단은 제가 사용했었던 EC2는 ssh 22번 포트만 열려있어서 다른 포트를 열어줘야 했습니다.
sudo ufw status
ufw 상태를 확인하는 명령어입니다.
sudo ufw allow 22
사용할 포트를 허용
sudo ufw show added
등록한 포트 조회
sudo ufw enable
ufw 활성화
sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN Anywhere
[ 2] 22 (v6) ALLOW IN Anywhere (v6)
ufw 상태 확인 (번호)
sudo ufw allow 80
80번 포트도 추가합시다.
sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN Anywhere
[ 2] 80 ALLOW IN Anywhere
[ 3] 22 (v6) ALLOW IN Anywhere (v6)
[ 4] 80 (v6) ALLOW IN Anywhere (v6)
추가했으면 삭제하는 법도 알아야겠죠?
$ sudo ufw delete 4
$ sudo ufw delete 2
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN Anywhere
[ 2] 22 (v6) ALLOW IN Anywhere (v6)
sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
삭제는 반드시 enable을 해줘야 적용됩니다.
일단은 기본적인 작업은 끝났습니다. Docker와 Nginx 그리고 Certbot 설정까지만 알려드리겠습니다. 다른 설정들은 프로젝트를 진행하면서 적용하면 되겠습니다.
Docker
Docker 설치
sudo apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
HTTPS를 통한 패키지 다운로드, 인증서 검증, 외부 저장소 관리 기능 등 시스템의 보안과 기능성을 향상하는 데 필수적인 패키지들을 설치합니다.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
Docker 저장소 등록
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Docker 패키지 설치
sudo apt-get -y install docker-ce docker-ce-cli containerd.io
Docker 일반 유저 권한
sudo usermod -aG docker ubuntu
Docker 버전 확인
sudo docker version
Client: Docker Engine - Community
Version: 25.0.4
API version: 1.44
Go version: go1.21.8
Git commit: 1a576c5
Built: Wed Mar 6 16:32:14 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 25.0.4
API version: 1.44 (minimum version 1.24)
Go version: go1.21.8
Git commit: 061aa95
Built: Wed Mar 6 16:32:14 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.28
GitCommit: ae07eda36dd25f8a1b98dfbf587313b99c0190bb
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Docker 디스크 확인
sudo docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 0 0 0B 0B
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
Docker compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 56.7M 100 56.7M 0 0 35.4M 0 0:00:01 0:00:01 --:--:-- 114M
Docker compose 실행 권한
sudo chmod +x /usr/local/bin/docker-compose
Nginx
Nginx 이미지 다운로드
sudo docker pull nginx
Nginx 서버 가동
sudo docker container run --name nginx-container -d -p 80:80 nginx
609dc8741bd1f3d0b62031bcd8897607a6dda411c0363f3759e98f6b91b000d8
sudo docker run -d --restart always -p 80:80 -p 443:443 -e TZ=Asia/Seoul --name nginx -u root nginx:latest
Nginx 작동 확인
sudo docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5ba04a16d43 nginx "/docker-entrypoint.…" 26 seconds ago Up 26 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nginx-container
3da91439788c mysql:8.0.36 "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-container
Nginx 컨테이너 가동 확인
sudo docker container stats nginx-container
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a5ba04a16d43 nginx-container 0.00% 4.5MiB / 15.61GiB 0.03% 726B / 0B 0B / 8.19kB 5
Nginx 서버 작동 확인
Nginx 컨테이너 정지 및 실행
docker stop nginx-container
docker start nginx-container
Nginx Certbot
sudo docker exec -it nginx bash
컨테이너에 Certbot 패키지 설치하기
$ apt-get update
$ apt-get install certbot python3-certbot-nginx
Nginx 설정 파일 수정하기
vim /etc/nginx/conf.d/default.conf
// default.conf
server {
listen 80;
# 수정
server_name 자신의 도메인;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# 이 부분 추가
location /.well-known/acme-challenge/ {
allow all;
root /var/www/certbot;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
$ certbot —-nginx -d 도메인
email
y
y
갱신 테스트
root@e6b4082142ec:/# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/{도메인}.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for {도메인}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/{도메인}/fullchain.pem (success)
인증이 성공적으로 마무리되었다면 기본적으로 암호키는 /etc/letsencrypt/live/도메인/ 아래에 생성되며, 자동 설정을 선택했다면 결과물은 다음과 같습니다.
Processing /etc/letsencrypt/renewal/{도메인}.conf