Flask
Nginx와 함께 uWSGI 웹 서버를 사용하여 Flask 응용 프로그램 배포
수색…
uWSGI를 사용하여 플라스크 응용 프로그램 실행
내장 werkzeug
서버는 프로덕션 서버를 실행하는 데 적합하지 않습니다. 가장 명백한 이유는 werkzeug
서버가 단일 스레드이며 따라서 한 번에 하나의 요청 만 처리 할 수 있다는 사실입니다.
이 때문에 대신 uWSGI 서버를 사용하여 응용 프로그램을 제공하려고합니다. 이 예에서는 uWSGI를 설치하고 간단한 테스트 응용 프로그램을 실행합니다.
uWSGI 설치 :
pip install uwsgi
그것만큼이나 간단합니다. 파이썬 버전에 대해 잘 모르겠다면 핏이 명시 적으로 사용합니다 :
python3 -m pip install uwsgi # for python3
python2 -m pip install uwsgi # for python2
이제 간단한 테스트 애플리케이션을 작성해 보겠습니다.
app.py
from flask import Flask
from sys import version
app = Flask(__name__)
@app.route("/")
def index():
return "Hello uWSGI from python version: <br>" + version
application = app
플라스크에서는 응용 프로그램의 기존 이름이 app
이지만 uWSGI는 기본적으로 application
을 찾습니다. 그래서 우리는 마지막 행에서 앱의 별칭을 만듭니다.
이제 앱을 실행할 차례입니다.
uwsgi --wsgi-file app.py --http :5000
브라우저에서 localhost:5000
을 지정하면 "Hello uWSGI ..."메시지가 나타납니다.
매번 전체 명령을 입력하지 않으려면 해당 구성을 저장할 uwsgi.ini
파일을 만듭니다.
uwsgi.ini
[uwsgi]
http = :9090
wsgi-file = app.py
single-interpreter = true
enable-threads = true
master = true
http
및 wsgi-file
옵션은 manual 명령과 동일합니다. 그러나 세 가지 옵션이 있습니다.
single-interpreter
: 다음 옵션을 방해 할 수 있으므로이 기능을 켜는 것이 좋습니다enable-threads
: 응용 프로그램에서 추가 스레드를 사용하는 경우 켜야합니다. 우리는 지금 그것을 사용하지 않지만 우리는 그것에 대해 걱정할 필요가 없습니다.master
: 다양한 이유로 마스터 모드가 활성화되어야합니다.
이제 다음 명령으로 앱을 실행할 수 있습니다.
uwsgi --ini uwsgi.ini
nginx 설치 및 uWSGI 설정
이제 응용 프로그램을 제공하기 위해 nginx를 설치하려고합니다.
sudo apt-get install nginx # on debian/ubuntu
그런 다음 웹 사이트 구성을 만듭니다.
cd /etc/nginx/site-available # go to the configuration for available sites
# create a file flaskconfig with your favourite editor
flaskconfig
server {
listen 80;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass unix:///tmp/flask.sock;
}
}
이것은 nginx에게 80 번 포트 (기본값은 http)를 듣고 루트 경로 ( /
)에서 뭔가를 제공하도록 지시합니다. 여기서 nginx는 단순히 프록시 역할을하고 모든 요청을 /tmp/
에있는 flask.sock
이라는 소켓에 전달합니다.
사이트를 활성화합시다.
cd /etc/nginx/sites-enabled
sudo ln -s ../sites-available/flaskconfig .
기본 구성이 활성화되어 있으면 제거하는 것이 좋습니다.
# inside /etc/sites-enabled
sudo rm default
그런 다음 nginx를 다시 시작하십시오.
sudo service nginx restart
브라우저에서 localhost
를 지정하면 502 Bad Gateway
라는 오류가 표시됩니다.
이것은 nginx가 작동하고 있지만 소켓이 없다는 것을 의미합니다. 그래서 그것을 만들 수 있습니다.
uwsgi.ini
파일로 돌아가서 엽니 다. 다음 줄을 추가하십시오.
socket = /tmp/flask.sock
chmod-socket = 666
첫 번째 라인은 uwsgi에게 주어진 위치에 소켓을 생성하라고 지시합니다. 소켓은 요청을 수신하고 응답을 되돌리기 위해 사용됩니다. 마지막 줄에서는 다른 사용자 (nginx 포함)가 소켓에서 읽고 쓸 수 있습니다.
uwsgi --ini uwsgi.ini
uwsgi를 다시 시작하십시오. 이제 브라우저에서 다시 localhost
로 이동하면 "Hello uWSGI"인사말이 다시 표시됩니다.
uWSGI가 http 와 소켓을 통해 응용 프로그램을 제공하기 때문에 여전히 localhost:5000
에서 응답을 볼 수 있습니다. 이제 ini 파일에서 http 옵션을 사용하지 않도록합시다.
http = :5000 # <-- remove this line and restart uwsgi
이제 응용 프로그램은 nginx에서만 액세스 할 수 있습니다 (또는 해당 소켓을 직접 읽는 중 :).
플라스크에서 스트리밍 사용
플라스크에는 발전기를 사용하여 뷰에서 데이터를 스트리밍 할 수있는 기능이 있습니다.
app.py
파일을 변경해 보겠습니다.
-
from flask import Response
추가 -
from datetime import datetime
추가 -
from time import sleep
추가 - 새보기를 만듭니다.
@app.route("/time/")
def time():
def streamer():
while True:
yield "<p>{}</p>".format(datetime.now())
sleep(1)
return Response(streamer())
이제 localhost/time/
에서 브라우저를 엽니 다. nginx는 응답이 완료 될 때까지 기다리기 때문에 사이트가 영원히로드됩니다. 이 경우 응답은 현재 날짜와 시간을 영원히 보낼 것이므로 결코 완료되지 않습니다.
nginx가 대기하는 것을 방지하기 위해 설정에 새로운 라인을 추가해야합니다.
/etc/nginx/sites-available/flaskconfig
편집하십시오.
server {
listen 80;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass unix:///tmp/flask.sock;
uwsgi_buffering off; # <-- this line is new
}
}
uwsgi_buffering off;
줄 uwsgi_buffering off;
nginx에게 응답이 완료 될 때까지 기다리지 말라고 지시합니다.
nginx를 재시작하십시오 : sudo service nginx restart
하고 localhost/time/
다시보십시오.
이제 매 초마다 새로운 라인이 나타납니다.
플라스크 응용 프로그램, uWGSI, Nginx - 서버 구성 보일러 템플릿 (기본값, 프록시 및 캐시) 설정
이것은 DigitalOcean의 Ubuntu 14.04에서 uWSGI 및 Nginx로 Flask 응용 프로그램을 제공하는 방법에 대한 자습서에서 제공된 설정 포팅입니다.
그리고 nginx 서버를위한 몇 가지 유용한 자식 리소스.
플라스크 도포
이 튜토리얼에서는 우분투를 사용한다고 가정합니다.
-
var/www/
폴더를 찾습니다. - 웹 응용 프로그램 폴더 만들기
mkdir myexample
-
cd myexample
선택 사항 프로덕션 서버에서 웹 응용 프로그램을 배포하기위한 가상 환경을 설정할 수 있습니다.
sudo pip install virtualenv
가상 환경을 설치합니다.
virtualenv myexample
앱의 가상 환경을 설정합니다.
source myprojectenv/bin/activate
환경을 활성화하십시오. 여기서 모든 파이썬 패키지를 설치합니다.
끝 선택 사항이지만 권장 됨
플라스크 및 게이트웨이 설치 uWSGI
플라스크 및 uSWGI 게이트웨이 설치 :
pip install uwsgi flask
myexample.py에있는 플라스크 응용 프로그램의 예 :
from flask import Flask
application = Flask(__name__)
@application.route("/")
def hello():
return "<h1>Hello World</h1>"
if __name__ == "__main__":
application.run(host='0.0.0.0')
웹 응용 프로그램과 웹 서버간에 통신 할 파일 만들기 : 게이트웨이 인터페이스 [ https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface]
nano wsgi.py
그런 다음 webapp 모듈을 가져 와서 게이트웨이 진입 점에서 실행하게하십시오.
from myexample import application
if __name__ == "__main__":
application.run()
uWSGI 테스트 :
uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi
uWSGI를 구성하려면 다음을 수행하십시오.
구성 파일 만들기
.ini
nano myexample.ini
게이트웨이 uWSGI의 기본 구성
# include header for using uwsgi
[uwsgi]
# point it to your python module wsgi.py
module = wsgi
# tell uWSGI to start a master node to serve requests
master = true
# spawn number of processes handling requests
processes = 5
# use a Unix socket to communicate with Nginx. Nginx will pass connections to uWSGI through a socket, instead of using ports. This is preferable because Nginx and uWSGI stays on the same machine.
socket = myexample.sock
# ensure file permission on socket to be readable and writable
chmod-socket = 660
# clean the socket when processes stop
vacuum = true
# use die-on-term to communicate with Ubuntu versions using Upstart initialisations: see:
# http://uwsgi-docs.readthedocs.io/en/latest/Upstart.html?highlight=die%20on%20term
die-on-term = true
가상 env를 사용하는 경우 선택 사항 가상 환경을 deactivate
할 수 있습니다.
Nginx 설정 우리는 nginx를 다음과 같이 사용할 것입니다 :
- uwsgi 프로토콜을 사용하여 요청을 소켓에 전달하는 기본 서버
- 프록시 서버 - 기본 서버 앞
- 캐시 서버가 성공적인 요청을 캐싱 (예 : 웹 애플리케이션 인 경우 GET 요청을 캐시하려는 경우)
sites-available
디렉토리를 찾고 응용 프로그램에 대한 구성 파일을 만듭니다.
sudo nano /etc/nginx/sites-available/myexample
다음 블록을 주석에 추가하십시오.
server {
# setting up default server listening to port 80
listen 8000 default_server;
server_name myexample.com; #you can also use your IP
# specify charset encoding, optional
charset utf-8;
# specify root of your folder directory
root /var/www/myexample;
# specify locations for your web apps.
# here using /api endpoint as example
location /api {
# include parameters of wsgi.py and pass them to socket
include uwsgi_params;
uwsgi_pass unix:/var/www/myexample/myexample.sock;
}
}
# Here you will specify caching zones that will be used by your virtual server
# Cache will be stored in /tmp/nginx folder
# ensure nginx have permissions to write and read there!
# See also:
# http://nginx.org/en/docs/http/ngx_http_proxy_module.html
proxy_cache_path /tmp/nginx levels=1:2 keys_zone=my_zone:10m inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
# set up the virtual host!
server {
listen 80 default_server;
# Now www.example.com will listen to port 80 and pass request to http://example.com
server_name www.example.com;
# Why not caching responses
location /api {
# set up headers for caching
add_header X-Proxy-Cache $upstream_cache_status;
# use zone specified above
proxy_cache my_zone;
proxy_cache_use_stale updating;
proxy_cache_lock on;
# cache all responses ?
# proxy_cache_valid 30d;
# better cache only 200 responses :)
proxy_cache_valid 200 30d;
# ignore headers to make cache expire
proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
# pass requests to default server on port 8000
proxy_pass http://example.com:8000/api;
}
}
마지막으로 파일을 sites-enabled
디렉토리에 연결하십시오. 사용 가능하고 사용 가능한 사이트에 대한 설명은 대답 : [ http://serverfault.com/a/527644]를 참조하십시오.
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
이제 nginx로 끝났습니다. 그러나이 매우 귀중한 보일러 템플릿 [ https://github.com/h5bp/server-configs-nginx] 을 확인하고 싶을 수 있습니다 .
미세 조정에 매우 유용합니다.
이제 Nginx 테스트 :
sudo nginx -t
Nginx 시작 :
sudo service nginx restart
Ubuntu를 자동화하여 uWSGI 시작하기 마지막으로 우분투가 응용 프로그램과 통신하는 wsgi 게이트웨이를 시작하게하는 것입니다. 그렇지 않으면 수동으로해야합니다.
- Ubuntu에서 초기화 스크립트의 디렉토리를 찾고 새 스크립트를 만듭니다.
sudo nano /etc/init/myexample.conf
다음 블록을 추가하여 주석을 달아 설명이 무엇인지 설명하십시오.
# description for the purpose of this script description "uWSGI server instance configured to serve myproject" # Tell to start on system runtime 2, 3, 4, 5. Stop at any other level (0,1,6). # Linux run levels: [http://www.debianadmin.com/debian-and-ubuntu-linux-run-levels.html] start on runlevel [2345] stop on runlevel [!2345] # Set up permissions! "User" will be the username of your user account on ubuntu. setuid user # Allow www-data group to read and write from the socket file. # www-data is normally the group Nginx and your web applications belong to. # you may have all web application projects under /var/www/ that belongs to www-data group setgid www-data # tell Ubunutu which environment to use. # This is the path of your virtual environment: python will be in this path if you installed virtualenv. Otherwise, use path of your python installation env PATH=/var/www/myexample/myexample/bin # then tell to Ubuntu to change and locate your web application directory chdir /var/www/myexample # finally execute initialisation script, that load your web app myexample.py exec uwsgi --ini myexample.ini
이제 스크립트를 활성화 할 수 있습니다 : sudo start myexample