본문 바로가기
개발(Develop)/웹(Web) _프로젝트project

웹서버 / AWS서버 컴퓨터 DB에 접속하기/ mongoDB 서버 데이터베이스에 접속/ 컴퓨터 꺼둔 채로 서버 돌리는 방법/ nohup 설정, kill -9, 포트포워딩

by 왁왁s 2021. 6. 20.

자. 아마존웹서비스(AWS) 사이트에서 구입한 서버 컴퓨터의 포트까지 열여주었다.

 

포트를 열어주어야 5000포트, 80포트서버에 들어갈 수가 있다.

 

거기까지 안 되어 있다면 아래를 참고해 포트를 열어주자 ▼

AWS 포트 개방/ 리눅스 환경 Flask 프레임워크, pymongo 설치/ AWS에서 구입한 인스턴스 포트포워딩


서버 컴퓨터 IP의 포트까지 열어주었다면,

 

이번에 할 것은

다른 사람들이 내가 만든 웹 사이트를 볼 수 있도록

내가 만든 프로젝트를 서버 컴퓨터에 올려 띄우는 작업을 해보겠다.


우선, 

내가 아닌 다른 사람들에게 보여줄 웹페이지가 있어야 한다.

나는 이전에 만들어두었던 '나만의 쇼핑몰'을 가져올 것이다.

 

필요하다면 아래에 있는 이전 글을 참고해 코드를 가져와 사용하도록 하자. ▼

쇼핑몰 서버와 데이터베이스(DB) 관리하기/ 쇼핑몰 주문자 정보 관리하기/ 웹 쇼핑몰 만들어보기

 

웹 / 쇼핑몰 서버와 데이터베이스(DB) 관리하기/ 쇼핑몰 주문자 정보 관리하기/ 웹 쇼핑몰 만들어

이번 글에서는 쇼핑몰에서 클라이언트가 주문한 내용을 데이터베이스에 저장하고, 다시 클라이언트에게 보여주는 것을 해볼 것이다. 그 전에 쇼핑몰에 대한 기본 틀이 있어야 한다. 직접 만들

parkjh7764.tistory.com


먼저

우리가 만든 쇼핑몰은 사용자가 주문한 정보를 받는 '데이터베이스'가 있어야 한다.

몽고DB(mongoDB)에서 로컬 컴퓨터 IP 접속해 고객의 주문 정보를 받았었는데,

이번에는 몽고DB로 서버 컴퓨터 IP에 접속해서 데이터들을 받아 데이터베이스에 저장하면 되는 것이다.

 

mongoDB를 켜서 서버 컴퓨터로 접속을 해줄 것이다.

 

내 컴퓨터에 깔려 있는 몽고(mongoDB)를 키고 처음 Connections 창에서

왼쪽 상단에 'Creat'를 눌러준다.

 

아래 창이 떠있지 않다면, 왼쪽 상단에 컴퓨터 2대 아이콘을 클릭해준다.


mongoDB 접속(Connection) 정보를 세팅하는 부분이다.

처음 기본 값은

Name : New Connection 

Address : localhost:27017

로 되어 있을 것이다.

 

이 부분을 바꿔줄 것이다.


AWS에서 구입한 인스턴스의 퍼블릭 IPv4 주소를 복사해서 와야 한다.

내가 구입한 서버 컴퓨터의 IP는 13.124.8.152이다.

 

사용자마다 구입한 서버의 IP가 다르기 때문에 본인 것을 사용해야 한다.


mongoDB 접속 정보를 세팅하는 부분을 다시 킨다.

기본 값을 지우고 Name에는 데이터베이스 저장소의 이름, 아무거나!

나는 서버컴퓨터 DB임을 알아보기 위해서 아래와 같이 설정했다.

IP는 AWS에서 복사한 것을 그대로 복사붙여넣기 했다.

 

Name : serverComputerDB

Address : 13.124.8.152 : 27017


다음은 인증(Authenticaion)을 설정해준다.

Perform authenticaion을 체크박스해준다.

 

Authenticaion을 설정하는 이유는?

나의 서버 데이터베이스에 아무나 들어오지 못 하도록

ID와 비밀번호를 설정해주는 부분이다.

이 부분은 이미, 서버 컴퓨터에 mongoDB를 설치할 때 다뤘다.


※ 여기서 User Name과 Password는 아무거나 하면 안 된다!!!! ※

 

나는 test와 test를 해줬다.

아무거나 하면 안 되는 이유는 아래에서 다루겠다.

 

아무거나 적으면 안 되는 이유는 아래에서 다뤘는데, 복사해서 가져오도록 하겠다. 

리눅스 환경의 서버 컴퓨터 개발환경 세팅하기/ 서버 환경 명령어 통일하기/ 환경설정 쉘 명령어


바로 이 부분이다. 

 

4-1. 몽고DB(mongoDB) 실행하고 접속 계정 생성하기
# mongoDB 실행하기
sudo service mongod start
# mongoDB 접속 계정 생성하기 / 좌측에 '>' 표시가 떠야 생성 가능 
mongo
# admin으로 계정의 데이터베이스로 전환
use admin;
# admin 계정의 계정 이름과 비밀번호 설정 / user: "계정 이름", pwd: "비밀번호", roles:["권한"]
db.createUser({user: "test", pwd: "test", roles:["root"]});

우리가 처음 서버 컴퓨터에 몽고DB를 설치하고, 실행시킬 때

admin 계정의 이름과 비밀번호를 설정해줬었다.

 

서버 컴퓨터에서

admin 계정의 사용자(User)와 패스워드(pwd)를 모두 "test"로 맞춰줬기 때문에

몽고DB에서 서버 컴퓨터에 접속하기 위해서는 test로 맞춰줘야 한다.

 

 

이를 바꾸려면 우리가 통합 설치했던 쉘 initial_ec2.sh 파일에 가서

user, pwd 부분을 바꿔서 파일질라로 업로드하고, 설치를 진행해주면 된다.

# 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

아니면 Git Bash를 바로 켜서 쉘 명령어를 입력해 user과 pwd 부분만 바꿔서 실행시켜주면 된다.


입력을 완료했다면 바로 Save 누르기 전에 왼쪽 하단에 'Test'를 클릭해

몽고DB가 서버와 admin 계정으로 잘 접속되었는지 테스트 해준다.



Save를 누르면 아래와 같이 열쇠 모양을 가진 데이터베이스가 추가된 것을 확인할 수 있다.




몽고 DB쪽 설정을 완료했으면

서버로 접속했을 때 띄워줄 쇼핑몰을 서버 컴퓨터로 올리는 작업을 해보자!

 

아래를 참고해서 코드를 가져오자. ▼

웹 / 쇼핑몰 서버와 데이터베이스(DB) 관리하기/ 쇼핑몰 주문자 정보 관리하기/ 웹 쇼핑몰 만들어보기

 

웹 / 쇼핑몰 서버와 데이터베이스(DB) 관리하기/ 쇼핑몰 주문자 정보 관리하기/ 웹 쇼핑몰 만들어

이번 글에서는 쇼핑몰에서 클라이언트가 주문한 내용을 데이터베이스에 저장하고, 다시 클라이언트에게 보여주는 것을 해볼 것이다. 그 전에 쇼핑몰에 대한 기본 틀이 있어야 한다. 직접 만들

parkjh7764.tistory.com


서버 컴퓨터로 올리는 작업은 FTP 프로그램인 파일질라(FileZilla)를 통해 업로드를 하면 된다.

그런데 그 전에 기존에 작성했던 mongoDB 부분 코드를 수정해줘야 한다.

 

아래에 나만의 쇼핑몰을 제작했을 때 서버와 API를 구성했던

app.py 파일에 대한 코드를 복사해서 가져왔다.

app.py 파일 / 기존에 로컬에서 사용했던 나만의 쇼핑몰 API 부분 코드
from flask import Flask, render_template, jsonify, request

app = Flask(__name__)

from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client.dbshop


## HTML 화면 보여주기
@app.route('/')
def homework():
    return render_template('index.html')


# 주문하기(POST) API
@app.route('/order', methods=['POST'])
def save_order():
    name_receive = request.form['name_give']
    quantity_receive = request.form['quantity_give']
    address_receive = request.form['address_give']
    phone_receive = request.form['phone_give']

    db_input = {
        'name' : name_receive,
        'quantity' : quantity_receive,
        'address' : address_receive,
        'phone' : phone_receive
    }
    db.shoppingmal.insert_one(db_input)
    return jsonify({'msg': '주문이 완료되었습니다.'})


# 주문 목록보기(Read) API
@app.route('/order', methods=['GET'])
def view_orders():
    orders = list(db.shoppingmal.find({}, {'_id':False}))
    return jsonify({'all_orders': orders})


if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)

위에 코드에서

'client = MongoClient('localhost' 27017)'

서버 컴퓨터로 설정한 mongoDB에는 사용자(User)와 비밀번호(PW)를 설정해줬기 때문에

해당 데이터베이스에 접근하기 위해서는 사용자 이름과 비밀번호를 코드에 작성해줘야 한다.

 

이전에는 myLocalDB에 접속하기 위해 localhost:27017만을 입력하였다.

그러나 이번엔 암호가 있는 serverComputer에 접속을 하기 위해서

아이디와 패스워드가 입력된코드를 작성해줘야 한다.

 


'client = MongoClient('mongodb://test:test@localhost', 27017)'

로 작성해준다.

 

이것의 기본 형태는 아래와 같다.

'client = MongoClient('mongodb://[USER_NAME]:[PASSWORD]@'+[HOST], [PORT])'

 

app.py 파일 / AWS 서버 컴퓨터 mongoDB 부분을 수정한 쇼핑몰 API 부분 코드
from flask import Flask, render_template, jsonify, request

app = Flask(__name__)

from pymongo import MongoClient

client = MongoClient('mongodb://test:test@localhost', 27017)
db = client.dbshop


## HTML 화면 보여주기
@app.route('/')
def homework():
    return render_template('index.html')


# 주문하기(POST) API
@app.route('/order', methods=['POST'])
def save_order():
    name_receive = request.form['name_give']
    quantity_receive = request.form['quantity_give']
    address_receive = request.form['address_give']
    phone_receive = request.form['phone_give']

    db_input = {
        'name' : name_receive,
        'quantity' : quantity_receive,
        'address' : address_receive,
        'phone' : phone_receive
    }
    db.shoppingmal.insert_one(db_input)
    return jsonify({'msg': '주문이 완료되었습니다.'})


# 주문 목록보기(Read) API
@app.route('/order', methods=['GET'])
def view_orders():
    orders = list(db.shoppingmal.find({}, {'_id':False}))
    return jsonify({'all_orders': orders})


if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)


그러면 파일질라(FileZilla) FTP 프로그램을 사용해 AWS 서버 컴퓨터로

쇼핑몰을 만들었던 static 폴더, templates(안에 index.html 파일 있음), app.py 파일을 옮겨준다.


자. 그러면 다시 Git Bash로 돌아와

ls 쉘 명령어로 옮긴 파일이 있는지 확인을 하고

 

python app.py 명령어로 app.py 파일을 실행시킨다.


WARNING이 떠도 당황하지 말자. 아래와 같이 뜬다면 정상적으로 실행된 것이다.


13.124.8.152:5000 주소로 들어가게 되면 내가 만든 쇼핑몰이 보이는 것을 확인할 수 있다.

해당 주소로 나말고도 다른 사람들도 들어올 수 있게 된 것이다!


그런데 문제가 있다.

Git Bash 터미널을 끄거나 내 컴퓨터를 끄게 되면

내가 돌려둔 app.py 서버가 같이 꺼지게 된다.

 

즉, 내 컴퓨터를 켜놓지 않으면 내가 만든 웹 사이트에 접속하지 못하는 경우가 발생했다.

 

이 문제를 해결해보자.


SSH 접속을 끊어도 서버가 계속 돌게 하기 위해

nohup 명령어를 사용해주어야 한다.


nohup 명령어란? 

실행 중인 프로세스가 행업 시그널을 무시하고 파일로 출력하는 리눅스 명령어이다.

nohup 명령어 no, hup(hangup)을 줄인 것이다.

 

SSH 세션을 로그오프할 때 

대용량의 파일을 다운로드하거나 소스의 크기가 방대한 프로젝트를 컴파일할 경우

실행 프로세스를 터미널이 종료되더라도 해당 작업의 종료를 막기 위해 백그라운드에서 실행되도록 하기 위함이다.


app.py를 실행시킬 때, nohup과 마지막에 &을 추가해 입력한다.

nohup python app.py &

-------

컴퓨터를 꺼도 서버가 계속 돌아가게 된다.

그럼 다음 쉘 명령어를 입력할 수 있는 상태가 되었다면 정상적으로 실행된 것이다.



일단 백그라운드에는 실행을 시켜놨는데... 평생 돌아가게 놔둘 순 없지 않은가

그렇다면 nohup으로 실행시킨 서버를 끄는 방법은?

해당 방법은 실행되고 있는 프로세스를 강제종료 시키는 방법이다.

 

우선 현재 실행중인 프로세스의 목록을 보여주는 

ps 명령어를 입력한다.

ps 명령어는 Process Status를 줄인 것이다.

 

리눅스 명령어에는 실행시킬 때 명령어마다 '옵션'을 넣어줄 수가 있다.

 

ps 명령어의 옵션에는 

-e : 모든 프로세스를 출력해준다.

-f : UID나 PID 등의 전체 포맷을 보여준다.

-l : 긴 포맷을 보여준다.

p, -p : 특정 PID의 포로세스를 보여준다.

-u : 특정 사용자의 프로세스를 보여준다.

 

여기서 UID, PID란?

uid(user ID), pid(process ID), ppid(parent ID), TTY(프로세스와 연결된 터미널)

 

여기서 우리가 사용할 옵션은 -e -f이다.

모든 프로세스를 출력하는데, 풀 포맷으로 프로세스에서 정보를 보여주도록 하는 것이다.


ps -ef | grep 'app.py'

해당 명령어를 입력해준다.

 

ps -ef는 다뤘는데, | grep은 무엇일까?

 

우선 '|' 는

\키에 Shift키를 함께 누르면서 입력했을 때 입력된다. OR (또는)을 뜻한다.

 

그럼 'grep' 명령어는?

grep 명령어는 뒤에 지정해준 특정 문자열을 검색하여

동일한 문자열이 있을 때 찾아 출력하는 명령어이다.

 

그럼 ps -ef | grep 'app.py' 명령어는?

실행되고 있는 모든 프로세서를 출력하는데,

그 중에서 app.py만 포함되는 프로세스만 보여주도록 하라는 명령어이다.

 

그럼 바로 입력해보자.

아래와 같이 app.py 이름으로 실행되는 프로세스가 뜬다.


ps를 실행할 때 -f 옵션을 추가하였기에

uid(user ID), pid(process ID)가 같이 출력이 된다.


이제 실행되고 있는 프로세스를 강제종료 시켜줄 것이다.

 

이때는

kill 명령어를 사용한다.

ps 명령어와 마찬가지로 옵션을 설정해 실행시킬 수 있다.

이번에는 '강제종료'를 시켜주는 것이기에

강제종료를 뜻하는 옵션은 '-9'이다.

 

 kill -9 pid[process ID]

해당 명령어를 입력해준다.

 

pid는 실행되는 프로세스마다 다르기 때문에 

자신의 컴퓨터 프로세스의 pid를 입력해줘야 한다.


ps -ef | grep 'app.py'를 입력했을 때 3개의 프로세스가 뜨는데,

 

이 중 2개 프로세스를 강제종료 시켜줄 것이다.

 python app.py

 /usr/bin/python /home/ubuntu/hwan/app.py

 

가장 첫 번째 나오는 것이 프로세스 id인 PID를 뜻하기 때문에,

맨 앞 숫자를 사용해서 강제종료 시켜준다.

 

kill -9 15751

kill -9 15761


그러면 실행중인 app.py 파일이 멈추고,

서버를 통해 들어갔던 웹 페이지도 끊기게 된다.

댓글