Flask uWSGI Nginx
2016-08-29 00:00:00Python 기반의 Webserver 구축에 대한 내용입니다.
Ubuntu 14.04 (AWS EC2)에서 테스트 하였습니다.
제가 참조한 문서들입니다.
EC2 인스턴스에 Python 2.6 환경을 모두 통일 시켰기 때문에 따로 Virtualenv 작업을 하지 않고 sudo -H 옵션을 이용한 설치를 하였습니다.
여러 프로젝트가 진행된 경우 python 및 pip 버전을 확인하시고 다르다면 virtualenv를 생성하고 그 내부에 설치를 진행하셔야 합니다.
여러 프로젝트가 진행된 경우 python 및 pip 버전을 확인하시고 다르다면 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로 접속할 수 있습니다.
웹페이지에 접속할 경우 경고창이 뜨며 무시하고 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 &