Python Web Framework/Django, Flask

[Python] Flask + uWSGI + Nginx를 연결 및 배포

new_challenge 2020. 7. 31. 00:56
반응형

이번 포스팅은 Flask + uWSGI + Nginx를 연결하여

웹 애플리케이션을 배포하는 포스팅입니다.

 

 

 

 

Flask ( 웹 애플리케이션 )

Flask는 파이썬으로 작성된 마이크로 웹 프레임워크 중 하나이다.

 

Flask 설치

$ pip install flask

> pip를 사용하여 간단하게 플라스크를 설치한다.

 

Flask 기반 웹 어플리케이션 작성

Flask 기반 웹 어플리케이션을 작성한다.

우선은 구동을 위해 간단하게 작성 진행, 파일명은 application.py 로 생성 (아래 wsgi.py 파일에서 사용)

 

from flask import Flask

app = Flask(__name__)

def index():
    return "Hello Flask"
    
if __name__ == '__main__':
    app.run()

 

uWSGI ( 통신을 위한 프로토콜 )

uWSGI가 nginx와 Flask 앱 중간에서 미들웨어 역할을 하게 된다.

 

WSGI는 Web Server Gateway Interface의 약어로 웹서버와 웹 애플리케이션이 어떤 방식으로 통신하는가에 관한 인터페이스로써, 웹 서버와 웹어플리케이션 간의 소통을 정의해 애플리케이션과 서버가 독립적으로 운영될 수 있게 돕는다

 

uwsgi 설치

# uWSGI 
$ apt-get install uwsgi 

# python과 uWSGI를 연결하는 플러그인
$ apt-get install uwsgi-plugin-python3 

 

> uwsgi를 설치하고, python과 uwsgi를 연결하는 플러그인을 설치한다.

> uwsgi-plugin-python3이 아닌 uwsgi-plugin-python으로 설치하게 되면,  실제 파이썬이 실행시 파이썬 2.*버전으로 작동된다. 꼭 맞는 버전의 플러그인을 설치해야함

> 실수로 uwsgi-plugin-python를 설치할경우, 지우고 새로 설치해야함

$ apt-get remove uwsgi-plugin-python
# 위와 같이 지우고 새로 설치

 

 

wsgi.py 파일 생성

기존 플라스크 앱 메인 파일 외에 uWSGI 서버 실행을 위한 모듈을 생성.

$ vi [프로젝트경로]/wsgi.py 

from application import app 

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

 

> uWSGI를 이용하여 서버에 구동하기 위해, 우선 작성한 어플리케이션과 uwsgi를 연결시켜주기 위한 wsgi.py 파일 생성

> from 에는 플라스크로 생성한 프로젝트 이름(application.py)과 import는 해당 프로젝트에서 플라스크를 생성한 애플리케이션(app) 이름을 넣는다.

 

uwsgi 설정 파일

/etc/uwsgi/app-available 폴더에 uwsgi.ini이라는 설정 파일을 생성한다.

 

$ vi /etc/uwsgi/apps-available/uwsgi.ini 

[uwsgi] 
chdir = [프로젝트 경로] 
callable = app [어플리케이션이름]
lugin = python3 
module = wsgi [실행할파일이름] 
master = true 

socket = /tmp/uwsgi.sock [소켓파일명] 
chmod-socket = 666 v
accuum = true d
ie-on-term = true 
ignore-sigpipe=true i
gnore-write-errors=true 
disable-write-exception=true

 

설정 파일 적용 명령어

# 처음 실행 시 (소켓생성) 
$ sudo service uwsgi retart 

# 설정사항 혹은 flask 웹 어플리케이션 소스 변경 후 적용 
$ sudo service uwsgi reload

 

> service uwsgi restart : uwsgi 재시작 명령어 (소켓을 새로 생성해야 하는 경우는 재시작을 해야 함)

> service uwsgi reload : 설정 파일 변경 후 적용 / flask 웹 애플리케이션 코드 변경 적용

 

심볼릭 링크 설정

$ ln -s /etc/uwsgi/apps-available/uwsgi.ini /etc/uwsgi/apps-enabled/

 

Nginx (웹서버)

Nginx는 apache와 같은 웹서버로, 차이점은 nginx는 비동기 이벤트 기반으로 만들어진 점이다.

apache에 비해 적은 메모리를 사용하는 장점이 있음

 

Nginx 설치

$ apt-get install nginx

 

Nginx 설정 파일

/etc/nginx/sites-available 폴더 아래에 설정 파일 생성

$ vi /etc/nginx/sites-available/[설정파일명] 


server { 
    listen 80; 
    
    server_name [도메인];
    
    root [프로젝트폴더]; 
    
    location / { 
        try_files $uri @app; 
        access_log off; 
    } 

    location /favicon.ico {
        deny all; 
        log_not_found off; 
        access_log off; 
    } 

    location @app {
        access_log /var/log/nginx/access.log;
        include uwsgi_params; 
        uwsgi_pass unix:/tmp/uwsgi.sock; 

        uwsgi_max_temp_file_size 20480m; 
        uwsgi_buffering off; 
        uwsgi_ignore_client_abort on; 
        uwsgi_buffers 2560 160k; 
        uwsgi_buffer_size 2560k; 
        uwsgi_connect_timeout 30s; 
        uwsgi_send_timeout 30s; 
        uwsgi_read_timeout 30s; 
        uwsgi_busy_buffers_size 2560k; 
        uwsgi_temp_file_write_size 2560k; 
        proxy_read_timeout 30s; 
    	proxy_connect_timeout 75s; 
    }
}

 

> 도메인 없이 localhost에서 테스트할 경우에는 server_name를 localhost로 지정

 

심볼릭 링크 생성

$ ln -s /etc/nginx/sites-available/[설정파일명] /etc/nginx/sites-enabled

 

> 절대 경로로 선언해야 함.

> 심볼릭 링크를 연결해야 사이트가 활성화된다

 

Nginx 재시작

# nginx 설정파일 문법오류 체크 
$ nginx -t 

# 위에서 success가 되었다면 
$ service nginx restart

 

> uWSGI 소켓 연결 전이라면, 서버 접속 시 502 Bad Gateway 가 뜬다.

 

Nginx + uWSGI + Flask 전체 프로세스

 

출처 : https://hackernoon.com/a-guide-to-scaling-machine-learning-models-in-production-aa8831163846

 

> 클라이언트가 요청을 보내면, 가장 먼저 Nginx가 받는다.

> 그리고 unix 소켓을 통해 nginx와 uwsgi를 연결한다.

   : nginx 설정 파일의 uwsgi_pass unix:/tmp/uwsgi.sock; 

   : uwsgi 설정파일의 socket = /tmp/uwsgi.sock

> 위의 각 설정 파일 안의 소켓을 통해 연결된다.

> nginx와 uwsgi를 socket으로 연결해서 flask 앱이 실행되는 구조

 

반응형