部署Django通道:如何在退出Web服务器上的shell后保持Daphne运行

2eafrhcq  于 2022-11-18  发布在  Go
关注(0)|答案(2)|浏览(165)

作为练习,我尝试在DigitalOcean Ubuntu 16.04.4上部署Andrew Godwin的multichat example和Django Channels 2.1.1。但是,我不知道如何在不停止Channels的Daphne服务器的情况下退出Ubuntu服务器。
现在,我对部署的全部熟悉都来自于这个tutorial,这就是我部署站点的方式。但是根据Channels的documentation,我必须在生产环境中运行以下三个之一才能启动Daphne:

  • 应用程序
  • 应用程序开发
    • -0.0.0.0-----------------------------------------

所以,除了遵循DigitalOcean教程,我还运行了这些。第三个对我很有效,网站运行得很好。但是,如果我在Ubuntu上退出shell,Daphne也会停止。
这个教程让gunicorn访问一个sock文件(--bind unix:/home/sammy/myproject/myproject.sock),在我的研究中,我在2018年之前发布的一些网站上看到,不知何故,在某个地方生成了一个daphne.sock文件。所以,我猜Channels的部署也是类似的?但我还没有看到任何关于如何做到这一点的细节。
如何部署多聊天示例,以便在不停止Daphne的情况下退出Ubuntu Web服务器?

  • 更新时间:2018年5月6日,欧洲中部时间晚上8点:*

我尝试了下面kagronick的解决方案,并在/etc/systemd/system/daphne_seb.service中创建了一个systemd文件:

[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-reloadsystemctl 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,我看到了here。但这也没有帮助。

  • 更新时间:2018年5月6日,欧洲中部时间晚上10点:*

然后,我读到here在10秒内只允许5次重新启动,所以我删除了Restart=on-failure来自己启动服务。
这让我回到了Unknown command: 'daphne',这个solution建议我不要指向Python,而应该指向virtualenv中的Daphne,所以我修改了它: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

ux6nzvsh

ux6nzvsh1#

我使用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文件。它只会管理一个进程。我运行了其中的一些来分散负载。
将此文件放置到位后,您将运行以下命令:
使系统识别服务

sudo systemctl daemon-reload

启动服务

sudo systemctl start daphne.service

使其在重新启动时运行

sudo systemctl enable daphne.service

您需要编辑一些参数来满足您的需要。如果您将文件命名为daphne.service以外的名称,您需要在命令中更改它。ExecStart行需要更改为您的python路径和应用程序所在的命名空间。
您的日志现在将显示在journalctl中。要查看此服务的日志,您可以执行journalctl -u daphine.service。如果您想跟踪日志,请将-f放在“follow”的末尾。journalctl有一系列选项,您可以使用--help或通过在线查找资源找到这些选项。systemd单元文件也是如此。
当然,您应该知道Daphine不应该直接暴露在Web上。Nginx、Apache或其他Web服务器应该代理Daphne并为您的静态资产提供服务。(您也可以使用CDN来实现这一点)

cbeh67ev

cbeh67ev2#

我的问题实际上和这个one一样。像这样的问题通常会被发送到这个solution。我一开始没有意识到这个问题和我的问题一样,因为(i.)我还不熟悉渠道部署的词汇,(ii.)这些问题和解答中有很多都提到了Channels 2中已经过时的内容。我丢失了该页,但是,例如,频道2不需要我们做python manage.py runworker
还有upstart和systemd的问题。一些解决方案使用upstart脚本。但是,我有一种模糊的感觉,也许如果我在Ubuntu 16.04.4上,我应该使用systemd。我在谷歌上搜索了一下,发现systemd确实取代了upstart,根据像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

相关问题