An Interest In:
Web News this Week
- March 28, 2024
- March 27, 2024
- March 26, 2024
- March 25, 2024
- March 24, 2024
- March 23, 2024
- March 22, 2024
How to deploy any Python Web Application?
Hey everyone
In this blog post I will explain how you can deploy any ASGI/WSGI compliant Python Web App.
DISCLAIMER:
Only ASGI Compliant Frameworks can be deployed using this method, other frameworks can't be deployed.
List of Tools I will be using:
- NGINX
- Hypercorn
- FastAPI
Now here, there are alternatives to Hypercorn and FastAPI
Alternatives to Hypercorn:
- Gunicorn
- Uvicorn
- Daphne
Other Frameworks that can be deployed:
- Flask
- Django
- Starlette
- Any ASGI/WSGI compliant framework
Step One:
Setup your framework using the docs mentioned.
Since I'll be using FastAPI, my main.py
looks like this
from fastapi import FastAPIapp = FastAPI()@app.get("/")def hello_world(): return f"Hello World"
We now have a FastAPI app ready, we now have to deploy it using NGINX.
Step Two:
Depending upon your framework and choice of ASGI/WSGI Server, this process will be slightly different.
For Django Devs:
Your wsgi/asgi application would be called as <application_name>.<a/w>sgi:application
Choose ASGI or WSGI clearly and stay with that option throughout
For Flask Devs:
If your app is in main.py, it would be called as main:app
In this step we'll be binding the web-server to UNIX socket. Learn more about UNIX Sockets. here
I am attaching the docs of Daphne, Uvicorn and Gunicorn down which use different flags to bind the application to a port.
Run this command to bind it to the socket
hypercorn -b 'unix:/var/tmp/hypercorn.sock' -w 4 main:app
In this -w
defines the number of workers.
Change hypercorn.sock
to the server which you choose to use.
Change the socket name according to your web server
Now we have our app listening on the hypercorn.sock
.
Step Three:
We've to proxy this socket to NGINX and route NGINX to listen to the hypercorn
socket.
worker_processes 1;events { worker_connections 512;}http { server { listen 8080; server_name "localhost"; access_log /var/log/nginx/access.log; error_log /var/log/error.log ; location / { proxy_pass http://unix:/var/tmp/hypercorn.sock; } }}
I'll briefly explain this config file:
- Worker_processes => 1 worker process has been assigned for this specific task/process
- Worker connections => Number of connections that can be handled by 1 process
- Listen => Listens at the mentioned port
- Server Name => Listens at this domain
- Access_log => The file location at which access log is stored, access log stores requests made
- Error_log => The file location at which error log is stored.
- Proxy Pass => The socket/port which needs to be proxied.
This file should change based on your socket but the other configuration can be the same.
Save this file as nginx.conf
Feel free to read about NGINX here
Once this file is made, save it at /etc/nginx/
Either you can use docker to run a Linux server or shell into an instance.
If you want to copy it to docker.
COPY nginx.conf /etc/nginx/
You are ready to launch except one last step
Step four
- You have now wonderfully setup your web-server and the NGINX proxy
- You are just one-step away from accessing the port, and perhaps this is the or step
Currently, NGINX can't read or write from the socket, so we need to change access mode
To do this, run the following command:
chmod 777 /var/tmp/<socket> sudo service nginx restart
Now you can listen from the port 8080, http://localhost:8080
If you are using systemctl, please use this command instead:
sudo systemctl restart nginx
Play around with NGINX config as you wish based on your application's requirements.
Thanks for reading
Docs:
Original Link: https://dev.to/abhijithganesh/how-to-deploy-any-python-web-application-1707
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To