खोज…


एक फ्लास्क एप्लिकेशन को चलाने के लिए uWSGI का उपयोग करना

अंतर्निहित werkzeug सर्वर निश्चित रूप से उत्पादन सर्वर चलाने के लिए उपयुक्त नहीं है। सबसे स्पष्ट कारण तथ्य यह है कि werkzeug सर्वर एकल-थ्रेडेड है और इस प्रकार एक समय में केवल एक अनुरोध को संभाल सकता है।

इस वजह से हम इसके बजाय हमारे आवेदन की सेवा के लिए uWSGI सर्वर का उपयोग करना चाहते हैं। इस उदाहरण में हम uWSGI स्थापित करेंगे और इसके साथ एक सरल परीक्षण एप्लिकेशन चलाएंगे।

स्थापना uWSGI :

pip install uwsgi

यह बहुत ही सरल है। यदि आप अजगर संस्करण के बारे में अनिश्चित हैं तो आपके पाइप उपयोग स्पष्ट कर देते हैं:

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

अब एक सरल परीक्षा आवेदन बनाते हैं:

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

फ्लास्क में app लिए पारंपरिक नाम app लेकिन uWSGI डिफ़ॉल्ट रूप से application है। इसलिए हम अपने ऐप के लिए अंतिम पंक्ति में एक उपनाम बनाते हैं।

अब यह ऐप चलाने का समय है:

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

आपको अपने ब्राउज़र को localhost:5000 को इंगित करके "हैलो uWSGI ..." संदेश देखना चाहिए localhost:5000

पूरी कमांड को टाइप करने के लिए हर बार हम उस कॉन्फ़िगरेशन को संग्रहीत करने के लिए एक uwsgi.ini फ़ाइल uwsgi.ini :

uwsgi.ini

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

http और wsgi-file विकल्प मैनुअल कमांड के समान ही हैं। लेकिन तीन और विकल्प हैं:

  • single-interpreter : इसे चालू करने की अनुशंसा की जाती है क्योंकि यह अगले विकल्प के साथ हस्तक्षेप कर सकता है

  • enable-threads : यदि आपको अपने एप्लिकेशन में अतिरिक्त थ्रेड्स का उपयोग करना है तो इसे चालू करना होगा। हम अभी उनका उपयोग नहीं करते हैं, लेकिन अब हमें इसके बारे में चिंता करने की आवश्यकता नहीं है।

  • master : मास्टर मोड को विभिन्न कारणों से सक्षम किया जाना चाहिए

अब हम इस कमांड के साथ ऐप चला सकते हैं:

uwsgi --ini uwsgi.ini

Nginx को स्थापित करना और इसे uWSGI के लिए सेट करना

अब हम अपने आवेदन की सेवा के लिए nginx स्थापित करना चाहते हैं।

sudo apt-get install nginx  # on debian/ubuntu

फिर हम अपनी वेबसाइट के लिए एक कॉन्फ़िगरेशन बनाते हैं

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

यह पोर्ट 80 (http के लिए डिफ़ॉल्ट) पर सुनने और रूट पथ ( / ) पर कुछ परोसने के लिए nginx को बताता है। वहाँ हम nginx को केवल एक छद्म के रूप में कार्य करने के लिए कहते हैं और प्रत्येक अनुरोध को एक flask.sock जिसे flask.sock /tmp/ में स्थित कहा जाता है।

आइए साइट को सक्षम करें:

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

यदि आप सक्षम है तो आप डिफ़ॉल्ट कॉन्फ़िगरेशन को हटाना चाहते हैं:

# inside /etc/sites-enabled
sudo rm default

फिर नगीने को फिर से शुरू करें:

sudo service nginx restart

अपने ब्राउज़र को localhost इंगित करें और आपको एक त्रुटि दिखाई देगी: 502 Bad Gateway

इसका मतलब है कि नगनेक्स ऊपर और काम कर रहा है लेकिन सॉकेट गायब है। तो चलिए बनाते हैं।

अपनी uwsgi.ini फ़ाइल पर वापस जाएं और इसे खोलें। फिर इन पंक्तियों को जोड़ें:

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

पहली पंक्ति दिए गए स्थान पर सॉकेट बनाने के लिए uwsgi को बताती है। सॉकेट का उपयोग अनुरोधों को प्राप्त करने और प्रतिक्रियाओं को वापस भेजने के लिए किया जाएगा। अंतिम पंक्ति में हम अन्य उपयोगकर्ताओं (नग्नेक्स सहित) को उस सॉकेट से पढ़ने और लिखने में सक्षम होने की अनुमति देते हैं।

Uwsgi को फिर से uwsgi --ini uwsgi.ini uwsgi.ini से शुरू करें। अब अपने ब्राउज़र को फिर से localhost इंगित करें और आप फिर से "हैलो uWSGI" ग्रीटिंग देखेंगे।

ध्यान दें कि आप अभी भी स्थानीयहोस्ट पर प्रतिक्रिया देख सकते हैं localhost:5000 क्योंकि uWSGI अब http और सॉकेट के माध्यम से आवेदन करता है। तो आइए ini फाइल में http ऑप्शन को डिसेबल करें

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

अब एप्लिकेशन को केवल nginx (या उस सॉकेट को सीधे पढ़ना :)) से एक्सेस किया जा सकता है।

फ्लास्क से स्ट्रीमिंग सक्षम करें

फ्लास्क में वह सुविधा होती है जो आपको जनरेटर का उपयोग करके डेटा को एक दृश्य से स्ट्रीम करने देती है।

चलिए app.py file को app.py हैं

  • from flask import Response
  • from datetime import datetime जोड़ें
  • from time import sleep जोड़ें
  • एक नया दृश्य बनाएँ:
@app.route("/time/")
def time():
    def streamer():
        while True:
            yield "<p>{}</p>".format(datetime.now())
            sleep(1)

    return Response(streamer())

अब अपना ब्राउज़र localhost/time/ पर खोलें। साइट हमेशा के लिए लोड हो जाएगी क्योंकि प्रतिक्रिया पूर्ण होने तक नेग्नेक्स इंतजार करता है। इस मामले में प्रतिक्रिया कभी पूरी नहीं होगी क्योंकि यह वर्तमान तिथि और समय को हमेशा के लिए भेज देगा।

Nginx को प्रतीक्षा करने से रोकने के लिए हमें कॉन्फ़िगरेशन में एक नई पंक्ति जोड़ने की आवश्यकता है।

संपादित करें /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
    }
}

लाइन uwsgi_buffering off; एक प्रतिक्रिया पूर्ण होने तक इंतजार न करने के लिए नगनेक्स को बताता है।

पुनरारंभ करें nginx: sudo service nginx restart और localhost/time/ फिर से देखें।

अब आप देखेंगे कि हर सेकंड एक नई लाइन पॉप अप होती है।

फ्लास्क एप्लिकेशन सेट करें, uWGSI, Nginx - सर्वर कॉन्फ़िगरेशन बॉयलर टेम्पलेट (डिफ़ॉल्ट, प्रॉक्सी और कैश)

यह UbuntuO 14.04 को uWSGI और Nginx के साथ फ्लास्क एप्लिकेशन को कैसे परोसें , के DigitalOcean के ट्यूटोरियल से सेट की गई पोर्टिंग है।

और nginx सर्वर के लिए कुछ उपयोगी गिट संसाधन।

फ्लास्क एप्लीकेशन

यह ट्यूटोरियल मान लेता है कि आप उबंटू का उपयोग करते हैं।

  1. var/www/ फ़ोल्डर का पता लगाएं।
  2. अपना वेब ऐप फ़ोल्डर बनाएं mkdir myexample
  3. cd myexample

वैकल्पिक आप उत्पादन सर्वर पर वेब अनुप्रयोगों को तैनात करने के लिए आभासी वातावरण सेट करना चाह सकते हैं।

sudo pip install virtualenv

आभासी वातावरण स्थापित करने के लिए।

virtualenv myexample

अपने ऐप के लिए वर्चुअल वातावरण सेट अप करने के लिए।

source myprojectenv/bin/activate 

अपने पर्यावरण को सक्रिय करने के लिए। यहां आप सभी अजगर पैकेज स्थापित करेंगे।

वैकल्पिक वैकल्पिक लेकिन अनुशंसित

फ्लास्क और गेटवे uWSGI सेट करें

फ्लास्क और uSWGI गेटवे स्थापित करें:

pip install uwsgi flask

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')

अपने वेब ऐप और वेब सर्वर के बीच संवाद करने के लिए फ़ाइल बनाएँ: गेटवे इंटरफ़ेस [ https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface]

nano wsgi.py

फिर अपने वेबप मॉड्यूल को आयात करें और इसे गेटवे एंट्री पॉइंट से चलाएं।

from myexample import application

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

UWSGI का परीक्षण करने के लिए:

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

UWSGI को कॉन्फ़िगर करने के लिए:

  1. एक कॉन्फ़िगरेशन फ़ाइल बनाएँ .ini

    nano myexample.ini

  2. गेटवे 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

वैकल्पिक यदि आप वर्चुअल एनवी का उपयोग कर रहे हैं तो आप अपने वर्चुअल वातावरण को deactivate कर सकते हैं।

Nginx कॉन्फ़िगरेशन हम nginx का उपयोग करने वाले हैं:

  1. डिफ़ॉल्ट सर्वर सॉकेट के लिए अनुरोध पास करने के लिए, uwsgi प्रोटोकॉल का उपयोग कर
  2. डिफ़ॉल्ट सर्वर के सामने प्रॉक्सी सर्वर
  3. कैश सर्वर सफल अनुरोधों को कैश करने के लिए (उदाहरण के लिए, यदि आप अपना वेब अनुप्रयोग चाहते हैं तो आप जीईटी अनुरोधों को कैश करना चाह सकते हैं)

अपनी sites-available निर्देशिका का पता लगाएँ और अपने आवेदन के लिए एक विन्यास फ़ाइल बनाएँ:

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

निम्नलिखित ब्लॉक जोड़ें, टिप्पणियों में यह क्या करता है:

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

अंत में, फ़ाइल को sites-enabled निर्देशिका से लिंक करें। उपलब्ध और सक्षम साइटों की व्याख्या के लिए, उत्तर देखें: [ http://serverfault.com/a/527644]

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

अब आप nginx के साथ किया जाता है। हालाँकि, आप इसे बहुत कीमती बायलर टेम्प्लेट देख सकते हैं: [ https://github.com/h5bp/server-configs-nginx]

ठीक ट्यूनिंग के लिए बहुत उपयोगी है।

अब Nginx का परीक्षण करें:

sudo nginx -t

Nginx लॉन्च करें:

sudo service nginx restart

उबंटू को शुरू करने के लिए उबंटू को स्वचालित करें आखिरी बात यह है कि उबंटू को अपने आवेदन के साथ संवाद करने वाले wsgi प्रवेश द्वार को शुरू करना है, अन्यथा आपको इसे मैन्युअल रूप से करना चाहिए।

  1. उबंटू में प्रारंभिक स्क्रिप्ट के लिए निर्देशिका का पता लगाएँ, और एक नई स्क्रिप्ट बनाएँ:

sudo nano /etc/init/myexample.conf

  1. निम्नलिखित ब्लॉक जोड़ें, यह बताने के लिए कि यह क्या करता है

    # 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
    
    

अब आप अपनी स्क्रिप्ट को सक्रिय कर सकते हैं: sudo start myexample



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow