tmux 사용해서 백그라운드에서 서버 돌리기

Ji_min·2021년 3월 1일
1

Azure ubuntu 가상머신 서버에 tmux를 사용해서 백그라운드에서 서버를 돌린 과정을 담은 글이다. 반나절 동안의 삽질의 결과인 다음의 내용들을 확인할 수 있다.

  • vscode에서 remote ssh로 azure vm 서버에 원격접속하기
  • azure vm에 mysql 설치하고 user와 db 만들기
  • flask app 실행시키기
  • vm에서 포트 열기
  • tmux 설치하고 실행시키기

1. vscode에서 remote ssh로 azure vm 서버에 원격접속하기

  1. remote ssh라는 익스텐션을 설치한다.
  2. 그럼 왼쪽 사이드바에 아이콘이 생기는데, 이 아이콘을 클릭하면 아래와 같은 탭이 뜬다.
  3. 여기서 +를 눌러서 ssh로 azure vm에 접속하는 명령어를 입력한 후 접속하면 끝이다.

2. azure vm에 mysql 설치하고 user와 db 만들기

2-1. 사전 작업

패키지 설치 전에는 항상 apt 업데이트, 업그레이드 하기

$ sudo apt update
$ sudo apt upgrade

2-2. mysql 설치하기

$ sudo apt install mysql.server
$ sudo apt-get install python3-dev default-libmysqlclient-dev build-essential

마지막은 mysql client 설치를 위한 추가 패키지를 설치하는 작업이다. 이 글을 참고하면 된다.

2-3. user와 db 생성하기

이 글 참고

3. flask app 실행시키기

파이썬 가상환경을 설치하고 안으로 들어온다.

$ python3 -m venv venv_name
$ source venv_name/bin/activate

requirements.txt 파일을 설치한다.

pip install -r requirements.txt

그런 다음 flask run을 통해 앱을 실행시킨 후 dns 서버로 접속해보니 페이지가 뜨지 않았다.
아무래도 flask run으로 실행하면 안 되고 python app.py의 형식으로 앱을 실행시켜야 하는 것 같다.
그래서 python app.py 명령어를 입력하니 authentication error 가 났다.
그래서 sudo python app.py를 입력했더니 no module named flask라는 에러가 떴다.
나는 분명히 requirements 파일을 통해 패키지를 전부 설치했고, pip freeze로 확인해보아도 잘 설치가 된 것을 확인할 수 있었는데 왜 실행이 안되고 모듈이 설치되지 않았는지 이해가 되지 않았다.

도대체 뭐가 문젠가 싶었는데, 알고 보니 내가 리눅스의 sudo명령어를 잘 모르고 사용하고 있었기 때문에 문제가 생긴 거였다.
sudo 명령어는 vm 전역에서 실행시키는 명령어이기 때문에 venv에는 패키지가 설치되어 있어도, vm 로컬에 설치되어 있지 않다면 모듈을 찾을 수 없다는 에러가 뜨는 거였다.
마찬가지로 venv 안에 있더라도 sudo 명령어를 사용한다면 python app.py가 아니라 python3 app.py라고 해야 한다. venv 안에서 실행시키는 게 아니기 때문이다.
한 마디로 venv를 사용하는 의미가 없다...
따라서, 이 경우 두 가지 방법을 생각해 볼 수 있다.

  • root 계정으로 들어가는 방법
  • venv에서 나와서 그냥 vm 전역에 패키지를 설치하는 방법

첫 번째 방법으로 하려면, 먼저 su를 사용해서 root 계정으로 들어간 다음에 venv 안에서 작업하면 된다. 이 글을 참고하면 된다.
그런데 나는 그냥 두 번째 방법으로 사용했다. 어차피 혼자 개발하는 거고 첫 번째 방법을 생각하기 전에 이미 패키지를 설치해버렸기 때문이다.

두 번째 방법을 사용하고 sudo python3 app.py를 통해 앱을 실행시키니 잘 되는 것을 확인할 수 있었다.
그런데 다시 dns 서버로 접속해보니 여전히 페이지가 뜨지 않았다.
왜일까 싶어 알아보니 포트가 열려있지 않았기 때문이다. 그래서 다음 스텝으로 포트를 열어줬다.

4. vm에서 포트 열기

이 글을 보고 따라했다.

1. 서버와 포트 설정하기

app이 실행되는 서버를 '0.0.0.0'으로, 포트를 80번으로 설정한다.

app.run('0.0.0.0', port=80)

2. 포트 열어주기

sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

포트를 열고 dns 서버로 접속해보니 접속이 잘 되는 것을 확인할 수 있었다.

5. tmux 설치하고 실행시키기

이제 드디어 tmux를 설치하고 사용해볼 차례이다.
이 영상을 참고했다. (여담으로 이고잉님은 너무 대단한 분 같다. 아무거나 뭘 찾아도 전부 이고잉님이 나온다. 정말 대박...)

영상을 보고 정리해보자면, tmux는 세션으로 관리하기 때문에 여러 개의 세션을 만들어서 여러 작업을 동시에 할 수 있고 복수의 세션을 멀티 윈도우로 열어서 같이 보면서 작업할 수도 있는 편리한 도구라고 할 수 있다.

 1. 설치하기
$ sudo apt install tmux
 2. tmux 세션 만들기
$ tmux

위 명령어를 통해 flask 앱을 실행시켜놓은 다음, 세션에서 나오면 끝이다.
그러면 ssh를 종료해도 계속해서 서버는 돌아가게 된다.

tmux의 명령어로는 세션에 들어갈 때는 attach의 a, 나올 때는 detach의 d가 있고, 단축어는 tmux의 예약어인 ctrl+b로 접근할 수 있다.

// 모든 세션 확인하기
$ tmux ls 

// 마지막으로 나온 세션에 들어가기
$ tmux a

// 세션 번호를 통해 세션에 들어가기
$ tmux a -t session_number

// 세션에서 나오기
ctrl + b 를 누른 후 d 를 누르기

// session kill
(session 안에서) $ exit 
혹은
(session 밖에서) $ tmux kill-session -t session_number

같이 보기

내부접속과 외부접속 개념


리눅스를 잘 몰라서 반나절을 헤맸다. 유닉스 권한 시스템을 공부해야겠다.
여담으로 백그라운드로 서버를 계속 실행시켜 놓으면 배포한 거라고 생각했는데 그게 아니었다.
그럼 어디까지 해야 배포한 걸까...?

profile
Curious Libertine

0개의 댓글