Modern APIs with FastAPI and Python Transcripts
Chapter: Deploying FastAPI on Linux with gunicorn and nginx
Lecture: Server topology with Gunicorn
0:00 Now that we've got our virtual machine running on the Internet somewhere, in this case up on
0:05 Digital Ocean, what we're gonna do is talk quickly about what applications and server services on
0:12 that server are going to be involved and how they fit together. So this little gray box represents Ubuntu, our server.
0:21 What we're gonna first install, or first interact with when we make a request to the server at least, really we'll probably start from the inside out.
0:27 But the first thing that someone coming to the server is gonna interact with is this
0:31 Web server called NGINX. Now NGINX serves HTML and CSS and does the SSL and all those cool things.
0:39 But it's not actually where our Python code runs. In fact, we don't do anything to do with Python there. We just say you talk to all the Web browsers,
0:48 all to the applications, everything that's trying to get to the Web infrastructure. This thing is where they believe they're talking to,
0:55 and it is what they're talking to. But it's not where what is happening. That's not where the action is,
0:59 right. Where the action is, is going to be in this thing called Gunicorn. You saw that we use you uvicorn,
1:05 which is the asynchronous loop version of Gunicorn to run our FastAPI. But Gunicorn is a more proper server that is going to do things like manage the
1:17 life cycle of the apps running. So, for example, if of one of the apps gets stuck in that process, freezes
1:22 up, Gunicorn has a way to run in supervisor mode so it could say "actually that thing is stuck or it ran out of memory.
1:30 Let's restart it" so the server doesn't permanently go down, it's just gonna have a little
1:34 glitch for one user, and then it'll carry on. In order to do that, Gunicorn is gonna spin up not one but many copies of our FastAPI
1:42 application over in uvicorn, which we've already worked with. And this is where our Python code that we write,
1:48 our FastAPI, lives. So when you think of where does my code run? what is my Web app doing? It's gonna be this uvicorn process. And in fact,
1:57 not one, but many. For example, over at Talk Python training, I believe we have eight of these in parallel on
2:04 one of our servers. So when a request comes in, it's gonna hit NGINX, it's going to do its SSL exchange and all those
2:10 things that the Web browsers do with Web servers. NGINX is going to realize, Oh, this request is actually coming to our FastAPI application,
2:19 depending on how we've configured it. It's going to send a request either over http or Linux sockets directly. Gunicorn says okay, well,
2:27 we've got this request for our application and there's probably a bunch going in parallel,
2:32 which one of these worker processes is not busy and can handle requests? Well, this one. Next time a request comes in,
2:39 maybe it's this one. Another request comes in, maybe those two are busy and it decides to pick this one.
2:44 So it's going to fan out the requests between these worker processes based on whether or not they're busy and all sorts of stuff.
2:51 So it's gonna kind of even out the load across them, especially, know if they're busy and not overwhelm any one of them.
2:57 So this is what's going to be happening on our server and we're gonna go in reverse. We're gonna install uvicorn and our Python Web app,
3:03 then going to set up Gunicorn to run it. And once we get that tested and working inside the app, inside the server, on
3:10 Ubuntu, then we're gonna set up NGINX and open it out to the Internet and make this whole process that you see here flow through.