作为练习,我尝试在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-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
,我看到了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
。
2条答案
按热度按时间ux6nzvsh1#
我使用systemd来实现它。您可以在/etc/systemd/system/daphne.service中设置一个单元文件
内容包括:
我用这种方式配置了我的应用程序的所有部分。它允许它们在崩溃时恢复。Systemd可以处理所有的日志记录。它们都以正确的顺序启动。使用Type=simple,这样你就不需要做任何分叉或写PID文件。它只会管理一个进程。我运行了其中的一些来分散负载。
将此文件放置到位后,您将运行以下命令:
使系统识别服务
启动服务
使其在重新启动时运行
您需要编辑一些参数来满足您的需要。如果您将文件命名为
daphne.service
以外的名称,您需要在命令中更改它。ExecStart
行需要更改为您的python路径和应用程序所在的命名空间。您的日志现在将显示在
journalctl
中。要查看此服务的日志,您可以执行journalctl -u daphine.service
。如果您想跟踪日志,请将-f
放在“follow”的末尾。journalctl
有一系列选项,您可以使用--help
或通过在线查找资源找到这些选项。systemd单元文件也是如此。当然,您应该知道Daphine不应该直接暴露在Web上。Nginx、Apache或其他Web服务器应该代理Daphne并为您的静态资产提供服务。(您也可以使用CDN来实现这一点)
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解决方案,但我不得不编辑它,使它为我工作:
然后换壳: