Flask
Nginx के साथ uWSGI वेब सर्वर का उपयोग करके फ्लास्क एप्लिकेशन को तैनात करना
खोज…
एक फ्लास्क एप्लिकेशन को चलाने के लिए 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 सर्वर के लिए कुछ उपयोगी गिट संसाधन।
फ्लास्क एप्लीकेशन
यह ट्यूटोरियल मान लेता है कि आप उबंटू का उपयोग करते हैं।
-
var/www/
फ़ोल्डर का पता लगाएं। - अपना वेब ऐप फ़ोल्डर बनाएं
mkdir myexample
-
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 को कॉन्फ़िगर करने के लिए:
एक कॉन्फ़िगरेशन फ़ाइल बनाएँ
.ini
nano myexample.ini
गेटवे 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 का उपयोग करने वाले हैं:
- डिफ़ॉल्ट सर्वर सॉकेट के लिए अनुरोध पास करने के लिए, uwsgi प्रोटोकॉल का उपयोग कर
- डिफ़ॉल्ट सर्वर के सामने प्रॉक्सी सर्वर
- कैश सर्वर सफल अनुरोधों को कैश करने के लिए (उदाहरण के लिए, यदि आप अपना वेब अनुप्रयोग चाहते हैं तो आप जीईटी अनुरोधों को कैश करना चाह सकते हैं)
अपनी 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 प्रवेश द्वार को शुरू करना है, अन्यथा आपको इसे मैन्युअल रूप से करना चाहिए।
- उबंटू में प्रारंभिक स्क्रिप्ट के लिए निर्देशिका का पता लगाएँ, और एक नई स्क्रिप्ट बनाएँ:
sudo nano /etc/init/myexample.conf
निम्नलिखित ब्लॉक जोड़ें, यह बताने के लिए कि यह क्या करता है
# 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