EC2 वर Python Flask App: Gunicorn आणि Nginx सह Hosting
तुमच्या phone वरचे बहुतेक apps web pages download करत नाहीत. ते server कडे data मागतात आणि screen स्वतः काढतात. ती server बाजू म्हणजे API, आणि Python आणि Flask हा तो बनवायचा सगळ्यात सोपा मार्ग आहे. या chapter मध्ये API website पेक्षा कसा वेगळा ते शिकाल, Amazon Linux 2023 EC2 instance वर Python, pip आणि virtual environment set up कराल, छोटा Flask app लिहाल, आणि तो test server पासून योग्य setup पर्यंत न्याल: gunicorn तो background मध्ये चालवतो, समोर nginx reverse proxy म्हणून, port 5000 बंद, आणि systemd service जी तो boot ला start करते आणि code बदलला की reload करते.
या class मध्ये काय शिकणार
- Website आणि API मधला फरक, आणि JSON data कसा नेतो
- Python app hosting ला काय लागतं: python3, pip, virtual environment, gunicorn आणि nginx
- Package managers: yum, pip, npm आणि composer
- Virtual environment बनवणं आणि activate करणं, आणि
sudo pipचूक का requirements.txtआणि दोन routes चा Flaskapp.pyलिहिणं- Flask development server आणि तात्पुरत्या port 5000 rule ने testing
- gunicorn ने app background मध्ये चालवणं, आणि
app:appचा अर्थ - Reverse proxy म्हणून nginx, त्याचे worker processes आणि
worker_connections - gunicorn
127.0.0.1वर bind करणं आणि port 5000 बंद करणं - JSON API route टाकणं आणि
kill -HUPने gunicorn reload करणं - gunicorn साठी systemd service, आणि एका nginx वर अनेक sites
502 Bad Gateway, nginx welcome page आणिnginx -terrors सोडवणं
1. Website की API
का: Laptop screen साठी बनवलेलं web page Android phone, iPhone आणि tablet ला एकाच वेळी बसत नाही. आजचे apps यावर उपाय म्हणून server कडे फक्त data मागतात.
काय:
- Website पूर्ण HTML page ने उत्तर देते: layout, text आणि images एकत्र. Browser फक्त ते दाखवतो.
- API (Application Programming Interface) फक्त data ने उत्तर देतो. प्रत्येक app, Android, iPhone किंवा web, त्या data वरून स्वतःची screen काढतो.
- Data बहुतेक वेळा JSON म्हणून जातो: curly braces
{ }मधल्याkey: valueजोड्या. Text values double quotes मध्ये, numbers quotes शिवाय, आणि जोड्यांमध्ये comma.
Classroom line
If the server sends back a page, it's a website.
Class मधलं वाक्य
Server कडून response मध्ये page येत असेल, तर त्याला website म्हणायचं.
Classroom line – हिंदी
"Agar server se response mein page aa raha hai, toh usko website kahenge."
Classroom line
These days, servers send data.
Class मधलं वाक्य
आजकाल data येतो.
Classroom line – हिंदी
"Aajkal data aata hai."
Figure 1. Website पूर्ण HTML page पाठवते; API फक्त data JSON मध्ये पाठवतो, आणि प्रत्येक app, Android, iPhone किंवा web, त्यावरून स्वतःची screen काढतो.
Worked example: short-video app मधली एक reel. App server कडे पुढची reel मागतो आणि त्याला मिळतं:
{
"username": "ravi",
"profile_pic": "https://.../ravi.jpg",
"caption": "on the top",
"video_url": "https://.../reel42.mp4",
"likes": 50
}
- App
usernameआणिprofile_picscreen च्या वर दाखवतो. video_urlमधला video मध्यभागी चालवतो.captionआणिlikesचा आकडा video खाली लिहितो.
Classroom line
JSON sits inside curly braces.
Class मधलं वाक्य
JSON curly brace च्या आत असतो.
Classroom line – हिंदी
"JSON curly brace ke andar hota hai."
Figure 2. एक reel JSON मध्ये: app ला keys माहीत असतात आणि तो username आणि profile_pic वर, video मध्यभागी, आणि caption आणि likes खाली ठेवतो.
या chapter च्या पुढच्या भागात तुम्ही असाच छोटा API Python मध्ये बनवाल आणि EC2 वर host कराल.
2. Python app hosting ला काय लागतं
का: Python app म्हणजे एक program नाही, stack आहे. सहा भाग माहीत असले की काय install करायचं ते कळतं, आणि app बंद पडलं की कोणता भाग तपासायचा ते कळतं.
काय: खालून वर, सहा भाग:
- python3, भाषा स्वतः. Python 2 retire झालाय; Python 3 मध्ये इतके बदल झाले की दोघांच्या commands वेगळ्या आहेत,
python2आणिpython3. Amazon Linux 2023 मध्ये फक्तpython3येतो. - pip, Python चा package manager. तो Flask सारख्या libraries download करतो.
- Virtual environment (venv), एक folder ज्यात एका app च्या libraries असतात, बाकी सगळ्या apps पासून वेगळ्या.
- App: Flask मध्ये लिहिलेला
app.py, आणि त्याला लागणाऱ्या libraries ची यादी असलेलाrequirements.txt. - gunicorn, production app server. तो WSGI server आहे: Flask आणि Django सारखे Python web apps चालवतो. FastAPI सारख्या async frameworks साठी uvicorn सारखा ASGI server वापरतात.
- समोर port 80 वर nginx, जो requests gunicorn ला देतो.
तुम्हाला भेटणारे package managers:
yum(किंवाdnf) Amazon Linux वर Linux packages install करतो:sudo yum install nginx -y.pipPython libraries install करतो:pip install flask.npmNode.js libraries install करतो, आणिcomposerPHP libraries.
बहुतेक Linux systems वर आणि macOS वर Python आधीच install असतो; Windows वर तो स्वतः install करावा लागतो.
3. Server launch करा आणि Python तपासा
का: खालचं सगळं याच server वर चालतं. आधी Python version तपासलं की नवीन Python लागणाऱ्या libraries install करायचं टळतं.
कसं:
- EC2 instance launch करा: Amazon Linux 2023,
t2.microकिंवाt3.micro, तुमची key pair, 8 GiB gp3 disk, आणि SSH (22) My IP वरून आणि HTTP (80) सगळीकडून allow करणारा security group. -
Laptop वरून connect करा:
ssh -i mykey.pem ec2-user@PUBLIC_IP -
Python तपासा आणि pip install करा:
python3 -V sudo yum install python3-pip -y pip3 -V -
python3 -VPython 3.9.xसारखं version दाखवतो. नुसतंpythonलिहिलं तरcommand not foundयेतं, कारण commandpython3आहे.
Classroom line
First let's check whether Python is there.
Class मधलं वाक्य
"Aadhi check karuya python aahe ka nahi."
आधी check करूया python आहे का नाही.
Classroom line
First let's check whether Python is there.
Classroom line
Type just python and you get 'command not found'.
Class मधलं वाक्य
"Nusta python lihilat tar 'command not found' yeil."
नुसता python लिहिलात तर 'command not found' येईल.
Classroom line
Type just python and you get 'command not found'.
4. Virtual environment बनवा
का: एका server वर बऱ्याचदा अनेक Python apps चालतात. App A ला Flask 3.1 आणि app B ला Django 4.2 लागू शकतो, त्याच helper libraries च्या वेगळ्या versions सह. एकत्र install केले तर clash होतो. System Python OS आणि yum पण वापरतात, म्हणून app च्या libraries तिथे नकोत.
काय: venv म्हणजे स्वतःचा python, स्वतःचा pip आणि स्वतःच्या libraries असलेला folder. venv module python3 मध्येच असतो; वेगळं package लागत नाही.
कसं:
mkdir ~/pythonapp
cd ~/pythonapp
python3 -m venv myenv
ls
source myenv/bin/activate
lsआताmyenvनावाचा folder दाखवतो.sourceनंतर prompt(myenv)ने सुरू होतो. आताpythonआणिpipम्हणजेmyenvमधले.deactivatevenv मधून बाहेर काढतो.- Venv मध्ये कधीच
sudo pipकिंवाsudo pythonवापरू नका:sudoroot म्हणून root च्या PATH ने चालतो आणि venv टाळतो, म्हणून libraries system Python मध्ये जातात. pip installनेPermission deniedदिलं, तर foldersudoने बनवला होता. तो परत तुमच्या user ला द्या, मगsudoशिवायpip installचालवा:sudo chown -R ec2-user:ec2-user ~/pythonapp
Classroom line
Run ls; you should see a folder called myenv.
Class मधलं वाक्य
"ls karun bagha, myenv navacha folder disla pahije."
ls करून बघा, myenv नावाचा folder दिसला पाहिजे.
Classroom line
Run ls; you should see a folder called myenv.
Classroom line
When the prompt looks like this, the venv is active.
Class मधलं वाक्य
"Asa aala mhanje virtual environment activate zala."
असं आलं म्हणजे virtual environment activate झालं.
Classroom line
When the prompt looks like this, the venv is active.
Figure 3. प्रत्येक app ला स्वतःचा python, pip आणि libraries असलेला venv folder मिळतो, म्हणून एका app मधला Flask आणि दुसऱ्यातला Django कधी clash होत नाहीत, आणि system Python स्वच्छ राहतो.
5. requirements.txt आणि app.py लिहा
का: requirements.txt मुळे कोणीही app ला लागणाऱ्या नेमक्या libraries एका command ने install करू शकतो. app.py म्हणजे app स्वतः.
कसं: ~/pythonapp मध्ये, venv active ठेवून:
-
nano requirements.txtआणि दोन ओळी लिहा:Flask gunicorn -
nano app.pyआणि लिहा:from flask import Flask app = Flask(__name__) @app.route('/') def home(): return 'Hello from Python on EC2' @app.route('/hi') def hi(): return 'Hi! This is the second page.' if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
प्रत्येक भाग काय करतो:
app = Flask(__name__)Flask app object बनवतो, नावapp.@app.route('/')URL path त्याखालच्या function ला जोडतो./म्हणजे page चं नाव नसलेला नुसता address;/hiम्हणजेhttp://ADDRESS/hi.- Python code group करायला indentation वापरतो.
returnच्या ओळी spaces ने एकसारख्या indent हव्यात; एक जास्त space दिली कीIndentationErrorयेतो. host='0.0.0.0'server च्या कुठल्याही address वर आलेल्या requests घेतो;port=5000म्हणजे test server ज्या port वर ऐकतो तो.
Classroom line
Python cares about spaces; one extra space and it won't run.
Class मधलं वाक्य
Python syntax space sensitive आहे. एक जरी जास्त space दिली तर run होणार नाही.
Classroom line – हिंदी
"Python syntax space sensitive hai. Ek bhi zyada space diya toh run nahi hoga."
Classroom line
Just "/" means only the IP, no page name.
Class मधलं वाक्य
URL मध्ये फक्त slash आहे म्हणजे फक्त IP टाकला, कुठल्या page चं नाव नाही.
Classroom line – हिंदी
"URL mein sirf slash hai matlab sirf IP dala, koi page ka naam nahi."
6. Libraries install करा आणि Flask server ने test करा
का: आधी Flask च्या स्वतःच्या server ने app चालवलं की code आणि libraries चालतात हे सिद्ध होतं, gunicorn आणि nginx मुळे चूक व्हायच्या आणखी जागा वाढण्याआधी.
कसं:
-
काहीही install करण्याआधी app चालवून बघा:
python3 app.pyतो
ModuleNotFoundError: No module named 'flask'देऊन fail होतो. Venv active नसेल तेव्हाही हाच error येतो. -
Libraries venv मध्ये install करा, आणि नेमक्या versions नोंदवा:
pip install -r requirements.txt pip freeze > requirements.txtpip freezeFlask==3.1.xसारख्या ओळी लिहितो, म्हणून पुढच्या server ला त्याच versions मिळतात. -
Test server सुरू करा:
python3 app.pyतो
Running on http://127.0.0.1:5000आणि एक warning दाखवतो: "This is a development server. Do not use it in a production deployment." Flask server फक्त testing साठी आहे. -
EC2 console मध्ये security group ला तात्पुरता inbound rule टाका: Custom TCP, port 5000, source
0.0.0.0/0. - Browser मध्ये
http://PUBLIC_IP:5000आणिhttp://PUBLIC_IP:5000/hiउघडा. नुसताhttp://PUBLIC_IPअजून चालत नाही, कारण port 80 कोणी serve करत नाही. - Terminal आता busy आहे: server foreground मध्ये चालतोय.
Ctrl+Cदाबलं की तो थांबतो, आणि site पण बंद पडते. SSH window बंद केली तरी तो थांबतो.
Classroom line
It accepts requests on port 5000 from any IP in the world.
Class मधलं वाक्य
जगातल्या कुठल्याही IP वरून port 5000 वर request आली, तर accept करेल.
Classroom line – हिंदी
"Duniya ke kisi bhi IP se port 5000 pe request aaye, toh accept karega."
Classroom line
Foreground means I can't do anything else in this terminal.
Class मधलं वाक्य
Foreground म्हणजे, आत्ता मी दुसरं काम नाही करू शकत.
Classroom line – हिंदी
"Foreground ka matlab, abhi main dusra kaam nahi kar sakta."
Classroom line
Press Ctrl+C and the server stops.
Class मधलं वाक्य
"Control C kela tar server band padto."
Control C केलं तर server बंद पडतो.
Classroom line
Press Ctrl+C and the server stops.
Figure 4. App चालवायचे तीन मार्ग: testing साठी foreground मधला Flask development server, background मधला --daemon सह gunicorn, आणि boot ला start होणारी systemd service म्हणून gunicorn, live app साठी योग्य मार्ग.
7. gunicorn ने app background मध्ये चालवा
का: Live app logout नंतरही चालू राहायला हवा, आणि एकदम अनेक requests सांभाळायला हवा. gunicorn दोन्ही करतो.
कसं: Venv active ठेवून, ~/pythonapp मध्ये:
gunicorn --bind 0.0.0.0:5000 --workers 2 --daemon app:app
curl http://127.0.0.1:5000
curl http://127.0.0.1:5000/hi
app:appम्हणजे "app.pyfile, त्यातलाappनावाचा Flask object".--bindaddress आणि port ठरवतो. तो नसेल तर gunicorn त्याच्या default127.0.0.1:8000वर ऐकतो.--workers 2एका master process खाली दोन worker processes सुरू करतो.--daemonतो background मध्ये चालवतो: prompt परत येतो, आणि logout नंतरही app चालू राहतो.curlbrowser शिवाय server वरूनच app test करतो.- SSH तुटलं, तर नवीन session मध्ये venv active नसतो. कुठल्याही
python,pipकिंवाgunicorncommand आधी परतcd ~/pythonappआणिsource myenv/bin/activateचालवा.
Classroom line
--daemon means run in the background.
Class मधलं वाक्य
Dash dash daemon म्हणजे background मध्ये run करायचं.
Classroom line – हिंदी
"Dash dash daemon ka matlab background mein run karna."
Classroom line
Re-activating is a must after SSH reconnects.
Class मधलं वाक्य
"Activate karaycha compulsory aahe, SSH connection tutla asel tar."
Activate करायचं compulsory आहे, SSH connection तुटलं असेल तर.
Classroom line
Re-activating is a must after SSH reconnects.
8. समोर nginx reverse proxy म्हणून ठेवा
का: Visitors नी port 5000 नाही, port 80 वर (आणि नंतर HTTPS साठी 443 वर) नुसता http://ADDRESS वापरायला हवा. nginx internet समोर उभं राहायलाच बनलाय: तो हजारो connections सांभाळतो, static files देतो, आणि नंतर HTTPS पण सांभाळतो.
काय:
- nginx reverse proxy आहे: front desk सारखा, तो प्रत्येक request घेतो आणि app च्या requests
proxy_passने gunicorn ला, म्हणजे back office ला, देतो. Visitor फक्त nginx शीच बोलतो. - nginx काही worker processes चालवतो;
worker_processes autoप्रत्येक CPU ला एक सुरू करतो. प्रत्येक worker एक event loop चालवतो जो एकदम अनेक connections सांभाळतो,worker_connectionsपर्यंत, जे Amazon Linux च्याnginx.confमध्ये 1024 आहे.
Figure 5. nginx म्हणजे front desk: तो port 80 किंवा 443 वर प्रत्येक request घेतो, static files स्वतः देतो आणि app च्या requests 127.0.0.1:5000 वरच्या gunicorn ला देतो. प्रत्येक nginx worker चा event loop worker_connections इतके connections सांभाळतो, Amazon Linux च्या nginx.conf मध्ये 1024.
कसं:
-
nginx install करा आणि start करा:
sudo yum install nginx -y sudo service nginx start -
sudo nano /etc/nginx/nginx.confने config उघडा. आधीच्याserver { ... }block मध्ये,rootच्या ओळीनंतर, हे टाका:location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } -
प्रत्येक directive
;ने संपतो आणि प्रत्येक{ला त्याचा}हवा. File तपासा, मग reload करा:sudo nginx -t sudo service nginx reload -
nginx -tनेsyntax is okआणिtest is successfulम्हटलं पाहिजे. Error दाखवला तर nginx जुन्या config ने चालू राहतो; त्याने सांगितलेली ओळ दुरुस्त करा आणि परत test करा. - Port शिवाय
http://PUBLIC_IPउघडा: Flask app nginx मधून उत्तर देतो.
Classroom line
Don't forget the semicolon here.
Class मधलं वाक्य
"Semicolon visru naka ithe."
Semicolon विसरू नका इथे.
Classroom line
Don't forget the semicolon here.
![काळा terminal, nano मध्ये nginx.conf उघडलेली: server {, listen 80;, listen [::]:80;, server_name _;, root /usr/share/nginx/html;, मग location /{, proxy_pass http://localhost:5000; आणि बंद करणारा brace.](../../../assets/img/aws/host-python-flask-app-on-ec2-with-gunicorn-and-nginx-01-nginx-conf-location-proxy-pass.webp)
Whiteboard: nginx.conf मधला default server block, आणि requests port 5000 कडे देणारा location / block. localhost ऐवजी 127.0.0.1 लिहिलं की nginx आधी IPv6 address ::1 try करत नाही.
proxy_set_header च्या ओळी खरा visitor address आणि मूळ host name app पर्यंत पोचवतात; त्या नसतील तर प्रत्येक request nginx कडूनच आल्यासारखी वाटते.
Port 5000 बंद करा: आता nginx समोर आहे, बाहेरच्या कोणालाही port 5000 ची गरज नाही.
-
Test चा gunicorn थांबवा (त्याचा PID कसा शोधायचा ते section 9 दाखवतो) आणि तो फक्त server पुरता bind करून सुरू करा:
gunicorn --bind 127.0.0.1:5000 --workers 2 --daemon app:app -
Security group मधून port 5000 चा rule delete करा. 22 My IP वरून, 80, आणि HTTPS टाकलं तर 443 ठेवा.
http://PUBLIC_IPअजून चालतो;http://PUBLIC_IP:5000आता उत्तर देत नाही.
Figure 6. Testing करताना security group मध्ये port 5000 चा तात्पुरता rule असतो; nginx समोर आल्यावर 5000 चा rule delete होतो आणि gunicorn 127.0.0.1:5000 वर bind करतो, म्हणून फक्त nginx तिथे पोचू शकतो.
Figure 7. Browser port 80 वर nginx पर्यंत पोचतो; nginx request 127.0.0.1:5000 वरच्या gunicorn ला देतो; gunicorn चा worker Flask function चालवतो, आणि JSON त्याच मार्गाने परत जातो.
9. API route टाका आणि gunicorn reload करा
का: API म्हणजे फक्त data परत देणारा route. तो टाकला की background server चं सगळ्यात नेहमीचं आश्चर्य दिसतं: server reload करेपर्यंत नवीन code काहीच करत नाही.
कसं:
-
app.pyमध्येif __name__च्या ओळीच्या वर एक route टाका:@app.route('/getusers') def get_users(): return {"username": "ravi", "likes": 50, "caption": "on the top"} -
Flask परत दिलेल्या dictionary चं JSON करतो आणि
application/jsoncontent type लावतो. http://PUBLIC_IP/getusersउघडा: 404 Not Found दिसतं. gunicorn ने workers सुरू होतानाapp.pyload केला, आणि तो अजून जुनाच code चालवतोय.-
gunicorn चे processes शोधा:
ps aux | grep gunicorn ps -ef | grep gunicorn -
ps auxसगळे processes दाखवतो:aसगळे users,uuser-oriented columns,xterminal नसलेले processes पण.ps -efparent PID चा column दाखवतो: ज्या gunicorn process चा parent दुसरा gunicorn नाही तो master; workers त्याची मुलं. -
Master च्या PID ने code हळूच reload करा:
kill -HUP 4101 -
HUPमुळे master नवीन code सह नवीन workers सुरू करतो आणि जुने त्यांच्या requests संपल्यावर थांबवतो./getusersपरत उघडा: तो{"caption":"on the top","likes":50,"username":"ravi"}देतो. - gunicorn थांबवायला
kill 4101(TERM) चालवा: तो व्यवस्थित बंद होतो.kill -9फक्त तो अडकला तरच.
Classroom line
Suppose you need a new API; what will you do?
Class मधलं वाक्य
"Samja tumhala navin API tayar karaycha aahe, tar kay karnar?"
समजा तुम्हाला नवीन API तयार करायचा आहे, तर काय करणार?
Classroom line
Suppose you need a new API; what will you do?
Classroom line
How to find it? Run ps aux.
Class मधलं वाक्य
"Kasa olkhaycha? ps aux command chalvaychi."
कसं ओळखायचं? ps aux command चालवायची.
Classroom line
How to find it? Run ps aux.

Whiteboard: /getusers route JSON ने उत्तर देतोय. या app ने तयार JSON string परत दिली होती; dictionary परत दिली तर तिच्या keys sorted येतात, step 7 सारख्या.
Figure 8. नवीन route 404 देतो कारण चालू workers कडे जुना code आहे; ps ने master PID शोधा, त्याला HUP पाठवा, आणि नवीन workers JSON ने उत्तर देतात.
10. gunicorn systemd service म्हणून चालवा
का: --daemon वाला gunicorn reboot किंवा crash नंतर परत सुरू होत नाही, आणि तो सांभाळायला PIDs शोधावे लागतात. systemd service तिन्ही सोडवते. Live app चालवायचा हा योग्य मार्ग आहे.
कसं:
--daemonवाला gunicornkill <master PID>ने थांबवा.-
sudo nano /etc/systemd/system/gunicorn.serviceने unit file बनवा:[Unit] Description=Gunicorn for pythonapp After=network.target [Service] User=ec2-user Group=ec2-user WorkingDirectory=/home/ec2-user/pythonapp ExecStart=/home/ec2-user/pythonapp/myenv/bin/gunicorn --workers 2 --bind 127.0.0.1:5000 app:app ExecReload=/bin/kill -s HUP $MAINPID Restart=on-failure [Install] WantedBy=multi-user.target -
ExecStartvenv मधल्या gunicorn चा पूर्ण path वापरतो, म्हणूनactivateलागत नाही.--daemonनाही: systemd स्वतः तो background मध्ये ठेवतो. -
Load करा, boot साठी enable करा, आणि start करा:
sudo systemctl daemon-reload sudo systemctl enable gunicorn sudo service gunicorn start sudo service gunicorn status -
Code बदलल्यावर:
sudo service gunicorn reload(section 9 सारखाच HUP). Unit file बदलल्यावर:sudo systemctl daemon-reload, मगsudo service gunicorn restart. - त्याचे logs
sudo journalctl -u gunicornने वाचा.
11. एका nginx वर अनेक sites
का: एक EC2 server अनेक apps आणि sites host करू शकतो. वेगवेगळे server { } blocks त्यांना वेगळं ठेवतात, म्हणून प्रत्येक site साठी वेगळ्या server चे पैसे भरावे लागत नाहीत.
काय: एक nginx अनेक sites serve करू शकतो, प्रत्येक स्वतःच्या server { } block मध्ये.
/etc/nginx/nginx.confमधल्या पहिल्या block मध्येserver_name _;असतो._म्हणजे catch-all नाव: ज्या requests चं host name दुसऱ्या कुठल्याही block शी जुळत नाही, उदा. नुसता IP, त्यांना हा default block उत्तर देतो.-
प्रत्येक site साठी एक block टाका, प्रत्येकाचा स्वतःचा
server_nameआणि स्वतःचाproxy_passकिंवाroot:server { listen 80; server_name api.example.com; location / { proxy_pass http://127.0.0.1:5000; } } -
दुसरा Python app दुसऱ्या port वर चालतो, उदा.
127.0.0.1:5001, स्वतःच्या venv आणि service सह. - प्रत्येक बदलानंतर
sudo nginx -tआणिsudo service nginx reloadचालवा.
12. काही चुकलं तर
python: command not found:python3वापरा.ModuleNotFoundError: No module named 'flask': venv activate करा, मगpip install -r requirements.txt.pip installकरतानाPermission denied: foldersudoने बनवला;sudo chown -R ec2-user:ec2-user ~/pythonappचालवा, मगsudoशिवायpip install.- SSH परत जोडल्यावर commands fail: परत
cd ~/pythonappआणिsource myenv/bin/activate. - Testing करताना
http://PUBLIC_IP:5000उघडत नाही:host='0.0.0.0'आणि security group मधला port 5000 चा rule तपासा. - तुमच्या app ऐवजी nginx welcome page:
location / { proxy_pass ...; }block नाही किंवा server block च्या बाहेर आहे, किंवा nginx reload केला नाही. 502 Bad Gateway: nginx चालतोय पण gunicorn उत्तर देत नाही. gunicorn सुरू करा, किंवाproxy_passमधला port दुरुस्त करा.nginx -tम्हणतोunexpected end of file, expecting "}": बंद करणारा}नाही. तो टाका,sudo nginx -tचालवा, मग reload.nginx -tम्हणतोinvalid number of arguments: त्याने सांगितलेल्या ओळीच्या शेवटी;नाही.- नवीन route 404 देतो: जुनाच code load आहे.
kill -HUP <master PID>किंवाsudo service gunicorn reloadचालवा.
Figure 9. EC2 वर Python app: काय दिसतं आणि काय तपासायचं, python3 आणि venv पासून security group, proxy_pass, 502, nginx -t messages आणि gunicorn reload पर्यंत. Logs /var/log/nginx/error.log मध्ये आणि journalctl -u gunicorn मध्ये असतात.
Ravindra Bagale's Tip
तीन सवयी ठेवा. Venv मध्ये काम करा आणि pip आधी कधीच sudo लिहू नका. प्रत्येक nginx reload आधी sudo nginx -t चालवा, म्हणजे typo मुळे site कधी बंद पडत नाही. आणि nginx समोर आला की gunicorn 127.0.0.1 वर bind करा आणि port 5000 चा rule delete करा: internet ला जितके कमी ports उघडे, तितके आत यायचे मार्ग कमी.
Practice झाल्यावर EC2 instance stop करा.
13. पूर्ण class एका page वर
- Website पूर्ण HTML pages देते; API data JSON मध्ये देतो,
{ }मधल्याkey: valueजोड्या, आणि प्रत्येक app स्वतःची screen काढतो. - Python hosting ला python3, pip, venv, app, gunicorn (WSGI) आणि nginx लागतात. yum, pip, npm आणि composer हे package managers.
- Amazon Linux 2023 वर:
python3 -V,sudo yum install python3-pip -y. Commandpython3आहे,pythonनाही. python3 -m venv myenv,source myenv/bin/activate, prompt(myenv). कधीचsudo pipनाही;Permission deniedchownने सोडवा.requirements.txtमध्ये libraries ची यादी;pip install -r requirements.txt;pip freezeversions pin करतो.- Flask:
@app.route('/'), indentation महत्त्वाचं,app.run(host='0.0.0.0', port=5000). Flask server फक्त testing साठी. gunicorn --bind 127.0.0.1:5000 --workers 2 --daemon app:app;--bindनसेल तर127.0.0.1:8000. SSH परत जोडल्यावर venv परत activate करा.- nginx reverse proxy:
location / { proxy_pass http://127.0.0.1:5000; }, मगsudo nginx -tआणिsudo service nginx reload. Event loops असलेले workers,worker_connections 1024. - nginx मागे असताना security group मध्ये port 5000 बंद करा.
- नवीन code ला reload लागतो:
ps aux | grep gunicorn,kill -HUP <master PID>;killथांबवतो,kill -9फक्त अडकल्यावर. - योग्य मार्ग: venv मधल्या gunicorn सह systemd unit,
systemctl enable,sudo service gunicorn start|reload|restart,journalctl -u gunicorn. server_name _;हा catch-all default block; प्रत्येक site साठी एकserver { }block टाका.
14. Hands-on lab: gunicorn आणि nginx मागे Flask app
हा lab का. हा lab stack खालून वर बनवतो आणि पुढचा layer जोडण्याआधी प्रत्येक layer curl ने तपासतो: Python, virtual environment, Flask, gunicorn, मग समोर nginx.
- Python तपासा आणि pip install करा
- Command:
python3 -V && sudo yum install python3-pip -y - काय दिसेल:
Python 3.x, मगComplete!. - Check करा:
pip3 -Vversion print करतो. - का: Amazon Linux मध्ये
python3असतो पण pip नसतो. या server वर commandpython3,pythonनाही.
- Command:
- App folder आणि virtual environment बनवा
- Command:
mkdir ~/pythonapp && cd ~/pythonapp && python3 -m venv myenv && source myenv/bin/activate - काय दिसेल: Prompt
(myenv)ने सुरू होतो. - Check करा:
which python→/home/ec2-user/pythonapp/myenv/bin/python - का: प्रत्येक app ला स्वतःच्या libraries मिळतात, म्हणून वेगवेगळे Flask versions लागणारे दोन apps भांडत नाहीत.
- Command:
- requirements.txt आणि app.py लिहा
- करा:
nano requirements.txtमध्येFlaskआणिgunicornया दोन ओळी;nano app.pyमध्ये section 5 मधलं दोन routes चं app. - Check करा:
ls→app.py myenv requirements.txt - का:
requirements.txtमुळे कोणीही हीच libraries एका command ने install करू शकतो.
- करा:
- Libraries install करा
- Command:
pip install -r requirements.txt - काय दिसेल:
Successfully installed ... flask ... gunicorn ...ने संपणाऱ्या download ओळी. - Check करा:
pip listमध्येFlaskआणिgunicornदिसतात. - का:
(myenv)च्या आत त्या फक्त या app मध्ये install होतात, आणिsudoलागत नाही.
- Command:
- gunicorn ने background मध्ये चालवा
- Command:
gunicorn --bind 127.0.0.1:5000 --workers 2 --daemon app:app - काय दिसेल: काहीच नाही.
- Check करा:
curl http://127.0.0.1:5000→Hello from Python on EC2;curl http://127.0.0.1:5000/hi→Hi! This is the second page. - का:
app:appम्हणजेapp.pyमधलंappobject.127.0.0.1port 5000 private ठेवतो, म्हणून फक्त त्याच server वरचा nginx पोहोचू शकतो;--daemonlogout नंतरही चालू ठेवतो.
- Command:
- reverse proxy म्हणून nginx install करा
- Command:
sudo yum install nginx -y - काय दिसेल:
Complete! - Check करा:
nginx -vversion print करतो. - का: Visitors port 80 वापरतात. nginx तिथे त्यांच्या requests घेतो आणि 5000 वरच्या gunicorn कडे देतो.
- Command:
- Proxy settings जोडा
- करा:
/etc/nginx/nginx.confच्याserver { }block मध्ये section 8 मधलाlocation / { proxy_pass http://127.0.0.1:5000; ... }block जोडा. - Check करा:
sudo nginx -t→syntax is okआणिtest is successful. - का:
proxy_passही प्रत्येक request पुढे पाठवणारी ओळ. Start आधी test केल्याने राहिलेला semicolon पकडला जातो.
- करा:
- nginx start करा आणि app उघडा
- Command:
sudo service nginx start && curl http://localhost - काय दिसेल:
Hello from Python on EC2 - Check करा: Security group मध्ये HTTP allowed असेल तर browser मध्ये
http://PUBLIC_IP/hiदुसरं page दाखवतो. - का: Port 80 वर तेच उत्तर आलं म्हणजे nginx gunicorn कडे पाठवतो. Port 5000 internet साठी कधीच उघडावा लागत नाही.
- Command:
- Reboot नंतरही चालू राहील असं करा
- करा: Section 10 मधला
gunicornsystemd service बनवा, मगsudo systemctl daemon-reloadआणिsudo systemctl enable gunicornचालवा. - Check करा: Instance stop आणि start केल्यावरही
curl http://localhostउत्तर देतो (sudo systemctl enable nginxपण). - का:
--daemongunicorn reboot किंवा crash नंतर परत येत नाही; systemd तो परत start करतो. आधी--daemonवाली copy थांबवा, म्हणजे दोघं port 5000 साठी भांडणार नाहीत.
- करा: Section 10 मधला
15. Try at home
Try at home
Task 1: app
- Amazon Linux 2023 instance launch करा, pip install करा, venv सह
~/pythonappबनवा, आणिrequirements.txtआणिapp.pyलिहा. - एकदा venv active नसताना
python3 app.pyचालवा आणि error वाचा. मग तो activate करा, install करा, आणि port 5000 तात्पुरता उघडा.
Task 2: gunicorn आणि nginx
- gunicorn ने app background मध्ये चालवा आणि
curlने test करा. - nginx install करा,
locationblock टाका,sudo nginx -tचालवा, reload करा, आणि site port 80 वर उघडा. - एक
;काढा,sudo nginx -tचालवा, आणि message वाचा. परत टाका. - gunicorn
127.0.0.1:5000वर bind करा आणि port 5000 चा rule delete करा.
Task 3: API आणि service
/getusersटाका, 404 बघा, मगkill -HUPने gunicorn reload करा आणि JSON बघा.- gunicorn थांबवा आणि
502 Bad Gatewaypage बघा. - systemd unit बनवा, enable करा, instance reboot करा, आणि तुम्ही काहीही start न करता app उत्तर देतो का ते तपासा.
Recap
थोडक्यात
- API पूर्ण pages ऐवजी data JSON मध्ये पाठवतो, म्हणून प्रत्येक app स्वतःची screen काढू शकतो.
- Venv प्रत्येक app च्या libraries वेगळ्या ठेवतो; तो
python3 -m venvने बनवा, आणि त्यात कधीचsudo pipवापरू नका. - Flask server testing साठी; gunicorn app खरा चालवतो, आणि
app:appfile आणि object चं नाव सांगतो. - समोरचा nginx reverse proxy; gunicorn
127.0.0.1:5000वर bind करतो, आणि port 5000 बंद राहतो. - प्रत्येक reload आधी
sudo nginx -tराहिलेले;आणि}पकडतो. - नवीन code ला master वर
kill -HUPकिंवाsudo service gunicorn reloadलागतो; systemd service gunicorn boot ला सुरू करते आणि crash नंतर परत सुरू करते.
सराव Tasks
Cape Town Safaris हा केप टाऊन मधला पर्यटन व्यवसाय आहे. Thabo Nkosi त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे ZAR मध्ये मोजले जातात आणि AWS resources af-south-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.
0 / 12
सोपं बदलानंतर service restart करा
का: Config बदल service restart/reload नंतरच लागू होतात.
काय करायचं: nginx service restart करा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
सोपं Service चालू आहे का ते पाहा
का: Site बंद असेल तर आधी web server चालू आहे का ते पाहा.
काय करायचं: httpd service चं status दाखवा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
सोपं Ubuntu वर package install करा
का: Ubuntu apt वापरतं. Package नावं वेगळी: Ubuntu वर Apache म्हणजे apache2.
काय करायचं: Ubuntu वर apache2 package confirm न विचारता install करा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
सोपं Amazon Linux वर package install करा
का: Amazon Linux 2023 वर dnf हा package manager. -y आपोआप yes देतो.
काय करायचं: Amazon Linux 2023 वर httpd package confirm न विचारता install करा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
सोपं Server वरून website test करा
का: DNS तयार होण्याआधीही web server उत्तर देतो का ते curl दाखवतो.
काय करायचं: http://localhost ला request पाठवा व फक्त response headers दाखवा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
सोपं GitHub वरून code घ्या
का: git clone पूर्ण repository server वर copy करतो.
काय करायचं: https://github.com/capetownsafari/website.git सध्याच्या folder मध्ये clone करा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
मध्यम nginx config test करा
का: Restart मुळे site बंद पडण्याआधी test चुका पकडतो.
काय करायचं: nginx configuration files मधल्या चुका तपासा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
मध्यम Service आत्ता व boot ला सुरू करा
का: enable reboot नंतर सुरू करतो; --now आत्ताच सुरू करतो.
काय करायचं: nginx service enable करा व लगेच सुरू करा, एका command ने.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
मध्यम Port 80 सगळ्यांसाठी उघडा
का: Security group HTTP allow करत असेल तरच visitors website पाहू शकतात.
काय करायचं: Security group sg-022b36ab6b244c3b2 वर 0.0.0.0/0 कडून inbound TCP port 80 allow करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम CloudFormation: web SG
का: फक्त 443 उघडल्याने server सुरक्षित.
काय करायचं: 0.0.0.0/0 कडून TCP 443 allow करणारा AWS::EC2::SecurityGroup. GroupDescription द्या.
- Task मधल्या top-level keys पासून सुरू करा.
- Child keys 2 spaces ने indent करा (tabs नकोत).
- प्रत्येक property मध्ये task मधली value भरा.
- Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.
मध्यम Security group बनवा
का: Security group म्हणजे instance भोवतीचा firewall.
काय करायचं: vpc-0f3cafcf24deadbee मध्ये capetownsafari-web-sg नावाचा security group "Web servers" description सह बनवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड Ubuntu वर nginx site enable करा
का: Ubuntu वर sites-available पासून sites-enabled ला symbolic link ने site enable होते.
काय करायचं: /etc/nginx/sites-enabled/ मध्ये /etc/nginx/sites-available/capetownsafari ची symbolic link बनवा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
उजळणी, तुलना आणि मुलाखत cards
हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.










अजून cards: Ravi Sir's Cards.