サーチ…


uWSGIを使用してフラスコのアプリケーションを実行する

組み込みのwerkzeugサーバーは、 werkzeugサーバーのwerkzeugは適していません。最も明白な理由は、 werkzeugサーバーがシングルスレッドであるため、一度に1つの要求しか処理できないという事実です。

このため、代わりにアプリケーションを提供するためにuWSGIサーバーを使用したいと考えています。この例では、uWSGIをインストールし、簡単なテストアプリケーションを実行します。

uWSGIのインストール

pip install uwsgi

それはそれと同じくらい簡単です。 Pythonのバージョンについて確信が持てない場合は、pipが明示的に使用します:

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 ..."というメッセージが表示されますlocalhost:5000

毎回完全なコマンドを入力しないために、設定を保存するuwsgi.iniファイルを作成します。

uwsgi.ini

[uwsgi]
http = :9090
wsgi-file = app.py
single-interpreter = true
enable-threads = true
master = true

httpおよびwsgi-fileオプションは、manualコマンドと同じです。しかし、さらに3つの選択肢があります:

  • 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;
    }
}

これは、ポート80(デフォルトはhttp)でリッスンし、ルートパス( / )に何かを提供するようにnginxに指示します。ここでは、単にnginxにプロキシとして動作するように指示し、すべての要求を/tmp/あるflask.sockというソケットに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を再起動してuwsgi --ini uwsgi.ini 。ブラウザに再度localhostを指定すると、再び「Hello uWSGI」という挨拶が表示されます。

uWSGIはhttp ソケット経由でアプリケーションを提供するため、 localhost:5000応答を見ることができます。ですから、iniファイルのhttpオプションを無効にしましょう

http = :5000  # <-- remove this line and restart uwsgi

今、アプリはnginxからしかアクセスできない(またはそのソケットを直接読む:))。

フラスコからのストリーミングを有効にする

Flaskには、ジェネレータを使用してビューからデータをストリームできるようにする機能があります。

app.pyファイルを変更しましょう

  • from flask import Response追加
  • from datetime import datetime追加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に指示します。

sudo service nginx restartsudo service nginx restartして、 localhost/time/もう一度見てください。

今度は、毎秒新しい行がポップアップすることがわかります。

フラスコアプリケーション、uWGSI、Nginxの設定 - サーバー構成ボイラーテンプレート(デフォルト、プロキシーおよびキャッシュ)

これはDigitalOceanのUbuntu 14.04でuWSGIとNginxを使ってFlaskアプリケーションを提供する方法のチュートリアルから作成された設定の移植です

nginxサーバ用のいくつかの有用なgitリソースがあります。

フラスコ塗布

このチュートリアルでは、Ubuntuを使用することを想定しています。

  1. var/www/ folderを探します。
  2. Webアプリケーションフォルダを作成するmkdir myexample
  3. cd myexample

オプションプロダクションサーバにWebアプリケーションをデプロイするための仮想環境を設定できます。

sudo pip install virtualenv

仮想環境をインストールします。

virtualenv myexample

あなたのアプリのための仮想環境を設定する。

source myprojectenv/bin/activate 

環境をアクティブにします。ここでは、すべてのPythonパッケージをインストールします。

終了オプションですが推奨

フラスコとゲートウェイをセットアップする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')

WebアプリケーションとWebサーバー間で通信するためのファイルを作成します。ゲートウェイインターフェイス[ https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface]

nano wsgi.py

Webアプリケーションモジュールをインポートし、ゲートウェイエントリポイントから実行させます。

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

仮想環境を使用している場合はオプション仮想環境をdeactivateすることができます。

Nginxの設定私たちはnginxを次のように使います:

  1. uwsgiプロトコルを使用してソケットにリクエストを渡すためのデフォルトサーバー
  2. デフォルトサーバーの前にプロキシサーバー
  3. 成功したリクエストをキャッシュするためのキャッシュサーバー(たとえば、Webアプリケーションの場合は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ディレクトリにリンクします。有効なサイトと有効なサイトの説明については、answer:[ 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を起動する最後に、Ubuntuがあなたのアプリケーションと通信する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