【发布时间】:2017-10-12 07:50:13
【问题描述】:
过去几天我一直在我的 Django 应用程序中实现 Channels,以便使用 Channel 的 websocket 支持。我的 Django 项目是用 Python 3.4 编写的,我使用的是 Daphne 和 Channel 的 redis 后端。
通过将 Supervisord 包装在 Python2 virtualenv 中并使用它运行在 Python3 virtualenv 中启动 Daphne/Redis/workers 的脚本,我已经能够让所有东西在本地运行,但没有成功部署到我们的 Elastic Beanstalk(Python 3.4 ) 环境。
有什么方法可以设置我的 EB 部署配置以在 Python2 virtualenv 中运行 Supervisor,就像我可以在本地一样?如果没有,我该如何让 Daphne、redis 和我的工作人员在 EB 部署上启动并运行?如有必要,我愿意切换流程管理器,但发现 Supervisor 的语法比 Circus 更容易理解/实现,并且不知道有任何其他可行的替代方案。
使用此配置,我能够成功部署到我的 EB 环境并通过 ssh 进入其中,但 Supervisor 无法启动每个进程,如果我尝试手动启动 Supervisor 以检查进程 supervisorctl status 会给我 @987654325 @我尝试初始化的所有内容。日志是空的。
频道后端配置:
CHANNEL_LAYERS = {
"default": {
"BACKEND": "asgi_redis.RedisChannelLayer",
"ROUTING": "<app>.routing.channel_routing",
"CONFIG": {
"hosts": [
os.environ.get('REDIS_URL', 'redis://localhost:6379')
],
},
},
}
asgi.py:
import os
from channels.asgi import get_channel_layer
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<app>.settings")
channel_layer = get_channel_layer()
supervisor conf(conf 文件的其余部分保持默认):
[program:Redis]
environment=PATH="/opt/python/run/venv/bin"
command=sh /opt/python/current/app/<app>/start_redis.sh
directory=/opt/python/current/app
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/tmp/redis.out.log
[program:Daphne]
environment=PATH="/opt/python/run/venv/bin"
command=sh /opt/python/current/app/<app>/start_daphne.sh
directory=/opt/python/current/app
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/tmp/daphne.out.log
[program:Worker]
environment=PATH="/opt/python/run/venv/bin"
command=sh /opt/python/current/app/<app>/start_worker.sh
directory=/opt/python/current/app
process_name=%(program_name)s_%(process_num)02d
numprocs=4
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/tmp/workers.out.log
.ebextensions/channels.config:
container_commands:
01_start_supervisord:
command: "sh /supervisord/start_supervisor.sh"
start_supervisor.sh:
#!/usr/bin/env bash
virtualenv -p /usr/bin/python2.7 /tmp/senv
source /tmp/senv/bin/activate
sudo pip install supervisor
sudo /usr/local/bin/supervisord -c
/opt/python/current/app/<app>/supervisord.conf
supervisorctl -c /opt/python/current/app/<app>/supervisord.conf status
start_redis:
#!/usr/bin/env bash
sudo wget http://download.redis.io/releases/redis-3.2.8.tar.gz
sudo tar xzf redis-3.2.8.tar.gz
cd redis-3.2.8
sudo make
source /opt/python/run/venv/bin/activate
sudo src/redis-server
start_daphne:
#!/usr/bin/env bash
source /opt/python/run/venv/bin/activate
/opt/python/run/venv/bin/daphne -b 0.0.0.0 -p 5000 <app>.asgi:channel_layer
start_worker:
#!/usr/bin/env bash
source /opt/python/run/venv/bin/activate
python manage.py runworker
我大致关注this guide,但由于它是为 python2 EB 环境编写的,它实际上只适用于 ALB 设置和基本主管配置。
感谢大家阅读本文,如果我可以通过代码/输出等方式提供任何其他内容,请告诉我。
【问题讨论】:
-
提醒任何打算这样做的人,请注意,在自动缩放 EB 环境中,已建立的 websocket 有可能在 EC2 实例死亡/存在时不会收到 sigkill 或其他信号旋转下来。由于 websocket 连接在保持打开状态时突然没有响应,这给我们的前端带来了很多麻烦。我已经关闭了该项目并且无法提供解决方案,但想指出它可能会为某人节省一些痛苦。
标签: django python-3.x amazon-elastic-beanstalk supervisord django-channels