Application Server Setup – Gunicorn
The Gunicorn (Green Unicorn) is a Python Web Server Gateway Interface (WSGI) HTTP server. As we have already installed Gunicorn, we'll explain how to set it up in this section. To manage the Gunicorn application server on a Linux server, we can use systemd to run the server.
As web services should always be available on the Internet, the process must run when the server runs. systemd is a daemon (or a service) that manages other daemons for Linux OS. When Linux OS starts or reboots, systemd also starts and continues running to centrally control other daemons until the OS shuts down.
If you want to learn more about systemd, please check our 'Linux OS Introduction' course.
Linux Introduction – 'Systemd'
There are three steps for Gunicorn setup.
- To run Gunicorn using systemd, you need to create two unit files. Unit files are used to set rules to manage units (processes) by systemd.
- Enable the unit files and start the units
- Check if the units are running
Create unit files
To run Gunicorn, you need to create a service unit file and a socket unit file.
Create a service unit file
A service unit file is used to create a service to run the application itself. The file should be stored under /etc/systemd/system. You can set any name but usually use a project name like project_d.service. To create and edit the file, use the vim
command.
sudo vim /etc/systemd/system/project_d.service
Edit the file like in the example below.
[Unit]
Description=gunicorn daemon
Requires=project_d.socket
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/project_d
ExecStart=/home/ubuntu/project_d/d_env/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:home/ubuntu/project_d/project_d.sock \
config.wsgi:application
[Install]
WantedBy=multi-user.target
You need to carefully type file paths, as the file paths are also used in other files. For example, home/ubuntu/project_d/project_d.sock is the actual file that will be created under the project directory when the socket is enabled. The same path should be written in the socket unit file and the Nginx configuration file, which will be explained in the next section.
Create a socket unit file
A socket unit file is used to establish socket communication between Gunicorn and Nginx. To create and edit the file, use the vim
command.
sudo vim /etc/systemd/system/project_d.socket
Edit the file like in the example below.
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/home/ubuntu/project_d/project_d.sock
[Install]
WantedBy=sockets.target
Enable the unit files and start the units
You can enable and start the service and socket by running the command below. The systemctl enable
command is used to enable units. With the --now
option, you can start the unit at the same time. You can omit .service
when you run the command for a service unit.
sudo systemctl enable --now project_d
sudo systemctl enable --now project_d.socket
Check if the units are running
To check the socket unit status, run the systemctl status
command.
systemctl status project_d.socket
If the socket is properly running, you can see the message like the one below.
● project_d.socket - gunicorn socket
Loaded: loaded (/etc/systemd/system/project_d.socket; enabled; vendor preset: enabled)
Active: active (running) since Fri 2023-04-21 11:55:33 UTC; 22h ago
Triggers: ● project_d.service
Listen: /home/ubuntu/project_d/project_d.sock (Stream)
Tasks: 0 (limit: 2372)
Memory: 0B
CGroup: /system.slice/project_d.socket
To check the service unit status, run the command below.
systemctl status project_d
If the service is running properly, you can see the message like the one below.
● project_d.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/project_d.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2023-04-21 16:05:41 UTC; 18h ago
TriggeredBy: ● project_d.socket
Main PID: 123874 (gunicorn)
Tasks: 4 (limit: 2372)
Memory: 119.5M
CGroup: /system.slice/project_d.service
To learn about the unit files for Gunicorn, you can check the Gunicorn official documentation.
Gunicorn documentation reference: Deploying Gunicorn systemd
Note: Check Gunicorn process
We checked if the socket and service units were running, but we didn't check if the application was running using Gunicorn. Here is a way to check if Gunicorn is working.
Run the command below after activating the virtual environment. We use port 8001
in case port 8000
is used for the local app.
gunicorn --bind=0.0.0.0:8001 config.wsgi:application
If Gunicorn starts appropriately, you'll see a pop-up in the VS Code window like the one below. Click the Open in Browser button to see the app.
Go to the admin page. You'll see that the app is running, but CSS has not been properly applied yet.