티스토리 뷰

밥대생

Flask AWS에 프로덕션용으로 Deploy하기(nginx+uwsgi)

알 수 없는 사용자 2016. 2. 9. 02:41

오늘은 Flask + Nginx + Uwsgi로 프로덕션 서버를

디플로이하는 방식에 대해 소개하고자 합니다. 


간단히 요약하면 uwsgi가 flask 앱을 실행하고 있고, 

nginx로 들어온 요청을 소켓 파일을 통해 uwsgi가 받아서 

flask 앱으로 전해주는 구조입니다.


차근차근 진행해 봅시다. 

먼저 nginx와 uwsgi를 설치해야 합니다.


$ sudo apt-get install nginx

(venv) $ pip install uwsgi


여기서 중요한 건 uwsgi를 pip를 통해 virtual environment 안에 설치하는 것이

apt-get을 통해 설치하는 것보다 설정하기 편하다는 점입니다.

이는 여러 버전의 python이 동시에 설치되어 있는 경우가 많기 때문입니다. 

apt-get을 통해 uwsgi를 global하게 설치할 경우

각 앱을 어떤 버전의 python으로 실행할지 plugin을 통해 설정해주어야 합니다.


그런데 현재 python2.7과 python3.4는 플러그인을 손쉽게 설치할 수 있지만

(uwsgi-plugin-python, uwsgi-plugin-python3),

python 3.5 플러그인의 경우에는 apt-get을 통해서는 설치 할 수 없고

직접 uwsgi 소스코드를 다운받아서 uwsgiconfig.py로 생성을 해주어야 합니다.

이마저도 python 3.5를 처음 설치할 때 ./configure --enable-shared 를 하지 않았으면

에러가 발생하여 플러그인 생성이 불가능합니다.

반면에 venv 안에 설치하면 이러한 고민을 전혀 하지 않고

venv 안에서 돌아가는 모든 앱을 간편하게 처리할 수 있습니다.


그럼 uwsgi 먼저 설정해봅시다.

/home/user/myapp 에 있는 run.py로 flask 앱을 실행하는 상황을 가정하면

생성할 uwsgi.ini의 내용은 다음과 같습니다.

[uwsgi]

chdir           = /home/user/myapp

module          = run

virtualenv      = /home/user/myapp/venv

env             = LANG=en_US.UTF-8

callable        = app

master          = true

processes       = 2

harakiri        = 30

socket          = /tmp/myapp.sock


이 uwsgi.ini를 run.py와 같은 경로에 넣습니다.

이제 (venv) $ uwsgi uwsgi.ini 를 실행하면

ini 파일에 설정된대로 flask app이 실행될 것입니다.

그런데 /etc/init/에 .conf 파일 하나를 생성하면

이걸 백그라운드에서 돌릴 수 있습니다.


/etc/init/myapp.conf 예시는 다음과 같습니다.

description "uWSGI server instance configured to serve myapp"


start on runlevel [2345]

stop on runlevel [!2345]


setuid user

setgid www-data


env PATH=/home/user/myapp/venv/bin

chdir /home/user/myapp

exec uwsgi --ini uwsgi.ini

이렇게 저장하고 sudo start myapp을 하면 uwsgi가 백그라운드에서 실행됩니다.

다음은 nginx를 연결할 차례입니다. (ssl은 따로 인증서를 받아서 설정해야 합니다)

예시는 다음과 같습니다. 

server {

    listen 80;


    server_name <ip address or domain name>;


    location = / {

        include uwsgi_params;

        uwsgi_pass unix:/tmp/myapp.sock;

    }

}

그 다음 /etc/nginx/sites-enabled/에 위 site의 symbolic link를 생성합니다.

$ ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/myapp

이제 $ sudo service nginx restart를 하면

nginx가 80번 포트로 들어온 요청을 /tmp/myapp.sock 으로 보낼 것이고

uwsgi가 이를 받아서 flask 앱에 넘겨줄 것입니다.





참고한 페이지 :

http://haruair.com/blog/1900

https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-14-04



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함