Install Flask and uWSGI
pip
를 통해 uwsgi
와 flask
를 설치한다.
$ 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