Suche…


Verwenden von uWSGI zum Ausführen einer Flaschenanwendung

Der eingebaute werkzeug Server ist sicherlich nicht für den Betrieb von Produktionsservern geeignet. Der naheliegendste Grund ist die Tatsache, dass der werkzeug Server Single-Threaded ist und somit nur jeweils eine Anfrage bearbeiten kann.

Aus diesem Grund möchten wir stattdessen den uWSGI-Server verwenden, um unsere Anwendung bereitzustellen. In diesem Beispiel werden wir uWSGI installieren und damit eine einfache Testanwendung ausführen.

UWSGI installieren :

pip install uwsgi

So einfach ist das. Wenn Sie sich nicht sicher sind, welche Python-Version Ihr Pip verwendet, machen Sie das explizit:

python3 -m pip install uwsgi  # for python3
python2 -m pip install uwsgi  # for python2

Nun erstellen wir eine einfache Testanwendung:

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

In flask ist der übliche Name für die Anwendung app aber uWSGI sucht standardmäßig nach der application . Deshalb erstellen wir in der letzten Zeile einen Alias ​​für unsere App.

Nun ist es an der Zeit, die App auszuführen:

uwsgi --wsgi-file app.py --http :5000

Sie sollten die Meldung "Hallo uWSGI ..." sehen, indem Sie Ihren Browser auf localhost:5000

Um nicht jedes Mal den vollständigen Befehl einzugeben, erstellen wir eine uwsgi.ini Datei zum Speichern dieser Konfiguration:

uwsgi.ini

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

Die Optionen http und wsgi-file sind dieselben wie im manuellen Befehl. Es gibt jedoch drei weitere Optionen:

  • single-interpreter : Es wird empfohlen, diese Option zu aktivieren, da die nächste Option möglicherweise beeinträchtigt wird

  • enable-threads : Dies muss enable-threads sein, wenn Sie in Ihrer Anwendung zusätzliche Threads verwenden. Wir benutzen sie jetzt nicht, aber jetzt müssen wir uns keine Sorgen machen.

  • master : Der master sollte aus verschiedenen Gründen aktiviert sein

Jetzt können wir die App mit diesem Befehl ausführen:

uwsgi --ini uwsgi.ini

Nginx installieren und für uWSGI einrichten

Nun möchten wir nginx installieren, um unsere Anwendung zu bedienen.

sudo apt-get install nginx  # on debian/ubuntu

Dann erstellen wir eine Konfiguration für unsere Website

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

Dies weist nginx an, Port 80 (Standardeinstellung für http) zu überwachen und etwas im Root-Pfad ( / ) zu liefern. Dort flask.sock wir nginx an, einfach als Proxy zu fungieren und jede Anforderung an einen Socket namens flask.sock sich in /tmp/ .

Lassen Sie uns die Site aktivieren:

cd /etc/nginx/sites-enabled
sudo ln -s ../sites-available/flaskconfig .

Möglicherweise möchten Sie die Standardkonfiguration entfernen, wenn sie aktiviert ist:

# inside /etc/sites-enabled
sudo rm default

Dann nginx neu starten:

sudo service nginx restart

localhost Sie Ihren Browser auf localhost und es wird ein Fehler angezeigt: 502 Bad Gateway .

Dies bedeutet, dass Nginx läuft und der Sockel fehlt. Also lasst uns das schaffen.

Gehen Sie zurück zur Datei uwsgi.ini und öffnen Sie sie. Fügen Sie dann diese Zeilen hinzu:

socket = /tmp/flask.sock
chmod-socket = 666

Die erste Zeile weist uwsgi an, an der angegebenen Stelle einen Socket zu erstellen. Der Socket wird zum Empfangen von Anfragen und zum Senden der Antworten verwendet. In der letzten Zeile erlauben wir anderen Benutzern (einschließlich nginx), von diesem Socket lesen und schreiben zu können.

Starten Sie uwsgi erneut mit uwsgi --ini uwsgi.ini . Richten Sie Ihren Browser jetzt erneut auf localhost und Sie sehen die Begrüßung "Hallo uWSGI".

Beachten Sie, dass Sie die Antwort immer noch auf localhost:5000 da uWSGI die Anwendung jetzt über http und den Socket bedient. Deaktivieren Sie also die http-Option in der Ini-Datei

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

Jetzt kann auf die App nur von nginx aus zugegriffen werden (oder diesen Socket direkt lesen :)).

Aktivieren Sie das Streaming aus der Flasche

Flask bietet diese Funktion, mit der Sie Daten aus einer Ansicht mit Generatoren streamen können.

Lassen Sie uns die app.py Datei ändern

  • from flask import Response hinzufügen
  • Hinzufügen from datetime import datetime
  • fügen Sie from time import sleep
  • Neue Ansicht erstellen:
@app.route("/time/")
def time():
    def streamer():
        while True:
            yield "<p>{}</p>".format(datetime.now())
            sleep(1)

    return Response(streamer())

Öffnen Sie jetzt Ihren Browser unter localhost/time/ . Die Site wird für immer geladen, da Nginx wartet, bis die Antwort vollständig ist. In diesem Fall ist die Antwort nie vollständig, da das aktuelle Datum und die Uhrzeit für immer gesendet werden.

Um zu verhindern, dass Nginx wartet, müssen wir der Konfiguration eine neue Zeile hinzufügen.

Bearbeiten Sie /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
    }
}

Die Zeile uwsgi_buffering off; weist nginx an, nicht zu warten, bis eine Antwort abgeschlossen ist.

Starten Sie nginx neu: sudo service nginx restart und sehen Sie sich localhost/time/ erneut an.

Jetzt sehen Sie, dass jede Sekunde eine neue Zeile erscheint.

Flask-Anwendung, uWGSI, Nginx - Serverkonfigurations-Kesselvorlage einrichten (Standard, Proxy und Cache)

Dies ist eine Portierung von Setups , die aus dem DigitalOcean-Tutorial " How To Serve Flask Applications" mit uWSGI und Nginx auf Ubuntu 14.04 stammen

und einige nützliche Git-Ressourcen für Nginx-Server.

Kolbenanwendung

Dieses Tutorial setzt voraus, dass Sie Ubuntu verwenden.

  1. var/www/ Ordner var/www/ .
  2. Erstellen Sie Ihren Web-App-Ordner " mkdir myexample
  3. cd myexample

optional Sie möchten möglicherweise eine virtuelle Umgebung für die Bereitstellung von Webanwendungen auf einem Produktionsserver einrichten.

sudo pip install virtualenv

um eine virtuelle Umgebung zu installieren.

virtualenv myexample

Einrichten einer virtuellen Umgebung für Ihre App.

source myprojectenv/bin/activate 

um deine Umgebung zu aktivieren. Hier werden Sie alle Python-Pakete installieren.

Ende optional aber empfohlen

Richten Sie die Flasche und das Gateway uWSGI ein

Installieren Sie die Flasche und das uSWGI-Gateway:

pip install uwsgi flask

Beispiel einer Flaschen-App in 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')

Erstellen Sie eine Datei für die Kommunikation zwischen Ihrer Web-App und dem Webserver: Gateway-Schnittstelle [ https://de.wikipedia.org/wiki/Web_Server_Gateway_Interface]

nano wsgi.py

Dann importieren Sie Ihr Webapp-Modul und lassen Sie es vom Gateway-Einstiegspunkt ausführen.

from myexample import application

if __name__ == "__main__":
    application.run()

UWSGI testen:

uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi

So konfigurieren Sie uWSGI:

  1. Erstellen Sie eine Konfigurationsdatei .ini

    nano myexample.ini

  2. Grundkonfiguration für Gateway 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

optional, wenn Sie eine virtuelle Umgebung verwenden Sie können Ihre virtuelle Umgebung deactivate .

Nginx-Konfiguration Wir verwenden Nginx als:

  1. Standardserver, um die Anforderung an das Socket zu übergeben, wobei das uwsgi-Protokoll verwendet wird
  2. Proxy-Server vor dem Standard-Server
  3. Cache-Server zum Zwischenspeichern erfolgreicher Anforderungen (z. B. möchten Sie GET-Anforderungen zwischenspeichern, wenn Ihre Webanwendung verwendet wird)

Suchen Sie nach dem Verzeichnis für sites-available und erstellen Sie eine Konfigurationsdatei für Ihre Anwendung:

sudo nano /etc/nginx/sites-available/myexample

Fügen Sie in den Kommentaren folgenden Block hinzu:

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

Zum Schluss verknüpfen Sie die Datei mit dem für sites-enabled Verzeichnis. Eine Erläuterung der verfügbaren und aktivierten Sites finden Sie in der Antwort: [ http://serverfault.com/a/527644].

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

Sie sind jetzt mit Nginx fertig. Sie können jedoch diese sehr wertvolle Kesselvorlage ausprobieren: [ https://github.com/h5bp/server-configs-nginx]

Sehr nützlich für die Feinabstimmung.

Testen Sie jetzt Nginx:

sudo nginx -t

Nginx starten:

sudo service nginx restart

Automatisieren Sie Ubuntu, um uWSGI zu starten. Als letztes muss Ubuntu das wsgi-Gateway starten, das mit Ihrer Anwendung kommuniziert.

  1. Suchen Sie das Verzeichnis für Initialisierungsskripts in Ubuntu und erstellen Sie ein neues Skript:

sudo nano /etc/init/myexample.conf

  1. Fügen Sie den folgenden Block und Kommentare hinzu, um die Funktionsweise zu erläutern

    # 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
    
    

Jetzt können Sie Ihr Skript aktivieren: sudo start myexample



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow