web-dev-qa-db-ja.com

flaskバックグラウンドでサーバーを開始

flask=============================================================================

#phantom.py
__author__ = 'uruddarraju'
from phantom.api.v1 import app
app.run(Host='0.0.0.0', port=8080, debug=True)

そして、このスクリプトを実行すると、印刷によって正常に実行されます。

loading config from /home/uruddarraju/virtualenvs/PHANTOMNEW/Phantom/etc/phantom/phantom.ini
* Running on http://0.0.0.0:8080/

しかし、戻ることはなく、CTRL-Cを実行するとサーバーが停止します。これを実稼働環境にデプロイしようとしており、このスタートアップをバックグラウンドで実行したいと考えています。サーバーが稼働している限り、プロセスは稼働したままです。

これを行う最良の方法は何ですか?

19
Uday

本番環境で私のお気に入りの方法は、flaskとuwsgiおよびnginxを組み合わせて永続性を維持することです。開始するための素敵なセットアップ手順を次に示します。 http://www.markjberger .com/flask-with-virtualenv-uwsgi-nginx /

Jist:

まず、vpsに最新のアップデートがあることを確認します。

Sudo apt-get update
Sudo apt-get upgrade

ここでpythonおよびvirtualenv:

Sudo apt-get install build-essential python-dev python-pip
Sudo pip install virtualenv

Webサイト用のフォルダーを作成します。

Sudo mkdir -p /var/www/mysite
Sudo chown -R <your user id> /var/www/mysite
cd /var/www/mysite

Virtualenvをセットアップし、flaskをインストールします。

virtualenv .env --no-site-packages
source .env/bin/activate
pip install flask

flaskアプリをこのフォルダーに配置します。ホストが0.0.0.0に設定され、__name__ == '__main__':。アプリが関数内にある場合、uwsgiはそれを呼び出すことができません。

ここで、flask開発サーバーでアプリをテストして、すべてがこれまでに機能しているかどうかを確認してください。すべてが正常に実行される場合は、nginxとuwsgiをインストールします。

deactivate
Sudo apt-get install nginx uwsgi uwsgi-plugin-python

次に、nginxがuwsgiと通信するためのソケットファイルを作成する必要があります。

cd /tmp/
touch mysite.sock
Sudo chown www-data mysite.sock

Mysite.sockの所有者をwww-dataに変更すると、nginxはソケットに書き込むことができます。あとは、nginxとuwsgiの構成ファイルを追加するだけです。まず、nginxのデフォルト設定を削除します。

cd /etc/nginx/sites-available
Sudo rm default

新しい構成ファイルmysiteを作成し、次を追加します。

server {
    listen 80;
    server_tokens off;
    server_name www.mysite.com mysite.com;

     location / {
         include uwsgi_params;
         uwsgi_pass unix:/tmp/mysite.sock;
     }

     location /static {
         alias /var/www/mysite/static;
     }

     ## Only requests to our Host are allowed
     if ($Host !~ ^(mysite.com|www.mysite.com)$ ) {
        return 444;
     }
}

サイトを有効にするには、構成ファイルを/ etc/nginx/sites-enabled /にリンクする必要があります。

Sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/mysite

プロセスはuwsgiでも同様です。ファイル/etc/uwsgi/apps-available/mysite.iniを作成し、次を追加します。

[uwsgi]
vhost = true
socket = /tmp/mysite.sock
venv = /var/www/mysite/.env
chdir = /var/www/mysite
module = app
callable = app

Moduleは、pythonスクリプトの名前であり、callableは、flaskインスタンスの名前です。したがって、flaskサイト次のようなmysite.pyというファイルにありました。

from flask import Flask
my_app = Flask(__name__)

@my_app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    my_app.run(Host='0.0.0.0')

Mysite.iniファイルは次のようになります。

module = mysite
callable = my_app

構成ファイルをenabled-appsフォルダーにリンクします。

Sudo ln -s /etc/uwsgi/apps-available/mysite.ini /etc/uwsgi/apps-enabled/mysite.ini

最後に、nginxとuwsgiを再起動します。

Sudo service nginx restart
Sudo service uwsgi restart
14
RaphDG
$ python phantom.py &

おそらくバックグラウンドで実行する最も簡単な方法です。 @LukasGrafが言及しているように本番環境に移行する場合は、app.run()サーバーを使用してflaskアプリを使用するべきではありません。

17
Joran Beasley

Supervisord を試してください。指定されたユーザーとしてコマンドを開始し、終了後にコマンドを再起動します。設定は、あなたがやりたいことに対して非常に簡単です。

0
allo

おそらくこれを行うための最良の方法は、@ RaphDGが答えたようにnginxの背後にありますが、個人使用のためにバックグラウンドで実行したい場合は、ログシステムの最後に「&」のみを使用することはできませんコマンドライン、さらにロガーはWerkzeugライブラリの内部ロガーであることがわかりました。

これを回避するには、次の手順を実行します(以下のコード):

  1. インポートwerkzeug._internal
  2. デミロガークラスを作成する
  3. 新しいクラスをwerkzeug._internal._log(ログクラス)に割り当てます

通知とロガーを回避し、このプロセスをバックグラウンドで実行できるようにします(「&」を使用)

コード:

import werkzeug._internal

def demi_logger(type, message,*args,**kwargs):
    pass

__ main __の最初の行:

werkzeug._internal._log = demi_logger
0
Bizzu