Systemd and Gunicorn
February 4, 2018
I've just updated my server from Debian 7 to Debian 9, and the previous configuration I was using to start and stop gunicorn isn't working. This post covers the new systemd based configuration.
/etc/systemd/system
In the /etc/systemd/system folder, create a new file for your service. In my case this is drumcoder.service.
[Unit] Description=Drumcoder gunicorn daemon After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/home/drumcoder/web/dc ExecStart=/home/drumcoder/.venv/dc/bin/gunicorn --workers 1 --error-logfile /var/log/gunicorn/dc.log -b localhost:8001 -n drumcoder drum.drumcoder-wsgi:application [Install] WantedBy=multi-user.target
Most of this is self-expanatory. The Unit.After section defines when the service starts. Service.ExecStart is the command that is run to start the gunicorn process.
The parameters to ExecStart are:
/home/drumcoder/.venv/dc/bin/gunicorn- the path to the gunicorn binary--workers 1- number of workers for gunicorn--error-logfile /var/log/gunicorn/dc.log- file to log errors to-b localhost:8001- where to listen for requests-n drumcoder- name of processdrum.drumcoder-wsgi:application- path to wsgi
The final parameter on the ExecStart line points at the drumcoder-wsgi file inside the project. This is referenced here using the drum. prefix, as the file is located at /home/drumcoder/web/dc/drum/drumcoder-wsgi.py
drumcoder-wsgi.py
The WSGI file contains:
import os, sys
sys.path.append('/home/drumcoder/web/dc')
os.environ['DJANGO_SETTINGS_MODULE'] = 'drumcoder.settingslive'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
import drumcoder.monitor
drumcoder.monitor.start(interval=1.0)
Service
Once the drumcoder.service file is in place, the service can be controlled using the service command:
# service drumcoder stop # service drumcoder start # service drumcoder restart # service drumcoder status
To make the service load automatically at boot time:
# systemctl enable drumcoder


