uWSGI를 이용하여 Nginx에 Flask 연결하기

Reading time ~4 minutes

Install Flask and uWSGI

pip를 통해 uwsgiflask를 설치한다.

$ pip install uwsgi flask


Simple Example

예제로 사용하기 위한 myproject/ 라는 폴더를 하나 생성하고 앞으로 이 위치에서 작업한다.
test.py 파일을 생성하여 Hello를 반환하는 간단한 앱 하나를 생성한다.

myproject/test.py

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')

코드에 이상이 없는지 확인해보기 위해 test.py를 실행한다.
새로운 bash 창을 열고 curl 명령으로 http 요청을 날려보는 것으로 간단히 확인한다.

$ python test.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
$ curl http://localhost:5000
<h1>Hello!</h1>


uWSGI

이제 uWSGI를 이용하여 서버를 구동시키는 방법에 대해 알아보자.
우선 우리가 작성한 앱과 uwsgi를 연결시켜주기 위해 wsgi.py 파일이 필요하다.

myproject/wsgi.py

from test import application

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

실행하는 방법은 아래와 같이 하고,

$ uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi
*** Starting uWSGI 2.0.15 (64bit) on [Sun Jun  4 08:09:54 2017] ***
...

혹시 앱 이름이 application이 아니라 다른 이름으로 했을 경우, --callable 옵션을 추가해줘야 된다. ex) 앱 이름을 app으로 했을 경우, $ uwsgi –socket 0.0.0.0:5000 –protocol=http -w wsgi –callable app

결과를 확인해보기 위해 방금 전과 동일한 방식으로 http 요청을 날려본다.

$ curl http://localhost:5000
<h1>Hello!</h1>


Creating a uWSGI Configuration File

하지만 이런 긴 명령어를 매번 입력하긴 번거롭다. myproject/myproject.ini 파일을 만들어서 관리하면 편리하다.

myproject/myproject.ini

[uwsgi]

module = wsgi

socket = myproject.sock
chmod-socket = 666
vacuum = true

daemonize = /home/user/myproject/uwsgi.log

die-on-term = true

ini파일로 uwsgi를 실행해본다.

$ uwsgi --ini myproject.ini

위에 설정에 의하면 myproject.sock 파일이 없으면 생성하고 uwsgi를 종료할 때 제거한다. myproject.sock 파일의 권한은 chmod-socket 으로 지정한다.

ini 파일에 들어가는 속성들에 대한 설명은 여기에 잘 나와있다.


socket을 이용한 uWSGI와 Nginx 연결

Nginx 를 설치하는 방법은 여기의 초반부를 참고하면 된다.

위의 ini 설정에서 이미 적용했지만 uWSGI와 Nginx를 연결하기 위해 Unix socket을 이용한다. socket을 이용하는 것이 더 안전하고 빠르다. 연결하는 방법은 .sock 파일을 통해서 하는데, ini파일에서 설정한 myproject/myproject.sock 이용한다. Nginx에서도 이 파일을 통한 연결을 하도록 하는 설정이 필요하다.

ini 파일에서 지정한 myproject/myproject.sock 파일의 위치를 아래와 같이 uwsgi_pass에 입력해주면 된다.

...

server {
        listen  80;
        server_name <ip or domain>;

        ...

        location /myproject {
                include uwsgi_params;
                uwsgi_pass unix:/home/user/myproject/myproject.sock;
        }
}

변경한 내용이 문법적으로 이상이 없는지 확인을 해주고,

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

이상이 없으면 nginx를 재시작 하자.

$ sudo service nginx restart


로그 보는 방법

nginx 에러 로그는 var/log/nginx/error.log에 기록된다.

$ sudo cat /var/log/nginx/error.log
...

uwsgi의 로그를 기록하기 위해서는 먼저 에러 로그를 기록할 log 파일을 생성한다.

$ touch uwsgi.log

ini파일에 에러로그를 기록할 파일명과 함께 daemonize 설정을 추가해서 백그라운드로 돌리면서 에러를 기록하도록 한다.

/myproject/myproject.ini

...

daemonize = /home/nelp/github-webhooks/uwsgi.log
$ sudo cat myproject/uwsgi.log


참고자료

Ubuntu에서 pyenv, virtualenv, autoenv 이용하기

Mac 에서 pyenv, virtualenv, autoenv 를 이용하는 방법은 여기를 참고하길 바란다. Ubuntu에서 이용하는 방법은 설치하는 과정에서만 차이가 약간 있다. 자세한 사용 방법과 개념 설명이 필요할 때에도 위의 링크를 참고하...… Continue reading