Zoeken…


UWSGI gebruiken om een kolftoepassing uit te voeren

De ingebouwde werkzeug server is zeker niet geschikt voor het draaien van productieservers. De meest voor de hand liggende reden is het feit dat de werkzeug server single-threaded is en dus slechts één verzoek tegelijk kan verwerken.

Daarom willen we in plaats daarvan de uWSGI-server gebruiken. In dit voorbeeld zullen we uWSGI installeren en er een eenvoudige testapplicatie mee uitvoeren.

UWSGI installeren :

pip install uwsgi

Zo simpel is het. Als je niet zeker bent over de python-versie, maakt je pip het expliciet:

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

Laten we nu een eenvoudige testapplicatie maken:

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 de kolf is de conventionele naam voor de applicatie app maar uWSGI zoekt standaard naar de application . Daarom maken we een alias voor onze app in de laatste regel.

Nu is het tijd om de app uit te voeren:

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

U zou het bericht "Hallo uWSGI ..." moeten zien door uw browser te richten op localhost:5000

Om niet elke keer de volledige opdracht in te voeren, maken we een bestand uwsgi.ini om die configuratie op te slaan:

uwsgi.ini

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

De opties http en wsgi-file zijn hetzelfde als in de handmatige opdracht. Maar er zijn nog drie opties:

  • single-interpreter : het wordt aanbevolen om dit in te schakelen omdat dit de volgende optie kan verstoren

  • enable-threads : dit moet worden ingeschakeld als u extra threads in uw toepassing gebruikt. We gebruiken ze nu niet, maar nu hoeven we ons er geen zorgen over te maken.

  • master : de master-modus moet om verschillende redenen zijn ingeschakeld

Nu kunnen we de app uitvoeren met deze opdracht:

uwsgi --ini uwsgi.ini

Nginx installeren en instellen voor uWSGI

Nu willen we nginx installeren om onze applicatie te bedienen.

sudo apt-get install nginx  # on debian/ubuntu

Vervolgens maken we een configuratie voor onze 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;
    }
}

Dit vertelt nginx om te luisteren op poort 80 (standaard voor http) en iets op het rootpad te dienen ( / ). Daar vertellen we nginx om gewoon als proxy te fungeren en elk verzoek door te geven aan een socket met de naam flask.sock in /tmp/ .

Laten we de site inschakelen:

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

Misschien wilt u de standaardconfiguratie verwijderen als deze is ingeschakeld:

# inside /etc/sites-enabled
sudo rm default

Start vervolgens nginx opnieuw:

sudo service nginx restart

Richt uw browser op localhost en u ziet een foutmelding: 502 Bad Gateway .

Dit betekent dat nginx werkt en dat de socket ontbreekt. Dus laten we dat maken.

Ga terug naar uw uwsgi.ini bestand en open het. Voeg vervolgens deze regels toe:

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

De eerste regel vertelt uwsgi om een socket op de gegeven locatie te maken. De socket wordt gebruikt om verzoeken te ontvangen en de antwoorden terug te sturen. In de laatste regel staan we toe dat andere gebruikers (inclusief nginx) vanuit die socket kunnen lezen en schrijven.

Start uwsgi opnieuw met uwsgi --ini uwsgi.ini . Richt uw browser nu opnieuw op localhost en u zult de begroeting "Hallo uWSGI" opnieuw zien.

Merk op dat u nog steeds het antwoord kunt zien op localhost:5000 omdat uWSGI de toepassing nu via http en de socket bedient. Dus laten we de http-optie in het ini-bestand uitschakelen

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

Nu is de app alleen toegankelijk via nginx (of rechtstreeks die socket lezen :)).

Streaming vanuit kolf inschakelen

Flask heeft die functie waarmee u gegevens uit een weergave kunt streamen met behulp van generatoren.

Laten we het app.py bestand wijzigen

  • voeg toe from flask import Response
  • toevoegen from datetime import datetime
  • toevoegen from time import sleep
  • maak een nieuwe weergave:
@app.route("/time/")
def time():
    def streamer():
        while True:
            yield "<p>{}</p>".format(datetime.now())
            sleep(1)

    return Response(streamer())

Open nu uw browser op localhost/time/ . De site wordt voor altijd geladen omdat nginx wacht totdat het antwoord is voltooid. In dit geval zal het antwoord nooit compleet zijn omdat het de huidige datum en tijd voor altijd zal verzenden.

Om te voorkomen dat nginx wacht, moeten we een nieuwe regel toevoegen aan de configuratie.

Bewerk /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
    }
}

De regel uwsgi_buffering off; vertelt nginx niet te wachten tot een antwoord is voltooid.

Herstart nginx: sudo service nginx restart en kijk naar localhost/time/ again.

Nu zul je zien dat elke seconde een nieuwe regel verschijnt.

Kolftoepassing, uWGSI, Nginx instellen - Serverconfiguraties ketelsjabloon (standaard, proxy en cache)

Dit is een port van installatie die afkomstig is van DigitalOcean's tutorial over hoe u flestoepassingen kunt bedienen met uWSGI en Nginx op Ubuntu 14.04

en enkele nuttige git-bronnen voor nginx-servers.

Kolftoepassing

In deze zelfstudie wordt ervan uitgegaan dat u Ubuntu gebruikt.

  1. zoek var/www/ map.
  2. Maak uw webapp-map mkdir myexample
  3. cd myexample

optioneel Mogelijk wilt u een virtuele omgeving instellen voor het implementeren van webtoepassingen op de productieserver.

sudo pip install virtualenv

om virtuele omgeving te installeren.

virtualenv myexample

om een virtuele omgeving voor uw app in te stellen.

source myprojectenv/bin/activate 

om uw omgeving te activeren. Hier installeert u alle python-pakketten.

einde optioneel maar aanbevolen

Kolf en gateway uWSGI instellen

Installeer de kolf en de uSWGI-gateway:

pip install uwsgi flask

Voorbeeld van de kolf-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')

Maak een bestand om te communiceren tussen uw web-app en de webserver: gateway-interface [ https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface]

nano wsgi.py

importeer vervolgens uw webapp-module en voer deze uit vanaf het toegangspunt van de gateway.

from myexample import application

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

UWSGI testen:

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

UWSGI configureren:

  1. Maak een configuratiebestand .ini

    nano myexample.ini

  2. Basisconfiguratie voor 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

optioneel als u virtual env gebruikt U kunt uw virtuele omgeving deactivate .

Nginx-configuratie We gaan nginx gebruiken als:

  1. standaardserver om verzoek door te geven aan de socket, met behulp van uwsgi-protocol
  2. proxy-server voor standaardserver
  3. cacheserver om succesvolle aanvragen in de cache te plaatsen (u wilt bijvoorbeeld GET-aanvragen in de cache opslaan als uw webtoepassing)

Zoek uw sites-available map op en maak een configuratiebestand voor uw toepassing:

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

Volgend blok toevoegen, in reacties wat het doet:

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

Koppel het bestand ten slotte aan de directory met sites-enabled . Zie antwoord: [ http://serverfault.com/a/527644] voor een uitleg van beschikbare en ingeschakelde sites.

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

Je bent nu klaar met nginx. Misschien wilt u deze zeer kostbare ketelsjabloon bekijken: [ https://github.com/h5bp/server-configs-nginx]

Zeer handig voor fijnafstemming.

Test nu Nginx:

sudo nginx -t

Nginx starten:

sudo service nginx restart

Ubuntu automatiseren om uWSGI te starten Het laatste is om Ubuntu de wsgi-gateway te laten communiceren met uw toepassing, anders moet u dit handmatig doen.

  1. Zoek de map voor initialisatiescripts in Ubuntu en maak een nieuw script:

sudo nano /etc/init/myexample.conf

  1. Volgend blok toevoegen, opmerkingen in de rij om uit te leggen wat het doet

    # 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
    
    

Nu kunt u uw script activeren: sudo start myexample



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow