2023. 1. 23. 22:28ㆍBackend/python
0. 배포를 위한 기초 지식
1) 클라우드 서비스
- 웹 서비스를 런칭하기 위해서는 클라이언트의 요청에 항상 응답해줄 수 있는 서버에 프로젝트를 실행시켜야 한다.
- AWS 클라우드 서비스에서 항상 켜놓을 수 있는 컴퓨터인 EC2 사용권을 구입해 서버로 사용할 수 있다.
클라우드 환경을 사용하는 이유
- 컴퓨터가 항상 켜져있고 프로그램이 실행되어 있어야 한다.
- 모두가 접근할 수 있는 공개 주소인 공개 IP 주소 (Public IP Adress)로 내 프로젝트에 접근할 수 있어야 한다.
2) IP 주소와 포트
IP 주소
- 접속하는 컴퓨터는 숫자로 되어있는 IP 주소가 붙어있다.
- 인터넷 위에서 컴퓨터가 통신할 수 있도록 컴퓨터마다 가지는 고유한 주소로, 각 서버는 하나의 주소를 가지고 있다.
- 접속을 용이하게 하기 위해 IP 주소를 읽기 편한 도메인으로 매칭할 수 있다.
포트
- 하나의 IP에는 여러 포트가 있다.
- 한 포트에 하나의 프로그램을 실행시킬 수 있다.
1. EC2 서버 구매하기
1. AWS 접속
- [접속하기] 👈🏻 AWS 접속
- Seoul Region으로 들어간다.
2. 인스턴스 생성
인스턴스 이름 입력
키 페어 생성 클릭
![](https://velog.velcdn.com/images/e_juhee/post/c2d4d27c-fb5d-405a-9f6c-d3a96d337ae5/image.png)
- 키페어 생성을 완료하면 자동으로 키페어 파일이 다운로드 된다.
- 👇🏻 인스턴스 생성 완!
2. EC2 접속하기
1) EC2 접속 - Keypair의 접근 권한 변경
- 터미널에서 진행한다.
- 2에서 받은 내 Keypair의 접근 권한을 바꿔준다.
sudo chmod 400 키페어
2에서 다운로드된 파일을 터미널창에 끌어다 놓으면 자동으로 키페어 경로가 입력된다.
)
2) EC2 접속 - SSH로 접속
ssh -i 키페어 ubuntu@내아이피
- 인스턴스 목록에서 IPv4 주소를 확인할 수 있다..
![](https://velog.velcdn.com/images/e_juhee/post/37ecbf57-2067-4b3f-9100-8ca3b4de7a96/image.png)
Key fingerprint 관련 메시지가 나오면 yes를 입력한다.
EC2 원격 접속 성공!
3. 서버 설정하기
1) FileZilla 다운로드
[FileZilla] 👈🏻 접속
가장 왼쪽에 있는 에디션 다운로드!
2) 파일질라 설정
Site Manager 클릭
New site > 내용 입력 > Connect > OK
업로드할 파일을 드래그로 이동시킨다.
왼쪽이 내 컴퓨터, 오른쪽이 원격 접속한 EC2 인스턴스이다.
3) 업로드한 파일 실행
python이라는 명령어로 3 버전 이상을 실행한다.
sudo apt install python-is-python3
home 디렉토리로 이동해서 업로드한 파일을 실행하면 해당 파일의 코드가 실행되는 것을 콘솔창에서 확인할 수 있다.
cd ~ python hello.py
4. 서버 실행하기
1) pip를 설치한다.
# pip3 설치
sudo apt update
sudo apt install -y python3-pip
# 버전 확인
pip --version
2) flask를 설치한다.
pip install flask
3) flask 실행 파일을 생성한다.
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'This is Home!'
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
4) 3의 파일을 파일질라에서 EC2로 업로드한다.
5) 3의 파일을 실행한다.
app.py
를 실행시키면 flask가 실행된다.
python app.py
5. 포트 열어주기
- 서버가 실행되었지만, AWS에서 포트 번호를 막고 있기 때문에 아직 해당 IP로 접속해도 오류가 발생한다.
- EC2에서 5000 포트로 들어오는 요청을 받을 수 있게 설정해야 한다.
- AWS EC2 Security Group에서 요청 포트를 열어준다.
1) 보안 그룹으로 접속한다.
EC2 상세 > 보안 탭 > > 보안그룹(Security Group) 클릭
인바운드 규칙 편집
포트를 추가한다.
5000 포트: flask 기본 포트
80 포트: HTTP 접속을 위한 기본 포트
27017 포트: 외부에서 mongoDB에 접속하기 위한 포트
ip 주소로 접속 성공..!
6. DB 설정하기
1) mongoDB를 설치한다.
- EC2 터미널에서 아래 명령어를 차례대로 입력한다.
위치는 상관 없음!
curl -sS https://pgp.mongodb.com/server-6.0.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/mongodb-6.0.gpg
echo "deb \[ arch=amd64,arm64 \] [https://repo.mongodb.org/apt/ubuntu](https://repo.mongodb.org/apt/ubuntu) jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt update
sudo apt install -y mongodb-org
2) mongoDB를 실행한다.
- 아래 명령어를 입력했을 때 아무 반응이 없으면 잘 실행된 것이다.
(리눅스는 보통 잘 실행이 되면 응답이 없다.) sudo service mongod start
3) mongoDB 접속 계정 생성하기
아이디/비밀번호를 설정하지 않으면 누구나 DB의 정보를 볼 수 있게 된다.
접속에 필요한 아이디와 비밀번호를 생성한다.mongoDB 쉘에 들어간다.
mongosh
admin으로 계정을 변경한다.
use admin;
계정을 생성한다.
db.createUser({user: "test", pwd: "test", roles:["root"]});
mongoDB 쉘에서 나오고 mongoDB를 재시작한다.
exit sudo service mongod restart
pymongo에서 DB에 접근할 때에도 계정 정보를 추가해야 한다.
app.py
# client = MongoClient('mongodb://설정한아이디:비밀번호@내AWS아이피',27017)
client = MongoClient('mongodb://test:test@3.38.244.139', 27017)
4) mongoDB 외부에 열어주기
- mongoDB는 기본적으로 같은 IP 안에서만 접속을 허용하고 있어, 외부에서 접근이 가능하도록 잠금을 풀어줘야 한다.
- 리눅스 자체 에디터인 vim을 이용한다.
sudo vi /etc/mongod.conf
vi: 리눅스에서 VS Code 대신 사용하는 텍스트에디터인 Vim을 실행
=> "관리자 권한으로 /etc 폴더 아래 mongod.conf 파일을 Vim으로 켜줘!"라는 뜻입니다
- 입력 모드로 전환하고, bindIp와 security를 수정한다.
# 입력 모드 전환 i
- 에디터를 종료하고 mongoDB를 재시작한다.
# 내용 저장 및 에디터 종료. esc를 누르고 입력한다. :wq
재시작
sudo service mongod restart
5) Studio 3T로 내 컴퓨터에서 EC2 서버에 있는 mongoDB에 원격으로 접속하기
Studio 3T 접속 > Connection > New Connection > Next
Server에 ec2
ip주소
입력Authentication 탭에서 생성한
계정 정보
입력연결 완!
7. 패키지 설치 및 실행
- 파일질라에서 프로젝트의
app.py. templates 폴더, static 폴더
를 모두 EC2에 업로드한다. - 사용하는 패키지를 설치한다.
pip install requests beautifulsoup4 pymongo
- 실행한다.
python app.py
- 접속이 잘 되는지 확인 ㄱㄱ
http://ip주소:5000/
8. 포트 포워딩
- http에서는 80번 포트가 기본이기 때문에 :80을 붙이지 않아도 된다.
- 포트 번호를 입력하지 않고 접속할 수 있도록 80 포트로 오는 요청을 5000 포트로 전달시켜야 한다.
- 리눅스에서 기본으로 제공해주는 포트포워딩을 사용한다.
- 포트포워딩 룰을 입력한다.
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000
- 프로젝트를 다시 실행하고 :5000을 뺀 주소
http://IP주소
로 접속해본다. python app.py
9. nohub 설정
1) nohub 설정하기
- 지금은 SSH 접속을 끊으면(터미널을 종료하면) 프로세스가 종료되면서 서버도 끊긴다.
- 원격 접속을 종료해도 서버가 계속 돌아가게 설정한다.
nohup python app.py &
2) 서버 종료시키는 방법
서버를 강제로 종료하려면 pid로 프로세스를 죽여야 한다.
pid(프로세스 번호) 확인
ps -ef | grep 'app.py'
프로세스 강제 종료
kill -9 [pid값]
10. 도메인 연결
1) 도메인 구매
- [가비아]에서 원하는 도메인을 구매한다.
2) 도메인 연결
[My가비아] 👈🏻 접속해서 이용 중인 서비스가 +1 되었는지 확인한다.
(반영되는 데 시간이 10분 정도 걸릴 수 있다.)DNS 관리툴로 접속한다.
구매한 도메인 [설정] 클릭
DNS 설정 [레코드 수정]
호스트: @, 값/위치: IP주소
입력IP주소와 도메인으로 모두 다 접속이 잘 되는지 확인한다.
(네임서버에 도메인과 IP주소가 매칭되는 데 시간이 10분 정도 걸릴 수 있다.)
배포 끝🥰
'Backend > python' 카테고리의 다른 글
[python] Flask로 서버 실행하기 (0) | 2023.01.22 |
---|---|
[python] python으로 MongoDB 연결하기 : MongoDB, pymongo, Studio 3T (0) | 2023.01.22 |
[python] beautifulsoup4 Web Scraping, 웹 스크래핑 (0) | 2023.01.22 |