Flask
Flask-Anwendung mit dem uWSGI-Webserver mit Nginx bereitstellen
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 wirdenable-threads
: Dies mussenable-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
: Dermaster
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.
-
var/www/
Ordnervar/www/
. - Erstellen Sie Ihren Web-App-Ordner "
mkdir myexample
-
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:
Erstellen Sie eine Konfigurationsdatei
.ini
nano myexample.ini
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:
- Standardserver, um die Anforderung an das Socket zu übergeben, wobei das uwsgi-Protokoll verwendet wird
- Proxy-Server vor dem Standard-Server
- 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.
- Suchen Sie das Verzeichnis für Initialisierungsskripts in Ubuntu und erstellen Sie ein neues Skript:
sudo nano /etc/init/myexample.conf
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