Python for the .NET Developer Transcripts
Chapter: Deploying Python web apps
Lecture: Running in a production WSGI server
0:00 We saw this admonishment here and you should run this in a production WSGI server instead. Yes, yes we should.
0:07 We should also turn debug mode off, which we can also do. So we're going to do this and that brings us over to a new set of files.
0:17 We've got this Nginx, we got this service file. This one controls uWSGI and it's going to run as a system daemon in the background.
0:25 Think Windows service, auto start. It's sometimes hard to see the errors and where they went. They're going to be logged over to here, which is cool
0:35 but what we want to do, is we want to just test this command without the log bit first. So let's go. It's resisting scrolling.
0:48 Now also, it says we want to use this WSGI app. We haven't defined this yet so let me go ahead and put that in here.
0:56 Put a file called wsgi, you can call it whatever you want. This is kind of a bit of a convention. It will say from Guitary, not app. Import app.
1:06 Now, the way that the production servers work is they don't just run your code. So remember, the way we got it was that we ran
1:14 our code and it called this function, which called main. We can turn this to false. Right, it ran this 'cause we ran this file
1:24 so it's kind of the startup for that file. It doesn't work that way. It just defines these pieces and it imports app.
1:31 And then it uses that directly, okay. Actually, then I guess this doesn't matter down here, does it? If there's any additional setup, like
1:40 let's look over here real quick. Notice this one. In main we're setting up the global INET and we're creating the tables and we're loading the data
1:48 and we're calling run. What we would really need to do, and let me make a function over here, method. And I'll call this configure.
1:58 So, in this case what we call main I'm going to actually run main. But if they don't do main we need to do something else.
2:05 So we can go in and say, else is the production case. So you still got to do this configure bit. Put it like that. Here we go.
2:14 Okay, so just in case you run the other one you're going to run into problems running uWSGI without this. But this world, we're not doing extra stuff.
2:23 We haven't gotten there yet, so there's not really anything we have to do. This is good, but you would do something like possibly run
2:31 the configure here, or just let it get called the way it was. Let's go in add.
2:48 All right, here we go. Here's our WSGI. We should be able to just run this. So, it's really good to test though.
2:57 Test this directly, 'cause it's annoying to go and always check the log file if something doesn't work. It's much easier to run it, see if this works
3:04 and then diagnose the other issues. So, when you're doing this stuff I recommend small steps at a time, okay.
3:10 So, let's run this over here and see where we get. Over in uWSGI, tell it it's using this virtual environment.
3:17 It's running in master mode with four subprocesses. That's like the supervisor and then subprocess worker processes, each get two threads.
3:27 Let's then import 5,000. Okay, think we're good. Woohoo, it looks like it works. Let's see, WSGI app added. All right, it seems like it works.
3:40 Sometimes you'll see some errors come through but I don't see any this time. Must have done it right. Okay, let's try this again. Here it is.
3:49 Look at that. First time we got it working. So, as we make requests here we could do slash guitars. We can do a redirect. No, just a 200.
4:01 Could do tar slash all. That'd give us all of our guitars back. Here you can see the electric wood grain. So, it looks like it's working.
4:12 But we have uWSGI theoretically potentially, maybe working. That's not quite enough though. Remember, I just ran it, I ran this command.
4:20 I didn't set it up to start when the server turns on and stop when the server shuts down. So, that's the next thing that we need to do
4:27 is how are we going to set that up? But of course, now if I try again error. No connection. So, to accomplish that what we need to do is copy this file
4:36 and it looks like everything's good. This is not right, this'd be a Guitary. You never create this file from scratch.
4:44 You always get it from somewhere else. For you guys you can get it from this course. Okay, so what we want to do is we want to get this
4:52 and we want to copy it. Let me just go ahead and put the fixed description. Not that it really matters but have it working right.
5:00 So, to make this do its magic we have to copy that file, which lives here, into etcetera. Systemd, system Guitary service.
5:10 And then we can control it by saying, "Start Guitary" "Stop Guitary" and so on. So, it would git pull. Got our updated service and then we, whoops
5:23 did not copy enough, did I? Want to do this copy, fingers crossed. No, got the path wrong, didn't I? Didn't I, 'cause that is not the right name.
5:38 Here we go. Let's try again with this new one. Right, no output. That means it works. Hasn't quite been started yet, so we have to say, "Start"
5:49 and see what that does. Ooh, no errors, that's good. We can say, "Status". Alright, looks like it's running and that's cool.
5:58 We could run valances and see if it really is running. Oh yeah, there it is, it's running. And then we could do HTTP against it.
6:07 Yeah, look at that, it's running. However, if we restart the server, it's going to go away. That's not amazing.
6:13 So we have to say, "Enable" and this will tell it basically now it's an auto starting service. It's going to start, based on the various signals
6:24 that we put in the file. So, over here you can see after. It's just logged that target. After the system log is available.
6:32 Yeah, this is up and running. It's great and if it crashes it'll auto start itself and so on, so pretty excellent.
6:41 One other thing we can do is we can come over here. Go look at that. All right, there's this uWSGI log. That's cool.
6:50 We can even say tail -f for follow -n 20. This, if we go to the other. Then we go make that request again. Now you see, here's all the output.
7:02 Live, go in to log file. So, this is great when you're working on it you can fire this up, put it off to the side and then as you interact with
7:08 it exceptions will show up here. Requests will show up here. All that sort of good stuff. Our systemd unit file this dot service file let us set uWSGI
7:18 the worker process and the overseeing supervisor process for them to run and auto start when our system just boots up. That looks like progress to me.