2017-02-14 31 views
0

Попытка запустить два участка на gunicorn редактирования службы отработает два экземпляра gunicorn

[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 

в

[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 

бревен показывает ExecStart не может быть повторен

[email protected]:~$ 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. 

, что было бы лучшим способом запустить два сайта в этом случае, используя доступные конфигурации. Пробовавшие одну и ту же строку, разделенные пробелом и запятой, приносят ошибку.

ответ

3

systemd имеет большую поддержку в этой ситуации. Предполагаю, что вы запускаете веб-сервер, например Nginx, перед приложениями в качестве обратного прокси для маршрутизации трафика в конечную точку для каждого экземпляра Gunicorn, используя свои уникальные имена сокетов. Здесь я остановлюсь на конфигурации systemd.

Желательно иметь возможность останавливать и запускать отдельный текст gunicorn, а также желательно рассматривать их как single service, которые могут быть остановлены или запущены вместе.

Решение systemd предполагает создание «цели», которая будет использоваться для обработки обоих экземпляров как одной службы. Затем будет использоваться один «шаблонный блок», который позволит вам добавить несколько «пушек» к «цели».

Во-первых, /etc/systemd/systemd/gunicorn.target:

# See ReADME.md for more about this file 
[Unit] 
Description=Gunicorn 
Documentation=https://example.com/path/to/your/docs 

[Install] 
WantedBy=multi-user.target 

Вот так. Вы создали цель, когда «включено» будет запущено при загрузке. Теперь /etc/systemd/system/[email protected] файл шаблона:

[Unit] 
Description=gunicorn daemon 
After=network.target 
PartOf=gunicorn.target 

[Service] 
User=ubuntu 
Group=www-data 
WorkingDirectory=/home/ubuntu/webapps/%i 

ExecStart=/home/ubuntu/webapps/djangoenv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/webapps/%i/kb.sock kb.wsgi:application 

[Install] 
WantedBy=gunicorn.target 

Обратите внимание на изменения, которые я сделал в файл:

  1. Каждый экземпляр теперь PartOf= цель.
  2. Включение этого сервиса сделает загрузку в зависимости от цели, из-за обновленной WantedBy=
  3. WorkingDirectory= и сокет путь теперь используют переменные, так как файл теперь шаблон.

Чтобы запустить или остановить все экземпляры Gunicorn сразу, мы можем просто:

systemctl start gunicorn 
systemctl stop gunicorn 

Мы можем использовать enable и disable добавлять и удалять новые экземпляры Gunicorn на лету:

systemctl enable [email protected] 
systemctl disable [email protected] 

Мы также можем использовать stop и start:

systemctl start gun[email protected] 
systemctl stop [email protected] 
systemctl restart [email protected] 

Чтобы узнать больше о любых используемых системных директивах, вы можете посмотреть man systemd.directives, в котором будет отображаться конкретная страница руководства, в которой содержится документация каждой директивы.

+0

отлично работает красиво, спасибо –

0

Если у вас есть два сайта, логическое решение будет для каждого из них быть другой службой. Таким образом, вы можете перезапустить один из них, или вы можете удалить один из них для обслуживания, не затрагивая другого.

+0

Я не думаю, что возможно или рекомендуется использовать одновременно две службы стрельбы. –

+0

Конечно, это возможно, и у него нет проблем. Это именно тот ответ, который вы приняли. –