Развертывание каналов Django: как сохранить работу Daphne после выхода из оболочки на веб-сервере - PullRequest
0 голосов
/ 05 мая 2018

На практике я пытаюсь развернуть пример Эндрю Годвина для нескольких чатов с каналами Django 2.1.1 в DigitalOcean Ubuntu 16.04.4. Однако я не знаю, как выйти из сервера Ubuntu без остановки Daphne-сервера каналов.

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

  • daphne myproject.asgi: приложение
  • daphne -p 8001 myproject.asgi: приложение
  • daphne -b 0.0.0.0 -p 8001 myproject.asgi: приложение

Итак, в дополнение к обучению DigitalOcean, я запустил и их. Третий работал на меня, и сайт работал хорошо. Однако, если я выйду из shell в Ubuntu, Дафна тоже остановится.

В этом уроке у gunicorn есть доступ к файлу sock (--bind unix:/home/sammy/myproject/myproject.sock), и в своих исследованиях я до сих пор видел на нескольких сайтах, опубликованных до 2018 года, что где-то генерируется файл daphne.sock. Итак, я думаю, что каналы развертываются аналогично? Но я не видел подробностей о том, как это делается.

Как развернуть пример мультитача, чтобы я мог выйти из веб-сервера Ubuntu без остановки Дафни?

Обновление 6 мая 2018 года, 20:00 CET:

Я попробовал решение kagronick ниже и создал файл systemd по адресу /etc/systemd/system/daphne_seb.service:

[Unit]
Description=daphne daemon for seb
After=network.target

[Service]
User=root
Group=www-data
WorkingDirectory=/home/seb/seb
ExecStart=/home/seb/env_seb/bin/python /home/seb/seb/manage.py daphne -b 0.0.0.0 -p 8001 multichat.asgi:application
Restart=on-failure

[Install]
WantedBy=multi-user.target

Я сделал systemctl daemon-reload и systemctl start daphne_seb.service, и он работал в течение нескольких секунд. Тогда systemctl status daphne_seb.service сказал Unknown command: 'daphne'.

Я попытался перезапустить его. Затем я перезагрузил ОС. Теперь status говорит:

daphne_seb.service - daphne daemon for seb
   Loaded: loaded (/etc/systemd/system/daphne_seb.service; enabled; vendor preset: enabled)
   Active: inactive (dead) (Result: exit-code) since Sun 2018-05-06 19:33:31 UTC; 1s ago
  Process: 2459 ExecStart=/home/seb/env_seb/bin/python /home/seb/seb/manage.py daphne -b 0.0.0.0 -p 8001 multichat.asgi:application (code=exited, status=1
 Main PID: 2459 (code=exited, status=1/FAILURE)

May 06 19:33:31 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: daphne_seb.service: Main process exited, code=exited, status=1/FAILURE
May 06 19:33:31 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: daphne_seb.service: Unit entered failed state.
May 06 19:33:31 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: daphne_seb.service: Failed with result 'exit-code'.
May 06 19:33:31 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: daphne_seb.service: Service hold-off time over, scheduling restart.
May 06 19:33:31 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: Stopped daphne daemon for seb.
May 06 19:33:31 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: daphne_seb.service: Start request repeated too quickly.
May 06 19:33:31 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: Failed to start daphne daemon for seb.

Я проверил пути к файлам. Они правы. Я также попытался добавить Environment=DJANGO_SETTINGS_MODULE=multichat.settings, который я видел здесь . Но это тоже не помогло.

Обновление 6 мая 2018 года, 22:00 CET:

Затем я прочитал здесь , что в течение 10 секунд разрешено только 5 перезапусков. Поэтому я удалил Restart=on-failure, чтобы запустить службу самостоятельно.

Это вернуло меня к Unknown command: 'daphne'. Это решение подсказало мне, что я должен указывать не на Python, а на Дафну в моем virtualenv, поэтому я изменил его: ExecStart=/home/seb/env_seb/bin/daphne. Я также удалил /home/seb/seb/manage.py на основе того же решения. Это дало мне новую проблему:

daphne_seb.service - daphne daemon for seb
   Loaded: loaded (/etc/systemd/system/daphne_seb.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sun 2018-05-06 19:55:24 UTC; 5s ago
  Process: 2903 ExecStart=/home/seb/env_seb/bin/daphne daphne -b 0.0.0.0 -p 8001 multichat.asgi:application (code=exited, status=2)
 Main PID: 2903 (code=exited, status=2)

May 06 19:55:24 ubuntu-s-1vcpu-1gb-ams3-01 daphne[2903]:               [-v VERBOSITY] [-t HTTP_TIMEOUT] [--access-log ACCESS_LOG]
May 06 19:55:24 ubuntu-s-1vcpu-1gb-ams3-01 daphne[2903]:               [--ping-interval PING_INTERVAL] [--ping-timeout PING_TIMEOUT]
May 06 19:55:24 ubuntu-s-1vcpu-1gb-ams3-01 daphne[2903]:               [--application-close-timeout APPLICATION_CLOSE_TIMEOUT]
May 06 19:55:24 ubuntu-s-1vcpu-1gb-ams3-01 daphne[2903]:               [--ws-protocol [WS_PROTOCOLS [WS_PROTOCOLS ...]]]
May 06 19:55:24 ubuntu-s-1vcpu-1gb-ams3-01 daphne[2903]:               [--root-path ROOT_PATH] [--proxy-headers]
May 06 19:55:24 ubuntu-s-1vcpu-1gb-ams3-01 daphne[2903]:               application
May 06 19:55:24 ubuntu-s-1vcpu-1gb-ams3-01 daphne[2903]: daphne: error: unrecognized arguments: multichat.asgi:application
May 06 19:55:24 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: daphne_seb.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
May 06 19:55:24 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: daphne_seb.service: Unit entered failed state.
May 06 19:55:24 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: daphne_seb.service: Failed with result 'exit-code'.

Я проверяю свой multichat.asgi:application, и он в нужном месте. Поэтому я не могу понять, почему написано error: unrecognized arguments: multichat.asgi:application.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Мой вопрос фактически такой же, как этот один . Подобные вопросы обычно отправляются на это решение . Сначала я не распознал этот вопрос так же, как мой, потому что (i.) Я еще не был знаком со словарем развертывания на каналах и (ii.) Во многих из этих вопросов и их решениях упоминаются вещи, которые уже были устарел для каналов 2. Я потерял страницу, но, например, для каналов 2 не требуется, чтобы мы сделали python manage.py runworker.

Существует также проблема upstart и systemd. Несколько решений используют сценарий выскочки. Но у меня было смутное ощущение, что, если я нахожусь на Ubuntu 16.04.4, я должен использовать systemd. Я сделал Google и обнаружил, что systemd действительно заменил выскочку, согласно таким статьям one .

@ kagronick предоставляет правильное решение systemd, но мне пришлось отредактировать его, чтобы оно работало для меня:

# /etc/systemd/system/daphne_seb.service

[Unit]
Description=daphne daemon for seb
After=network.target

[Service]
User=root
Group=www-data
WorkingDirectory=/home/seb/seb
ExecStart=/home/seb/env_seb/bin/daphne -b 0.0.0.0 -p 8001 multichat.asgi:application

# I turned this off for testing purposes.
# Still not sure if should use 'on-failure' or 'always'. 
# Restart=on-failure

[Install]
WantedBy=multi-user.target

А затем в оболочке:

systemctl daemon-reload
systemctl start daphne_seb.service
0 голосов
/ 06 мая 2018

Я использую для этого systemd. Вы должны установить файл модуля в /etc/systemd/system/daphne.service

с содержанием вроде:

[Unit]
Description=My Daphne Service
After=network.target

[Service]
Type=simple
User=wwwrunn
WorkingDirectory=/srv/myapp
ExecStart=/path/to/my/virtualenv/bin/python /path/to/daphne -b 0.0.0.0 -p 8001 myproject.asgi:application
Restart=on-failure

[Install]
WantedBy=multi-user.target

У меня все части моего приложения настроены таким образом. Это позволяет им возобновить работу, если они когда-нибудь потерпят крах. Systemd может обрабатывать все журналы. И все они запущены в правильном порядке. Используйте Type = simple, чтобы вам не приходилось делать разветвление или запись PID-файлов. Он просто будет управлять одним процессом. Я запускаю несколько из них, чтобы распределить нагрузку.

После того, как вы поместите этот файл на место, вы запустите

systemctl daemon-reload
systemctl start daphne.service
...