[Flask] Flask와 Nginx 클라우드 서비스 구동하기

ubuntu 18.04 환경에서 Flask앱 Nginx 서비스하기

  먼저 NHN TOAST 서버에서 인스턴스를 생성하고 플로팅 아이피를 설정해놓은 상태에서 진행하였다. 수많은 구글링을 해봤지만 버전에따라 명령어나 패키지 이름이 달라지는 경우가 있어 설정이 쉽지 않았다. 드디어 설정을 완료하여 글을 쓴다.
(2020년 2월 26일 기준)

설치 환경:

  • NHN Toast Instance
  • ubuntu 18.04
  • nginx 1.14.0
  • python 3.6.9

모든 작업은 작업을 위해 임시로 만든 폴더 /home/ubuntu/myproject 에서 진행한다

연결을 위해 임시로 만든 Flask 앱 'test.py' 


1
2
3
4
5
6
7
from flask import Flask
application = Flask(__name__)
@application.route("/")
def hello():
    return "<h1>hello!</h1>"
if __name__=="__main__":
    application.run(host='0.0.0.0')
cs

Nginx 설치

ubuntu 18.04 환경에서 설치는 아래와 같다

1
2
3
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nginx
cs

설치 후 인스턴스의 floating ip로 접속하여 'Welcome to Nginx' 라는 Nginx 기본 페이지가 보인다면 설치가 잘 된 것이다.
그 다음 본격적으로 환경설정을 시작해보자

1
2
3
cd /etc/nginx/sites-available
sudo touch myproject
vi myproject
cs

myproject 파일은 아래와 같이 입력한다

1
2
3
4
5
6
7
8
9
server {
    listen 80;
    server_name localhost; #instance에 등록해놓은 도메인 입력도 가능
    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/ubuntu/myproject/myproject.sock
    }
}
cs

여기서  uwsgi_pass 의 의미는 뒤에 지정해준 경로의 소켓에 포워딩해준다는 의미로 이해하자. 다음으로 sympoblic link를 설정하여 사이트를 활성화 하고 기본 구성인 default파일은 삭제한 후 nginx를 restart해준다.

1
2
3
sudo ln -/etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
sudo rm /etc/nginx/sites-enabled/default
sudo service nginx restart
cs

파일을 잘못 입력했을 수도 있기 때문에 nginx가 제대로 동작하는지 확인해 본다.

1
sudo nginx -t
cs

이제 instance의 url에 접속시 502 Bad Gateway라고 띄워져 있다면 잘 설정된 것이다! 아직 아까 설정한 socket에 연결을 해주지 않았기 때문에 나오는 오류이다.

가상 환경 Virtualenv 설치


패키지의 충돌을 방지하기 위해 가상환경을 만들어서 관리하도록하자. 마찬가지로 모든 작업은 myproject 디렉토리 내에서 진행했다.

1
2
3
apt install virtualenv
virtualenv -p python3 myenv
source myenv/bin/activate
cs

서비스 할 flask 앱에 requirements.txt가 있어서 필요한 파이썬 패키지들을 설치해야 한다면, 꼭 가상환경이 활성화된 상태에서 설치하도록 하자. 위 코드의 두번째 줄은 python3을 사용하는 가상환경 'myenv'를 만드는 코드이고, 세번째 줄은 'myenv'가상환경으로 진입하는 것이다. 정상적으로 실행됐다면 커맨드의 맨 앞에 (myenv)가 추가되어있을 것이다.
requrements.txt가 존재하지 않는다면 필요한 패키지들을 pip install로 설치하면 된다.

** openCV 설치 시 오류

설치 명령어는 아래와 같다.
1
python -m pip install opencv-python
cs
정상적으로 설치가 완료되었다고 알림이 뜨는데도 불구하고 python을 실행시켜 import 하려고 하면 오류가 발생했다. ('ImportError: libSM.so.6: cannot open shared object file
') 이 오류는 아래의 코드를 실행하면 해결 할 수 있다. 구글링에서 다른 해결법도 있었지만 나에게는 먹히지 않았고 더 찾아보다 아래 코드를 발견했다.

1
apt update && apt install -y libsm6 libxext6 libxrender-dev
cs

uwsgi 설치

만약 현재 환경에 anaconda3가 설치되어있다면 pip의 충돌로 인해 uwsgi 설치에 어려움을 겪을 수도 있다. 나도 여러번의 시도 중에 anaconda를 이용하는 방법도 시도해보았지만 uwsgi 설치에서 번번이 애를 먹었다. 새로 만든 instance에 anaconda3를 설치한 상태가 아니고 아래의 코드로 설치가 되지 않는다면 해결법은구글링을 해볼 것을 권유한다..

1
pip isntall uwsgi
cs

설치가 완료되면 flask 앱을 5000번 포트로 띄워 정상 작동하는지 확인해보자
1
uwsgi --socket 0.0.0.0:5000 --protocol=http -w test:application
cs

위 코드는 test.py 파일안에 있는 application 을 구동하겠다는 의미이다. 예를 들어 만약 구동하는 파일이 'run.py' 안의 'APP' 앱 이라면 'run:APP'으로 해야한다는 것이다.
floating ip의 5000번 포트로 접속시 정상작동 하는 것을 확인 할 수 있다.
위 작업을 좀 더 쉽게 하기 위해서 .ini 설정파일을 만들어서 쉽게 구동할 수 있도록 하자.
'myproject.ini'파일을 생성한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[uwsgi]
module = test:application
master = true
processes = 5
virtualenv = /home/ubuntu/myproject/myenv
chdir = /home/ubuntu/myproject
socket = /home/ubuntu/myproject/myproject.sock
chmod-socket = 666
vacuum = true
daemonize = /home/ubuntu/myproject/uwsgi.log
die-on-term = true
cs

여기서 module은 시작점이다. 설정파일을 작성 한 후 myproject 앱의 경로에서 아래의 명령어를 입력해주면 설정이 완료된다.

1
uwsgi --ini myproject.ini
cs



참고 : https://teddylee777.github.io/aws/flask-aws-nginx-%EC%84%A4%EC%A0%95%EB%B0%A9%EB%B2%95

No comments:

Powered by Blogger.