[항해99 사전준비] 웹개발종합반 5주차

Breadman·2021년 6월 2일
0

항해99

목록 보기
5/28
post-thumbnail

AWS EC2

  • 프리티어에서 사용할 수 있는 Ubuntu LTS 버전으로 18.04와 20.04가 있다. 20.04는 비교적 최근에 업데이트된 LTS버전이므로 대부분은 18.04를 사용한다고 한다.

원격 접속 방법(mac)

sudo chmod 400 [keypair file]
ssh -i [keypair file] [username]@[public IPv4]

각 괄호에
keypair file 는 인스턴스에 필요한 keypair 파일의 위치,
username 는 ubuntu,
public IPv4 는 인스턴스의 ip주소를 넣어주면 된다.

sudo?
일종의 관리자 모드로 실행하는 명령어.
chmod?
change mode 의 약어로, 뒤에 오는 디렉토리나 파일의 사용권한을 변경하는 명령어. 400이면 파일 사용자에게만 읽기 권한 부여. 자세한 내용은 링크.
ssh?
Secure Shell Protocol의 약어로, 인터넷 같은 공공네트워크 환경에서 민감한 정보 등을 안전하게 통신하기 위해 사용되는 프로토콜 중 하나.
주로 데이터전송이나 원격제어에 사용됨.
-i 옵션은 RSA 인증을 위한 비밀 키를 읽어 올 아이덴티티 파일(여기서는 keypair 파일)을 선택.
출처: https://experiences.tistory.com/33 [IT경험]

EC2로 파일전송

강의에선 filezilla를 통해 마우스로 손쉽게 파일을 옮겼다.
추후 자동화를 고려한다면 shell 명령어를 통해 보내는 방법도 알아두는 것이 좋을 것 같다.

# 보내기
scp -i [pem파일경로] [업로드할 파일 이름] [ec2-user계정명]@[ec2 instance의 public DNS]:~/[경로]

# 받기
scp -i [pem파일경로] [ec2-user계정명]@[ec2 instance의 public DNS]:~/[경로] [다운로드할 파일 이름] 

(파일 이름의 위치만 다르고 나머지는 동일하다.)

출처: https://ict-nroo.tistory.com/40 [개발자의 기록습관]

인바운드 규칙 수정

처음에 EC2 인스턴스를 생성하면 기본포트는 22번으로 되어있다. 하지만 서버는 5000번 포트를 사용하기 때문에 따로 열어줘야한다. 추가로 http 프로토콜과 mongoDB의 데이터 확인을 위해서 80번 포트와 27017번 포트도 추가로 열어줘야한다.

  1. 인스턴스를 선택하고 아래에 있는 '보안 그룹' 클릭.
    (좌측 하던에 네트워크 및 보안에 있는 보안 그룹을 클릭해도 된다.)
  2. 우측 하단에 '인바운드 규칙 편집' 클릭.
  3. 좌측 하단에 '규칙 추가' 를 눌러 새로운 규칙을 입력할 양식 추가.
    설정이 끝나면 스크린샷에 보이지 않지만, 우측 하단에 '규칙 저장' 클릭.

Robo 3T 연결

Robo 3T는 mongoDB에 있는 데이터를 보기 쉽고 조작하기 쉽게 돕는 프로그램이다. local에서 EC2에 있는 DB를 확인하기 위해선 새로운 connection이 필요하다.

이전 강의에서 코드스니펫으로 제공해준 initial_ec2.sh 파일에 보면 다음과 같은 코드가 있다.

mongo admin --eval 'db.createUser({user: "test", pwd: "test", roles:["root"]});'

EC2에 있는 DB에 유저계정을 만드는 코드인데, Robo 3T에서도 DB에 연결하려면 계정과 비밀번호가 필요하다.

  1. Name, Address, Port 입력 후, Authentication 탭으로 이동
  2. Perform authentication 체크 후, User Name, Password 입력. 그리고 Save 클릭.

pymongo 파트 수정

pymongo로 DB에 연결하는 부분 역시 수정한다.

# client = MongoClient('localhost', 27017)	# 기존코드
client = MongoClient('mongodb://[user]:[pwd]@localhost', 27017)

Port Forwarding

http 프로토콜은 기본적으로 80 포트를 이용한다. 따라서 http://[ip]를 입력하면 80번 포트로 요청이 들어간다. 우리가 만든 서버는 5000번 포트를 이용하기 때문에 http://[ip]:5000 처럼 5000을 붙여야 접속이 된다.
:5000 부분을 제거하기 위해선 '80번 포트로 들어온 요청은 자동으로 5000번 포트로 보내주세요'라는 의미의 Port Forwarding을 해줘야한다.

init_ec2.sh 파일에 보면 해당 내용을 설정하는 코드가 있다.

# port forwarding
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000

iptables
Linux 계열 OS에서 방화벽 규칙을 담당. filter, nat, mangle, raw 라는 테이블이 존재한다. 테이블은 일종의 파트인 것 같다.
-t 옵션은 테이블을 선택하는 옵션이다. -t nat 은 nat 테이블을 선택한다는 의미.
nat
Network Address Translation(네트워크 주소 변환)의 약자로, 요청이 외부에서 내부로 들어올 때와 내부에서 외부로 보낼 때 ip나 포트를 라우팅해주는 파트를 담당하는 테이블.
-A PREROUTING
nat에서 라우팅하기 전(패킷은 EC2 컴퓨터에 도착했지만 아직 서버엔 전달 안 됨.)(PREROUTING)에 새로운 규칙을 추가(-A).
-p tcp --dport 80
'프로토콜(-p)이 tcp이고, 요청이 들어온 포트(--dport)가 80번'이라는 조건.
('if tcp 프로토콜 && 80번 포트' 이라는 뜻.)
-j REDIRECT --to-port 5000
앞의 조건에 해당되면(-j) 5000번 포트redirect 처리를 하라는 의미.

출처 및 참고:

원격 접속된 terminal을 꺼도 동작하게 만들기

원격 접속으로 ec2에 있는 서버를 실행시키고, 해당 터미널을 끄면(SSH 연결을 끊으면) 서버도 함께 꺼진다.
이유는 터미널이 종료되면, 해당 터미널에서 실행중인 프로세스들에게 hup(hang up) signal을 보내 종료시키기 때문이다.

실행하기

따라서, 다음 명령어를 통해 프로세스가 hup signal을 무시하도록 처리한다.
(참고: https://gracefulprograming.tistory.com/128)

nohup python app.py &

nohup: 프로세스가 hup signal을 무시하도록 함.
&: 백그라운드에서 돌아가도록 설정.

nohup를 이용해 프로세스를 돌리면, stdout으로 나오는 출력들(ex. GET, POST 로그 등)은 nohup.out 파일에 저장된다. 따라서 불필요한 데이터들을 출력하고 있다면 nohup.out 파일의 크기가 커지기 때문에 주의해야한다.

위 설명대로 실제로 동작하는지 확인하기 위해 몇 번의 테스트를 해봤다.

테스트 1: 위의 설명대로라면 & 만 붙여도 서버는 동작해야하는데, 테스트한 결과 무한로딩에 빠진다.. 터미널화면은 그냥 python app.py 한 화면과 동일.
테스트 2: nohup만 하고 ctrl+z로 백그라운드 동작하게끔 전환. 결과는 역시나 무한로딩..

그냥 nohup와 &를 같이 쓰는 게 정신건강에 이로울 것 같다..

종료하기

nohup로 실행시키면 터미널이 꺼져도 돌아가기 때문에, 직접 프로세스를 종료시켜줘야한다.

# 실행중이 프로세스들 중 실행한 파일 검색
ps -ef | grep [excuted filename]

# 검색으로 알아낸 프로세스 번호를 통해 프로세스 종료.
kill -9 [process number]

ps: 프로세스
-ef: -e는 모든 프로세스 보여주기 옵션. -f는 상세정보 보여주기 옵션.
|: 리눅스 명령어 파이프라인으로, 일종의 명령어를 섞어서 쓰는 용도.
grep: 뒤에오는 패턴과 일치하는 문자열 검색.
kill: 프로세스 죽이는 명령어. -9SIGKILL 이라는 시그널옵션.
(시그널 옵션은 kill -l 하면 쭈욱 나온다.)

ps -ef | grep ... 로 프로세스를 검색하면, 총 3개의 프로세스가 뜬다.

맨 아래는 grep에서 검색한 패턴에 강조표시해주는 프로세스이므로, 위의 2개만 꺼주면 된다.
ubuntu 오른쪽에 5자리 숫자가 2개 있는데, 왼쪽(PID)을 입력해주면 된다.

kill -9 31533 31543

og태그

카카오톡이나 페이스북에 링크를 공유했을 때, 간략한 이미지와 제목 및 설명이 나타나게 하는 meta태그.

다음 코드를 head태그에 복붙하면 된다.

<meta property="og:title" content="내 사이트의 제목" />
<meta property="og:description" content="보고 있는 페이지의 내용 요약" />
<meta property="og:image" content="{{ url_for('static', filename='ogimage.png') }}" />

etc

  • pymongo에서 받아온 data list를 sorting.
movie_star = list(db.mystar.find({}, {'_id': False}).sort('like', -1))
# 마지막 -1은 내림차순. 생략하거나 1이면 오름차순.
  • python에서 직접 list를 sorting 할 수도 있다.
data = [{"job":"teacher",  "like":10},
      {"job":"doctor",   "like":4},
      {"job":"engineer", "like":1}]

print(sorted(data, key=lambda d: d['like']))
# [{'job': 'engineer', 'age': 1}, {'job': 'doctor', 'age': 4}, {'job': 'teacher', 'age': 10}]
  • lambda는 한 줄로 함수를 표현하는 방식이다.
    즉시 실행 함수로도 쓰일 수 있다.
sum_lambda = lambda num1, num2: num1 + num2
print(sum_lambda(1,2)) 	# 3

(lambda num1, num2: num1 * num2)(2,3) 	# 6

후기

전에도 느꼈지만 원격접속이랑 shell을 이용한 업로드 및 서버구동은 복잡한 것 같다. 특히 실행 명령어를 보고 있으면 머리가 아득해지는데, 이번엔 집요하게 알아내보자는 마음으로 명령어 하나하나를 뜯어보려고 했다.
생각보다 단순하기도 하고 알기 쉬운 부분들도 있어서 겁먹지 말고 들이대보도록 해야겠다.

웹개발종합반 강의를 모두 수강했다.
처음엔 쉬울거라 생각하고 조금 복습한다는 생각으로 수강했지만, 생략된 내용을 공부할 수록 알아야할 지식들이 많음을 점점 깨닫게 되었다. 본격적인 항해과정까지 4일 남은 시점에서, 배운 것들을 꼼꼼히 복습해야겠다.

profile
빵돌입니다. 빵 좋아합니다.

0개의 댓글