Trying to run two sites on gunicorn editing the service from
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/webapps/kenyabuzz
ExecStart=/home/ubuntu/webapps/djangoenv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/webapps/kenyabuzz/kb.sock kb.wsgi:application
[Install]
WantedBy=multi-user.target
to
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/webapps/kenyabuzz
WorkingDirectory=/home/ubuntu/webapps/uganda_buzz
ExecStart=/home/ubuntu/webapps/djangoenv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/webapps/kenyabuzz/kb.sock kb.wsgi:application
ExecStart=/home/ubuntu/webapps/djangoenv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/webapps/uganda_buzz/ug.sock kb.wsgi:application
[Install]
WantedBy=multi-user.target
the logs shows the ExecStart
can't be duplicated
ubuntu@ip-172-31-17-122:~$ sudo systemctl status gunicorn
● gunicorn.service - gunicorn daemon
Loaded: error (Reason: Invalid argument)
Active: active (running) since Tue 2017-02-14 09:36:52 EAT; 35s ago
Main PID: 26150 (gunicorn)
CGroup: /system.slice/gunicorn.service
├─26150 /home/ubuntu/webapps/djangoenv/bin/python /home/ubuntu/webapps/djangoenv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/webapps/kenyabuzz/kb.sock kb.wsgi:application
├─26156 /home/ubuntu/webapps/djangoenv/bin/python /home/ubuntu/webapps/djangoenv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/webapps/kenyabuzz/kb.sock kb.wsgi:application
├─26157 /home/ubuntu/webapps/djangoenv/bin/python /home/ubuntu/webapps/djangoenv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/webapps/kenyabuzz/kb.sock kb.wsgi:application
└─26160 /home/ubuntu/webapps/djangoenv/bin/python /home/ubuntu/webapps/djangoenv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/webapps/kenyabuzz/kb.sock kb.wsgi:application
Feb 14 09:36:52 ip-172-31-17-122 systemd[1]: Started gunicorn daemon.
Feb 14 09:36:52 ip-172-31-17-122 gunicorn[26150]: [2017-02-14 09:36:52 +0000] [26150] [INFO] Starting gunicorn 19.6.0
Feb 14 09:36:52 ip-172-31-17-122 gunicorn[26150]: [2017-02-14 09:36:52 +0000] [26150] [INFO] Listening at: unix:/home/ubuntu/webapps/kenyabuzz/kb.sock (26150)
Feb 14 09:36:52 ip-172-31-17-122 gunicorn[26150]: [2017-02-14 09:36:52 +0000] [26150] [INFO] Using worker: sync
Feb 14 09:36:52 ip-172-31-17-122 gunicorn[26150]: [2017-02-14 09:36:52 +0000] [26156] [INFO] Booting worker with pid: 26156
Feb 14 09:36:52 ip-172-31-17-122 gunicorn[26150]: [2017-02-14 09:36:52 +0000] [26157] [INFO] Booting worker with pid: 26157
Feb 14 09:36:52 ip-172-31-17-122 gunicorn[26150]: [2017-02-14 09:36:52 +0000] [26160] [INFO] Booting worker with pid: 26160
Feb 14 09:37:15 ip-172-31-17-122 systemd[1]: gunicorn.service: Service has more than one ExecStart= setting, which is only allowed for Type=oneshot services. Refusing.
what would be the best way to run two sites in this case, using the available configurations. Tried on the same line separated by space and comma each brings an error.
systemd
has great support for this situation. I presume you are running a web server like Nginx in front of the apps as a reverse proxy to route traffic to the right endpoint for each Gunicorn instance using their unique socket names. Here I'll focus on thesystemd
configuration.It's desirable to be able to stop and start an indivual
gunicorn
instance and also desirable to consider them as asingle service
that can be stopped or started together.The
systemd
solution involves creating a "target" which will be used to treat both instances as a single service. Then, a single "template unit" will be used to allow you to add multiple gunicorns to the "target".First,
/etc/systemd/systemd/gunicorn.target
:That's it. You've created a target that when "enabled" will start at boot. Now
/etc/systemd/system/gunicorn@.service
, the template file:Notice the changes I made to your file:
PartOf=
the target.WantedBy=
WorkingDirectory=
and socket path now use variables, because the file is now a template.To start or stop all Gunicorn instances at once, we can simply:
We can use
enable
anddisable
to add and remove new Gunicorn instances on the fly:We can also
stop
andstart
a specific service by itself:To learn more about any of the system directives used, you can can look at
man systemd.directives
, which will list the specific man page that documents each directive.If you have two sites, the logical solution would be for each one to be a different service. In this way you can restart one of them, or you can take down one of them for maintenance, without affecting the other.