수색…


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

httpwsgi-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 서버를위한 몇 가지 유용한 자식 리소스.

플라스크 도포

이 튜토리얼에서는 우분투를 사용한다고 가정합니다.

  1. var/www/ 폴더를 찾습니다.
  2. 웹 응용 프로그램 폴더 만들기 mkdir myexample
  3. 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를 구성하려면 다음을 수행하십시오.

  1. 구성 파일 만들기 .ini

    nano myexample.ini

  2. 게이트웨이 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를 다음과 같이 사용할 것입니다 :

  1. uwsgi 프로토콜을 사용하여 요청을 소켓에 전달하는 기본 서버
  2. 프록시 서버 - 기본 서버 앞
  3. 캐시 서버가 성공적인 요청을 캐싱 (예 : 웹 애플리케이션 인 경우 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 게이트웨이를 시작하게하는 것입니다. 그렇지 않으면 수동으로해야합니다.

  1. Ubuntu에서 초기화 스크립트의 디렉토리를 찾고 새 스크립트를 만듭니다.

sudo nano /etc/init/myexample.conf

  1. 다음 블록을 추가하여 주석을 달아 설명이 무엇인지 설명하십시오.

    # 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



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow