wake-up-neo.com

Flask Server im Hintergrund starten

Ich habe eine Flaschenapplikation, die ich derzeit auf folgende Weise in Betrieb nehme:

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

und wenn ich dieses Skript starte, wird es erfolgreich durch Drucken ausgeführt:

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

Es kommt aber nie zurück und wenn ich eine CTRL-C mache, stoppt der Server. Ich versuche, dies für die Produktion bereitzustellen und möchte diesen Start im Hintergrund ausführen, in dem der Prozess aktiv bleibt, solange der Server aktiv ist.

Was ist der beste Weg, dies zu tun?

18
Uday

Am liebsten mache ich es in der Produktion, Kolben mit uwsgi und nginx zu kombinieren, um die Persistenz zu erhalten. Hier sind nette Installationsanweisungen für den Einstieg: http://www.markjberger.com/flask-with-virtualenv-uwsgi-nginx/

Jist:

Stellen Sie zunächst sicher, dass Ihr vps die neuesten Updates enthält:

Sudo apt-get update
Sudo apt-get upgrade

Installieren Sie jetzt Python und Virtualenv:

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

Erstellen Sie einen Ordner für Ihre Website:

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

Virtualenv einrichten und Flasche installieren:

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

Legen Sie Ihre Flaschen-App in diesen Ordner. Stellen Sie sicher, dass Ihr Host auf 0.0.0.0 eingestellt ist und sich Ihre App unter __== '__main__': befindet. Wenn sich Ihre App in einer Funktion befindet, kann sie von uwsgi nicht aufgerufen werden.

Jetzt ist ein guter Zeitpunkt, um Ihre App mit dem Flask Development Server zu testen, um zu sehen, ob alles soweit funktioniert. Wenn alles reibungslos läuft, installieren Sie nginx und uwsgi:

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

Als nächstes müssen wir eine Socket-Datei erstellen, damit nginx mit uwsgi kommunizieren kann:

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

Durch Ändern des Besitzers von mysite.sock in www-data kann nginx in den Socket schreiben. Jetzt müssen wir nur noch unsere Konfigurationsdateien für nginx und uwsgi hinzufügen. Löschen Sie zunächst die Standardkonfiguration für nginx:

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

Erstellen Sie eine neue Konfigurationsdatei mysite und fügen Sie Folgendes hinzu:

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

Um die Site zu aktivieren, müssen wir unsere Konfigurationsdatei mit/etc/nginx/sites-enabled/verknüpfen:

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

Der Prozess ist für uwsgi ähnlich. Erstellen Sie die Datei /etc/uwsgi/apps-available/mysite.ini und fügen Sie Folgendes hinzu:

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

Modul ist der Name Ihres Python-Skripts und aufrufbar ist der Name Ihrer Flascheninstanz. Wenn sich Ihre Flaschen-Site in einer Datei namens mysite.py befand, sah dies folgendermaßen aus:

from flask import Flask
my_app = Flask(__name__)

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

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

Ihre mysite.ini-Datei wäre:

module = mysite
callable = my_app

Verknüpfen Sie die Konfigurationsdatei mit dem Ordner mit den aktivierten Apps:

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

Starten Sie schließlich Nginx und Uwsgi neu:

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

Ist wahrscheinlich der einfachste Weg, um es im Hintergrund laufen zu lassen. Das heißt, Sie sollten den app.run () -Server nicht für die Bereitstellung Ihrer Flaschen-App verwenden, wenn Sie sie als @LukasGraf in die Produktion umsetzen (und ich glaube deren Dokumentation). 

13
Joran Beasley

Versuchen Sie Supervisord . Es startet Befehle als angegebenen Benutzer und startet sie nach dem Beenden erneut. Die Konfiguration ist sehr einfach für das, was Sie tun möchten.

0
allo

Wahrscheinlich ist der beste Weg, dies zu tun, hinter nginx, wie @RaphDG geantwortet hat Wenn Sie es jedoch für den persönlichen Gebrauch im Hintergrund ausführen möchten, habe ich festgestellt, dass das -Logging-System Sie nicht nur mit "&" verwenden kann. "Am Ende der Befehlszeile habe ich außerdem festgestellt, dass der Logger ein interner Logger der Werkzeug Bibliothek ist.

Um dies zu umgehen, können Sie die nächsten Schritte ausführen (code unten ):

  1. import werkzeug._internal
  2. erstellen Sie eine Demi-Logger-Klasse
  3. Weisen Sie die neue Klasse werkzeug._internal._log (Protokollklasse) zu.

Es wird Benachrichtigungen und Loggern umgehen und Sie können diesen Prozess im Hintergrund ausführen (mit "&").

code:

import werkzeug._internal

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

die erste Zeile in der_MAIN_:

werkzeug._internal._log = demi_logger
0
Bizzu