누구나 내 서비스를 사용할수 있게 하기위해 배포작업 필요함.
웹 서비스 런칭을 위해, 클라이언트의 요청에 항상 응답해 줄 수 있는 서버에 프로젝트를 실행시킬 것이다.
언제나 요청에 응답하려면,
1) 컴퓨터가 항상 켜져있고 프로그램이 실행되어 있어야하고,
2) 모두가 접근할 수 있는 공개 주소인 공개 IP 주소(Public IP Address)로 나의 웹 서비스에 접근할 수 있도록 해야함.
외부 접속이 가능하게 설정한 다음, 내 컴퓨터를 서버로 사용할 수도 있음.
AWS 라는 클라우드 서비스에서 편하게 서버를 관리하기 위해, 항상 켜 놓을 수 있는 컴퓨터인 EC2 사용권을 구입해 서버로 사용할 예정
IP 주소
- 컴퓨터가 통신할 수 있도록 컴퓨터마다 가지는 고유한 주소.
- 네트워크가 가능한 모든 기기가 통신할 수 있도록 가지고 있는 특수한 번호이다.
- 서버는 하나의 주소를 가지고 있음.
포트(port)
- 하나의 IP에 여러 포트가 있다.
- 하나의 포트에 하나의 프로그램을 실행 시킬 수 있음.
EC2 콘솔페이지
https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2
키페어 만든적이 없기 때문에 새 키 페어 설정하라는 안내 뜸.
키 페어?
우리가 인스턴스를 구매해 그 컴퓨터를 조작하고, 설치하고, 실행할텐데 그때 그 컴퓨터에 원격접속 할수 있는 키.
- AWS에서도 안찾아주기 때문에 잘 보관하고 있어야함.
키페어 생성 > 인스턴스 시작
1) 터미널 열기
2) 방금 받은 내 Keypair의 접근 권한 바꿔주기
sudo chmod 400 받은키페어를끌어다놓기
3) SSH로 접속하기
ssh -i 받은키페어를끌어다놓기 ubuntu@AWS_인스턴스_퍼블릭IPv4주소
중간에 yes 입력해주면 아래처럼 터미널창 뜸.
ubuntu@ ~ 시작되어야 원격접속 된 상태!
[가장 많이쓰는 몇가지 명령어]
ls: 내 위치의 모든 파일을 보여준다.
pwd: 내 위치(폴더의 경로)를 알려준다.
mkdir: 내 위치 아래에 폴더를 하나 만든다.
cd [갈 곳]: 나를 [갈 곳] 폴더로 이동시킨다.
cd .. : 나를 상위 폴더로 이동시킨다.
cp -r [복사할 것] [붙여넣기 할 것]: 복사 붙여넣기
rm -rf [지울 것]: 지우기
sudo [실행 할 명령어]: 명령어를 관리자 권한으로 실행한다.
sudo su: 관리가 권한으로 들어간다. (나올때는 exit으로 나옴)
# 실행. 콘솔창에 hello world!가 뜨는 것 확인
python3 test.py
# 파일 권한 수정
sudo chmod 755 initial_ec2.sh
# 실행
./initial_ec2.sh
python test.py
mongo
# UTC to KST
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
# python3 -> python
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
# pip3 -> pip
sudo apt-get update
sudo apt-get install -y python3-pip
pip3 --version
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1
# port forwarding
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000
# MongoDB - install
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
sudo mkdir -p /data/db
# MongoDB - run
sudo service mongod start
sleep 7
netstat -tnlp
# MongoDB set user, set conf file
mongo admin --eval 'db.createUser({user: "test", pwd: "test", roles:["root"]});'
sudo sh -c 'echo "security:\n authorization: enabled" >> /etc/mongod.conf'
sudo sed -i "s,\\(^[[:blank:]]*bindIp:\\) .*,\\1 0.0.0.0," /etc/mongod.conf
sudo service mongod stop
sudo service mongod start
sleep 5
netstat -tnlp
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
# pip3 설치
sudo apt-get update
sudo apt-get install -y python3-pip
# pip3 대신 pip 라고 입력하기 위한 명령어
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1
4-1. mongoDB 설치코드
wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list
sudo apt-get update
sudo apt-get install -y mongodb-org
4-2. mongoDB 실행하기
# 실행. 아무 반응이 없으면, 잘 실행된 것!
sudo service mongod start
4-3. mongoDB 접속 계정 생성하기
mongo
# admin으로 계정 바꾸기
use admin;
# 계정 생성하기
db.createUser({user: "test", pwd: "test", roles:["root"]});
# 나오기
exit
# MongoDB 재시작
sudo service mongod restart
4-4. mongoDB 외부에 열어주기
sudo vi /etc/mongod.conf
# sudo: 관리자(SuperUser) 권한으로 다음을 실행
# => "관리자 권한으로 /etc 폴더 아래 mongod.conf 파일을 Vim으로 켜줘!"라는 뜻
# 입력 모드 전환
i
# 내용 저장하고 에디터 종료하기. esc 누르고 다음 입력.
:wq
# 재시작
sudo service mongod restart
4-5. Robo3T 이용해서, "내컴퓨터" -> "서버에 있는 mongoDB" 접속하기
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000
# 실행
python app.py
pip install flask
pip install pymongo
python app.py
크롬 브라우저 창에 아래와 같이 입력
localhost:5000 대신, 내 EC2 IP:5000 입력
http://[내 EC2 IP]:5000/
EC2 서버(=가상의 내 컴퓨터)에서 포트를 따로 설정하는 것 외에도, AWS EC2에도 자체적으로 포트 열고/닫을수 있게 관리하고 있음.
-> AWS EC2 Security Group에서 인바운드 요청 포트를 열어줘야함.
EC2관리 콘솔 > 보안 탭 > 보안 그룹 > 인바운드 규칙 편집
세가지 포트를 추가해보자.
- 80포트: HTTP 접속을 위한 기본 포트
- 5000포트: flask 기본포트
- 27017포트: 외부에서 mongoDB 접속을 위한 포트
💡 AWS의 MongoDB에 아이디/비밀번호를 추가했기 때문에, pymongo에도 아이디/비밀번호를 입력해야함. 그래야 pymongo가 올바르게 DB에 접근할 수 있음
client = MongoClient('mongodb://아이디:비밀번호@localhost', 27017)
app.py에 위 코드 변경해줌
homework 폴더의 app.py파일, templates폴더, static 폴더 > filezilla에서 EC2 인스턴스의 home/ubuntu 폴더에 업로드
# 패키지 설치하기
pip install pymongo
# 해당 폴더로 이동해서 아래 코드를 실행
python app.py
http://내AWS아이피:5000/
http://내AWS아이피/
→ 아까 포트포워딩 명령어로 해둬서 접속은 됨.
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000
nohup python app.py &
# 아래 명령어로 미리 pid 값(프로세스 번호)을 본다
ps -ef | grep 'app.py'
# 아래 명령어로 특정 프로세스를 죽인다
kill -9 [pid값]
도메인을 구매한다는 것은, 네임서버를 운영하는 업체에 IP와 도메인 매칭 유지비를 내는 것.
업체 어디든 상관 없지만, 한국의 '가비아'라는 회사에서 구입 예정
로그인 > My가비아 > DNS 관리툴 > 도메인 우측 설정 > 레코드 설정 > 레코드 추가
호스트 이름에 @, IP주소에 내 EC2 IP주소 입력 > 확인 > 저장
네임서버에 내 도메인-IP가 매칭되는 시간이 필요하기에, 10분정도 기다려보기
http://내AWS아이피/
http://내도메인/
👉 og태그 적용하기
1. "내 사이트의 제목" 입력하기
2. "보고 있는 페이지의 내용 요약" 입력하기
3. 적당한 이미지를 만들거나/골라서 static폴더에 ogimage.png로 저장하기!
(사이즈 800x400인 이미지를 구글에서 검색!)
- 프로젝트 HTML의 ~ 사이에 아래 내용 작성하면 og태그를 개인 프로젝트에 사용 가능.
<meta property="og:title" content="내 사이트의 제목" /> <meta property="og:description" content="보고 있는 페이지의 내용 요약" /> <meta property="og:image" content="{{ url_for('static', filename='ogimage.png') }}" />
만약 이미지 바꿨는데 이전 og:image 그대로 나온다면?
-> 페이스북/카카오톡 등에서 처음 것을 한동안 저장해놓기 때문참고링크
- 페이스북 og 태그 초기화 하기: https://developers.facebook.com/tools/debug/
- 카카오톡 og 태그 초기화 하기: https://developers.kakao.com/tool/clear/og