Flask
NginxでuWSGI Webサーバーを使用してFlaskアプリケーションを導入する
サーチ…
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 restart
: sudo service nginx restart
して、 localhost/time/
もう一度見てください。
今度は、毎秒新しい行がポップアップすることがわかります。
フラスコアプリケーション、uWGSI、Nginxの設定 - サーバー構成ボイラーテンプレート(デフォルト、プロキシーおよびキャッシュ)
これはDigitalOceanのUbuntu 14.04でuWSGIとNginxを使ってFlaskアプリケーションを提供する方法のチュートリアルから作成された設定の移植です
nginxサーバ用のいくつかの有用なgitリソースがあります。
フラスコ塗布
このチュートリアルでは、Ubuntuを使用することを想定しています。
-
var/www/
folderを探します。 - Webアプリケーションフォルダを作成する
mkdir myexample
-
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を設定するには:
構成ファイルを作成する
.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
仮想環境を使用している場合はオプション仮想環境をdeactivate
することができます。
Nginxの設定私たちはnginxを次のように使います:
- uwsgiプロトコルを使用してソケットにリクエストを渡すためのデフォルトサーバー
- デフォルトサーバーの前にプロキシサーバー
- 成功したリクエストをキャッシュするためのキャッシュサーバー(たとえば、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ゲートウェイを起動させることです。そうしないと、手動で行う必要があります。
- 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