파이썬 Flask, Nginx와 연결해서 사용하기 with uWSGI

기존의 웹서비스가 있는 상태에서 파이썬(Python)으로 작은 프로그램을 개발했는데 생각해보니 이를 웹서비스와 연동해서 사용해야 했고, PHP 기반의 웹서버에 해당 프로그램을 동시에 돌리면서 처리하기에는 부하가 생길 것 같았다. 검색해보니 Rest API로 쓸 수 있는 파이썬 Flask 라는 프레임워크를 찾았다.

그래서 웹서버의 부하를 줄이면서 해당 프로그램의 수행만을 진행하고 던져줄 수 있도록 하기 위한 첫번째 단계로 Flask를 설치하고 테스트를 진행했는데, 이게 생각보다 명령어 에러가 자주 났고, 나중에라도 깔끔하게 작업할 수 있도록 기록하는 용도로서도 작성한다.

파이썬 Flask 서버 기본 환경

현재 웹서비스가 돌아가고 있는 환경은 네이버 클라우드 플랫폼(Naver Cloud Platform)으로, OS로는 Ubuntu 16.04 LTS 버전을 초기 생성했다는 가정하에 아래의 내용을 진행한다. 그리고, root 계정을 제공하므로 sudo 명령어는 제외하였다.

처음 패키지 설치 작업

우선 초기 상태에서 패키지 목록을 업데이트하고 설치하는 과정을 진행한다.

apt-get update
apt-get -y upgrade

이렇게 하고 나서 명령어로 python 을 입력해보면 python3 가 설치되어 있는 것을 확인할 수 있다.

python3을 그대로 사용할 것이기에 아래의 명령어를 입력해 pip를 설치해준다.

apt-get install python3-pip

Flask를 사용할 때 파이썬 패키지는 virtualenv에서 설치할 것이므로 아래의 명령어를 입력하여 설치를 진행한다.

pip3 install virtualenv

이제 아래의 명령어를 입력하여 Nginx를 설치한다.

apt-get install nginx

Nginx 폴더와 Flask 기본 설정하기

우선 Nginx의 기본 경로인 /var/www/html 을 놔두고 아래의 명령어를 입력하여 새로운 폴더를 생성한다. 그리고 새로 만든 폴더로 이동한다.

mkdir /var/www/mysite
cd /var/www/mysite

Flask를 설치할 공간을 만들기 위해 아래의 명령어를 입력하여 가상 개발 환경을 구축하고, Nginx와의 연결을 위해 uWSGI를 설치한다.

virtualenv .env
soruce .env/bin/activate
pip isntall flask
pip install uwsgi

영문사이트의 많은 예제들이 apt-get install uwsgi로 설정을 진행하는데 이게 생각보다 잘 안되어 국내 블로그(http://bablabs.tistory.com/25)를 참고했다.

그리고 여기까지 진행했을 때, 현재 경로는 /var/www/mysite인데, 여기에 run.py, uwsgi.ini 2개의 실행 파일을 작성하여 웹서비스가 구동될 수 있도록 해준다.

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()
[uwsgi]
chdir           = /var/www/mysite
module          = run
virtualenv      = /var/www/mysite/.env
callable        = app
chmod-socket    = 666
socket          = /tmp/mysite.sock

(.env) 가 활성화된 상태로 uwsgi uwsgi.ini를 실행하게 되면 정상적으로 실행되는 것을 확인할 수 있는데, 이후 작업으로 /etc/init/ 폴더에 아래와 같이 conf 파일을 입력 후 백그라운드에서 동작할 수 있게 설정해주어야 한다.

description "uWSGI server instance configured to serve mysite"

start on runlevel [2345]
stop on runlevel [!2345]

setuid root
setgid root

env PATH=/var/www/mysite/.env/bin
chdir /var/www/mysite
exec uwsgi --ini uwsgi.ini

그러고 나서 해당 사항을 적용하기 위해 아래와 같이 입력한다.

start mysite.conf

아마도 아래와 같은 내용이 뜨면서 적용이 안 될 텐데, 문장에 설명이 있으나 그대로 진행하면 안 되고 아래의 문구에 있는 명령어를 입력하여 진행해야 한다.

The program 'start' is currently not installed. You can install it by typing: apt install upstart
apt-get install upstart-sysv
update-initramfs -u
reboot

위의 코드에서 2번째 줄을 실행한 뒤에는 reboot 명령어를 통해 재부팅해야 적용이 완료된다. 다음은 Nginx 설정을 위해 폴더를 이동하고 기존의 default 파일을 제거한다. 그리고 mysite 파일을 만든 후 활성화시키기 위해 심볼릭 파일을 생성한다.

cd /etc/nginx/sites-available/
rm -rf default
vi mysite
server {
        listen 80;
        server_name IP OR ServerDomain;

        location / { try_files $uri @app; }
        location @app {
                include uwsgi_params;
                uwsgi_pass unix:/tmp/mysite.sock;
        }
}
ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/mysite

많은 예제들이 location = / { ~~~~ } 으로 설정을 하는데 이렇게 할 경우 @app.route('/') 에 대해서만 작동하니 유의해서 적용해야 한다.

이제 적용을 위해 아래의 명령어를 입력하면 파이썬 Flask의 사용 준비가 끝났다. 그 이후 서버의 아이피 주소를 입력해서 ‘Hello World!’ 가 나오는지 확인하면 된다.

service nginx restart

참고 사이트

http://bablabs.tistory.com/25 – Flask AWS에 프로덕션용으로 Deploy하기(nginx+uwsgi)

http://markjberger.com/flask-with-virtualenv-uwsgi-nginx/ – Running flask with virtualenv, uwsgi, and nginx

2 comments On 파이썬 Flask, Nginx와 연결해서 사용하기 with uWSGI

  • cd /etc/nginx/sites-available/
    mysite 파일에서 에러가 나는것같아요 nginx재시작하고 들어가보면 ,502 게이트웨이 오류가 납니다ㅠ

    • 업무를 하다보니 블로그를 잘 관리하지 않게 되어 댓글 확인이 늦어졌습니다.
      nginx 구동을 위해 작성한 mysite 파일이 문제가 되어 오류가 난다고 하신 것을 미루어 보아, 내용을 그대로 복사 붙여넣기 하셨다면 아마도 server_name IP OR ServerDomain; 부분의 문제가 아닐까 싶습니다.
      server_name 까지는 그대로 쓰고 이후 서버의 IP 혹은 ServerDomain을 입력해주시면 됩니다.

Leave a reply:

Your email address will not be published.

Site Footer