Flask uWSGI Nginx

2016-08-29 00:00:00
aws flask uwsgi nginx

Python 기반의 Webserver 구축에 대한 내용입니다.

Ubuntu 14.04 (AWS EC2)에서 테스트 하였습니다.

제가 참조한 문서들입니다.

Nginx 설정

uWSGI docs

Nginx HTTPS

EC2 인스턴스에 Python 2.6 환경을 모두 통일 시켰기 때문에 따로 Virtualenv 작업을 하지 않고 sudo -H 옵션을 이용한 설치를 하였습니다.
여러 프로젝트가 진행된 경우 python 및 pip 버전을 확인하시고 다르다면 virtualenv를 생성하고 그 내부에 설치를 진행하셔야 합니다.

Flask Virtualenv


먼저 패키지 업데이트를 진행합니다.

sudo apt-get update
sudo apt-get upgrade

Flask uWSGI Nginx를 설치합니다.

sudo apt-get install python-pip python-dev
sudo apt-get install nginx
sudo -H pip install uwsgi flask

홈 디렉터리와 /var/www 디렉터리를 연결하기 위해 디렉터리를 생성하고 소유권한을 부여합니다.

sudo mkdir -p /var/www/myflask /var/log/uwsgi
sudo chown -R ubuntu:ubuntu /var/www /var/log/uwsgi

홈 디렉터리에 작업할 공간을 만들어서 심볼릭 링크로 연결합니다.

mkdir ~/myflask
ln -s /var/www/myflask ~

uWSGI configuration

이제 uWSGI를 위한 application을 만들어 줍니다.

cd ~/myflask
vi hello.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
  return 'Index Page'

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

uWSGI 소켓을 생성하기 위해 ini 파일을 생성합니다.

cd ~/myflask
vi uwsgi.ini
[uwsgi]
master = true
shared-socket = 0.0.0.0:443
socket = /var/www/%n.sock
chmod-socket = 666
logto = /var/log/uwsgi/%n.log
plugin = python
enable-threads = true
single-interpreter = true
module = hello
callable = app
manage-script-name = true
vacuum = true
env = HTTPS=on

HTTPS Nginx

HTTPS를 사용하는 이유는 추후에 WebRTC를 이 웹서버에 사용하기 위함입니다.

mkdir ~/ssl
cd ~/ssl
openssl genrsa -out privkey.pem 2048
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
테스트를 위한 서명되지 않은 인증서입니다.
웹페이지에 접속할 경우 경고창이 뜨며 무시하고 https로 접속할 수 있습니다.
Let's Encrypt를 이용하는 방법도 있습니다.

cacert.pem 파일을 생성할 때 정보를 묻는데 대괄호 안이 기본값이므로 계속 엔터를 입력하면 됩니다.

Nginx configuration

sudo vi /etc/nginx/sites-available/myflask
upstream uwsgicluster {
  server unix:///var/www/uwsgi.sock;
  # server 127.0.0.1
}

server {
  listen 80;
  server_name _;
  rewrite ^ https://$http_host$request_uri? permanent;
}

server {
  listen 443;
  server_name _;
  ssl on;
  ssl_certificate /home/ubuntu/ssl/cacert.pem;
  ssl_certificate_key /home/ubuntu/ssl/privkey.pem;
  access_log /var/log/uwsgi/access_log;

  location / {
    root /var/www/myflask;
    uwsgi_pass uwsgicluster;
    include uwsgi_params;
    uwsgi_param UWSGI_SCRIPT hello.py;
  }

  location /static {
    alias /var/www/myflask/static;

    if (!-f $request_filename) {
      uwsgi_pass uwsgicluster;
    }
  }
}
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/myflask /etc/nginx/sites-enabled/myflask

Service

sudo service nginx start
uwsgi --ini ~/myflask/uwsgi.ini &