Flask API 서버 배포 - Flask API seobeo baepo

Developing API Sample Server by Flask 

Original Post: How to structure a Flask-RESTPlus web service for production builds

Github: https://github.com/cosmic-byte/flask-restplus-boilerplate

Flask로 API 서버 만들기 (1) - 개발 환경 준비

Flask로 API 서버 만들기 (2) - config 와 실행 확인

Flask로 API 서버 만들기 (3) - User 테이블 만들기

Flask로 API 서버 만들기 (4) - Testing

Flask로 API 서버 만들기 (5) - User Operations

Flask로 API 서버 만들기 (6) - Security and Authentication

Flask로 API 서버 만들기 (7) - Route protection and Authorization

Flask로 API 서버 만들기 (8) - Extra tips (Makefiles)

Extra Tips로 있는 Makefiles까지 해봅시다.

nGleAPI 서버를 배포하고 쉽게 설치하기 위해 Makefile을 만들수 있습니다.

먼저 Makefile을 만듭니다.

$ sudo vim ./Makefile

Makefile 안에 아래와 같이 작성합니다.

.PHONY: clean system-packages python-packages install tests run all clean: find . -type f -name '*.pyc' -delete find . -type f -name '*.log' -delete system-packages: sudo apt install python-pip -y python-packages: pip install -r requirements.txt install: system-packages python-packages tests: python manage.py test run: python manage.py run all: clean install tests run

이제 nGleAPI 서버의 모든 파일을 압축합니다.

$ cd ..
$ tar -czvf nGleAPI_0.1.tar.gz nGleAPI/

정상적으로 tar 압축이 되었다면 nGleAPI_0.1.tar 파일이 생성됩니다.

이걸 다른 서버로 이동하고 압축을 풀어줍니다.

$ tar -xzvf nGleAPI_0.1.tar.gz
$ cd nGleAPI/

압축을 풀고 nGleAPI 폴더를 확인했다면 Makefile을 이용해 API 서버 실행에 필요한 Package들을 설치해 줍니다.

아래 명령으로 설정/설치할 수 있습니다.

  1. make install : installs both system-packages and python-packages
  2. make clean : cleans up the app
  3. make tests : runs the all the tests
  4. make run : starts the application
  5. make all : performs clean-up,installation , run tests , and starts the app.

make 명령을 차례대로 수행하거나 make all 로 한번에 설치하고 test 후 실행까지 할 수  있습니다.

$ make run
python3 manage.py run
 * Serving Flask app "app.main" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 145-484-411

만약 make 명령을 했을 때 아래와 같이 python 명령을 찾을 수 없다면 Makefile에 python3로 명시해 주면 해결될 수 있습니다.

make: python: Command not found

.PHONY: clean system-packages python-packages install tests run all
  
clean:
        find . -type f -name '*.pyc' -delete
        find . -type f -name '*.log' -delete

system-packages:
        sudo apt install python3-pip -y

python-packages:
        pip3 install -r requirements.txt

install: system-packages python-packages

tests:
        python3 manage.py test

run:
        python3 manage.py run

all:
        clean install tests run

여기까지 입니다.

만든 웹 서비스 사이트를 누구나 사용할 수 있도록 하려면 다른 사람이 웹 서비스에 접속할 수 있게 만들어야 한다. 직접 운영한 서비스가 24시간 동작하기 위해서는 1년 365일 쉬지 않고 켜 있는 서버용 컴퓨터가 있어야 한다. 보통 리눅스 운영체제를 설치해 사용한다.

개인용으로는 라즈베리파이 같은 소형 컴퓨터를 사용하기도 하지만 실제 서비스를 위해서는 보통 컴퓨터보다 더 크고 비싼 서버 전용 기기에 네트워크 장비를 구축해 관리해야 한다. 추가로 데이터베이스 설치 및 관리, 도메인 등록, 수동 백업 등 해야 할 일도 많고 외부의 공격으로부터 수동으로 처리해야 하기 때문에 다뤄야 할 일이 많다.

이렇듯 서버를 직접 운영해 배포하려면 설치하고 관리하는데 드는 서버의 금전적인 측면과 관리적인 측면에서 직접 운영하기는 힘들다는 것을 쉽게 생각할 수 있다.

클라우드 시스템을 이용한 웹 페이지 배포

과거와 달리 현재는 위 과정을 쉽게 할 수 있도록 돕는 클라우드 시스템이 활발히 이용되고 있기 때문에 쉽게 클라우드 시스템을 사용해 서버와 운영체제 구입 및 설정을 일일히 할 필요 없이 쉽게 설치하고 이용할 수 있다.

클라우드 서비스란 다른 회사 제공업체가 호스팅하여 인터넷을 통해 사용자에게 제공하는 인프라, 플랫폼 또는 소프트웨어다. 쉽게 생각할 수 있는 것은 구글 드라이브가 있다. 큰 용량을 포함한 각종 자료를 내 컴퓨터 같은 내부 저장공간이 아니라 회사에서 제공하는 외부 클라우드 서버를 이용해 자료를 저장하고 다운로드 받을 수 있다.

=> 네이버 메인 페이지가 세계 어느 곳에서 접속하더라도, 안정적으로 신속하게 접속할 수 있는 이유이기도 하다.

클라우드 서비스는 회사가 서버를 제공하냐, 서비스를 제공하냐 등을 기준으로 다음으로 구분한다.

IaaS, Infrastructure as a Service

컴퓨팅 환경이나 네트워크 등을 서비스로 제공하는 클라우드 인프라 서비스

PaaS, Platform as a Service

컴퓨터를 사용하는 플랫폼이나 솔루션 환경을 제공하는 클라우드 플랫폼 서비스

SaaS, Software as a Service

응용 소프트웨어를 서비스로 제공하는 클라우드 소프트웨어 서비스

DaaS, Datacenter as a Service

기업의 사업 모델에 따라 필요한 컴퓨팅 자원과 서비스를 유연하게 제공할 수 있는 새로운 개념의 데이터 센터

클릭 몇 번으로 대기업의 운영 노하우가 적용된 서버, 운영체제, 데이터베이스 등 서버를 운용하는 데 필요한 모든 것을 선택해 사용할 수 있다. 이처럼 클라우드는 대용량의 데이터를 처리하고 분석하는 IT 자원 운영 등을 제공한다. 기업의 고성능 컴퓨터를 정해진 요금만큼 내고 이용하는 기업용 클라우드 서비스는 다음이 대표적이다.

1. 구글 클라우드 서비스(GCP)

2. 아마존의 웹 서비스(AWS)

3. 마이크로소프트 사의 애저(Azure)

4. 네이버의 네이버 클라우드 플랫폼(NCP)

- NCP 개요와 장점, 가격 정책

- NCP 마이크로 서버 리눅스 우분투 운영체제 설치

웹 서버 용도 뿐 아니라 클라우드에서 제공하는 음성 인식, 메시지 발송 등 유용한 서비스로 웹 페이지 기능을 탄탄하게 구성할 수 있다.

개발 서버와 운영 서버의 차이

플라스크로 파이썬 코드를 실행할 때는 개발 환경으로 실행하거나 운영환경으로 실행하는 두 방법이 있다.

app.run()로 플라스크 자체에서 웹 서버를 것은 운영 환경으로 실행하는 방법이다.

if __name__ == '__main__': app.run()

다음 코드처럼 웹 서비스를 app.run()으로 실행할 때 host에 0.0.0.0을 입력하면 어떤 호스트에서도 연결 가능하도록 열어줄 수 있다. 실행 시 다음 경고가 출력된다.

if __name__ == '__main__': app.run(host='0.0.0.0', port=8001) //어떤 호스트에서도 연결 가능하도록.

* Serving Flask app "app" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:8001/ (Press CTRL+C to quit)

Environment에 운영 환경이며 WARNING의 경고 메시지에는 "이것은 개발 서버이며 제품 배포에서 사용하지 마세요. 대신 제품 WSGI 서버를 사용하세요"라고 쓰여있다. 플라스크에서 기본적으로 제공되는 내장 웹서버를 사용하지 말라는 뜻이다. 관련 자료를 참고하자. 플라스크 내장 웹 서버는 한 번에 한 사람만 접근하기 적합하다.

운영 환경이 아니라 개발 환경으로 실행해 위 경고 메시지를 보기 싫다면 개발 환경으로 실행하면 된다. 개발환경으로 실행할 때는 app.run() 구문을 코드에서 제거하고 콘솔에 실행 명령을 입력한다. 각 set으로 앱 설정을 입력하고 다음에 flask run으로 실행하거나 각 실행마다 'set FLASK_APP=app set FLASK_DEBUG=1 flask run'처럼 설정하면서 실행하면 된다.

> set FLASK_APP=app // flask app name 설정 > set FLASK_ENV=development // 운영환경인지, 개발환경인지 설정 > set FLASK_DEBUG=1 > set FLASK_HOST=0.0.0.0 > flask run

> set FLASK_APP=app set FLASK_ENV=development flask run

플라스크를 사용해 만든 웹 서비스의 실제 배포를 위한 운영 서버를 위해서는 보통

Apache나 nginx 같은 웹 서버에 gunicorn 또는 uWSGI 등과 같은 WSGI 서버를 같이 붙여 사용한다.

WSGI 서버는 웹 서버와 WSGI 애플리케이션 중간에 위치해 웹 브라우저로 웹 서비스에 요청하면 웹 서버가 받아서 동척요청이 아니면 정적 파일을 그대로 보여주고 맞다면 WSGI 서버를 거쳐 WSGI 애플리케이션인 플라스크에서 데이터베이스를 처리해 반환하는 방식이다.

참고

WSGI를 사용한 예시로 온라인에 공개된 도서인 점프 투 플라스크에서는 게시판 서비스인 "파이보" 서비스를 다음의 방식으로 구성해 동작한다. 정적 페이지 요청은 웹 서버가, 동적 페이지 요청은 WSGI 서버가 WSGI 애플리케이션인 플라스크를 호출해 처리한다.

Flask API 서버 배포 - Flask API seobeo baepo

파이보 설명 : https://wikidocs.net/81076

추가로 다음 글을 참고하자.

https://datacrew.tech/python-deploy-wsgi/

python wsgi | DataCrew

파이썬을 이용해 프로그램을 만들다보면, 다른 사람이나 서버가 프로그램의 기능을 사용할 수 있게 해야할 때가 있습니다. 웹페이지를 넘겨주나 api를 통해 어떤 데이터를 내려주거나 할 때 말이죠. 이 서버도 하나의 프로세스입니다. 하나의 일을 하도록 되어있죠. 만약 플라스크나 장고를 이용해 서버를 만들고나서 python manage.py runserver나 p