Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EC2 instance 생성 후 할 것들 #56

Open
why-arong opened this issue May 7, 2024 · 1 comment
Open

EC2 instance 생성 후 할 것들 #56

why-arong opened this issue May 7, 2024 · 1 comment
Assignees
Labels
documentation Improvements or additions to documentation

Comments

@why-arong
Copy link
Collaborator

why-arong commented May 7, 2024

요즘 인스턴스를 삭제했다 만들고 할 일이 많더라구요..

그래서 만들 때마다 일관되게 작업을 하려고 글로 남겨두려 합니다.

ec2 인스턴스에 어떤 작업을 했고 왜 그렇게 했는 지에 대해 작성했습니다.

초기에 설치할 것들

sudo apt update
sudo apt install python3-venv 

ubuntu instance에는 git, python은 설치되어 있으니 생략하고, 저희는 가상환경 쓸거라 pip은 따로 설치하지 않아도 됩니다.

파이썬 가상환경

일단은 가상환경을 ~(home dir)에 만들기로 해요.

python3 -m venv loro
source ~/loro/bin/activate

git clone & pip install

forked 말고 upstream을 가져온다고 가정

git clone https://github.com/kookmin-sw/capstone-2024-08.git
cd capstone-2024-08/backend
pip install -r requirements.txt
  • 파이썬 패키지는 11GB 정도 되는 것 같아요.
  • 설치 전 df -h 해보고 루트 파일 시스템이 이보다 작으면 에러 나니 주의

pip 추가 설치

sudo apt install espeak
sudo apt install ffmpeg

build monotonic align

python setup.py build_ext --inplace

리버스 프록시 사용 - Nginx

현재 저희 uvicorn 서버는 인스턴스 내 8000번 포트에서 실행되고 있는데요.

http 요청(80번 포트를 사용)을 이 서버로 보내기 위해서는 80포트로 들어오는 요청을 8000포트로 전달할 필요가 있어요.

그 역할을 위해서 nginx를 사용하게 되었습니다. 아직 포트 전달 용도로 밖에 사용하지 않고 있고 추후에 ssl 암호화, 캐싱 기능도 추가할 예정이에요.

(80포트에 대한 보안그룹 설정은 지원님이 이미 만들어 주셨음)

나중에 문제가 있을 때 확인 용도로 현재 ec2 instance에 어떤 작업을 했는 지 적어볼게요.

1. Nginx 설치

먼저, EC2 인스턴스에 Nginx를 설치

sudo apt update
sudo apt install nginx -y

2. Nginx 설정 파일 편집

일단 어떻게 했는 지 적으면

sudo vim /etc/nginx/sites-available/loro

다음과 같이 작성

server {
    listen 80;  # <- 80 포트에서 오는 거에 대해서
    server_name {우리 ec2 ip addr} # <- 서버 이름이 요러면

    location / { # <- '/'니까 모든 요청 URL에 이 블록의 설정을 실행해줘! 라는 뜻
        proxy_pass http://127.0.0.1:8000;  # <- local의 8000포트로 전달해줘!
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

그 후 /etc/nginx/sites-available/loro 에 심볼릭 링크 걸기

sudo ln -s /etc/nginx/sites-available/loro /etc/nginx/sites-enabled/

우리 주소 이름이 너무 길어서 설정파일에서 버킷 사이즈를 늘려줘야 함

sudo vim /etc/nginx/nginx.conf
http {
    ...
    server_names_hash_bucket_size 128; <- 주석처리 해제하고 64 -> 128로 변경
    ...
}

(optional) 문제가 있는 지 확인

sudo nginx -t

설정을 적용하기 위해 Nginx를 재시작

sudo systemctl restart nginx

그럼 끗

이렇게 한 이유

원래 nginx의 주 설정파일은 /etc/nginx/nginx.conf 인데요. 기본적으로 nginx가 사용자가 설정은 어떻게 했지?? 그러면 이 파일을 봐요.

근데! 여기를 직접 건드리지는 않을거고 /etc/nginx/sites-available 을 수정하고 /etc/nginx/sites-enabled/ 에 심볼릭 링크를 걸었어요.

왜냐! 그게 유지보수하기 좋거든요. 뭐 모듈화 한다 생각하면 될 듯.

물론 nginx가 /etc/nginx/sites-enabled/ 를 보도록 이렇게 해줘야 해요. (기본적으로 되어 있음)

http {
	...
	include /etc/nginx/sites-enabled/*;
	...
}

서버 실행은 현재 저희 /backend 디렉토리 main.py를 실행시키면 localhost 8000번 포트에서 실행시키도록 되어 있어요.

실행: python3 main.py

# main.py
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

추가로 고려할 것

나중에 Let's Encrypt 같은 걸 써서 https 를 지원할 수도 있고 캐싱도 고려할 수 있을 것 같아요.

근데! 고건 나중에 ㅎ

GPU instance 의 경우

nvidia gpu가 있는 서울용 인스턴스는 g4dn.xlarge 입니다.

voice conversion을 위해 사용할 knnvc는 cuda로 작성되어 있는데,

이 코드 실행을 위해서는 추가로 이 인스턴스에 nvidia driver를 설치해야 합니다.

드라이버 버전 확인 및 설치

사용 가능한 NVIDIA 드라이버 버전을 확인을 해주고

apt search nvidia-driver

저는 여기서 nvidia-driver-535 를 사용할거에요.

sudo apt install nvidia-driver-535

무조건!!!!! 리부팅 해줘야 함.

이거 안했다가 왜 안되는거지 하면서 몇시간 날림 아오 진짜

sudo reboot

잘 설치 되었나?

nvidia-smi

위 명령어 쳤을 때, 이쁜 표가 나오면 된 거에요. 설치 제대로 안되면 드라이버가 없다고 빨간 줄로 쳐다봄

@why-arong why-arong added the documentation Improvements or additions to documentation label May 7, 2024
@why-arong why-arong self-assigned this May 7, 2024
@Shin-MG
Copy link
Collaborator

Shin-MG commented May 7, 2024

오 대박 완전 정리 잘해주셨네요 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

2 participants