如何在 AWS Elastic Beanstalk 上部署 django 频道 2.x?
Posted
技术标签:
【中文标题】如何在 AWS Elastic Beanstalk 上部署 django 频道 2.x?【英文标题】:How to deploy django channels 2.x on AWS Elastic Beanstalk? 【发布时间】:2019-07-19 08:07:34 【问题描述】:This tutorial 涵盖频道 1.x 的部署。但是,这不适用于通道 2.x。失败的部分是守护脚本,如下:
files:"/opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_daemon.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
# Get django environment variables
djangoenv=`cat /opt/python/current/env
| tr '\n' ',' | sed 's/%/%%/g' | sed 's/export //g' | sed 's/$PATH/%(ENV_PATH)s/g'
| sed 's/$PYTHONPATH//g' | sed 's/$LD_LIBRARY_PATH//g'`
djangoenv=$djangoenv%?
# Create daemon configuraiton script
daemonconf="[program:daphne]
; Set full path to channels program if using virtualenv
command=/opt/python/run/venv/bin/daphne -b 0.0.0.0 -p 5000 <your_project>.asgi:channel_layer
directory=/opt/python/current/app
user=ec2-user
numprocs=1
stdout_logfile=/var/log/stdout_daphne.log
stderr_logfile=/var/log/stderr_daphne.log
autostart=true
autorestart=true
startsecs=10
; Need to wait for currently executing tasks to finish at shutdown.
; Increase this if you have very long running tasks.
stopwaitsecs = 600
; When resorting to send SIGKILL to the program to terminate it
; send SIGKILL to its whole process group instead,
; taking care of its children as well.
killasgroup=true
; if rabbitmq is supervised, set its priority higher
; so it starts first
priority=998
environment=$djangoenv
[program:worker]
; Set full path to program if using virtualenv
command=/opt/python/run/venv/bin/python manage.py runworker
directory=/opt/python/current/app
user=ec2-user
numprocs=1
stdout_logfile=/var/log/stdout_worker.log
stderr_logfile=/var/log/stderr_worker.log
autostart=true
autorestart=true
startsecs=10
; Need to wait for currently executing tasks to finish at shutdown.
; Increase this if you have very long running tasks.
stopwaitsecs = 600
; When resorting to send SIGKILL to the program to terminate it
; send SIGKILL to its whole process group instead,
; taking care of its children as well.
killasgroup=true
; if rabbitmq is supervised, set its priority higher
; so it starts first
priority=998
environment=$djangoenv"
# Create the supervisord conf script
echo "$daemonconf" | sudo tee /opt/python/etc/daemon.conf
# Add configuration script to supervisord conf (if not there already)
if ! grep -Fxq "[include]" /opt/python/etc/supervisord.conf
then
echo "[include]" | sudo tee -a /opt/python/etc/supervisord.conf
echo "files: daemon.conf" | sudo tee -a /opt/python/etc/supervisord.conf
fi
# Reread the supervisord config
sudo /usr/local/bin/supervisorctl -c /opt/python/etc/supervisord.conf reread
# Update supervisord in cache without restarting all services
sudo /usr/local/bin/supervisorctl -c /opt/python/etc/supervisord.conf update
# Start/Restart processes through supervisord
sudo /usr/local/bin/supervisorctl -c /opt/python/etc/supervisord.conf restart daphne
sudo /usr/local/bin/supervisorctl -c /opt/python/etc/supervisord.conf restart worker
部署后,AWS 的日志中有 2 个错误:daphne: No such process 和 worker: No such process。
应该如何更改此脚本,以便它也可以在通道 2.x 上运行?
谢谢
【问题讨论】:
频道 2 不需要 daphne 【参考方案1】:我遇到了同样的错误,我的原因是运行这些附加脚本的主管进程由于这行代码而没有选择 Daphne 进程:
if ! grep -Fxq "[include]" /opt/python/etc/supervisord.conf
这会检查 supervisord.conf 文件是否存在 [include]
,并且仅在不存在 [include]
时添加守护进程。
在我的情况下,我有一个
[include]
celery.conf
在阻止此 Daphne 脚本添加 daemon.conf 的 supervisord 文件中。
您可以做一些事情:
如果您有另一个创建 .conf 文件的脚本,请使用相同的包含逻辑将它们合并为一个
重写包含逻辑以专门检查 daemon.conf
通过 SSH 手动将 daemon.conf 添加到 supervisord.conf 到您的 EC2 实例
【讨论】:
以上是关于如何在 AWS Elastic Beanstalk 上部署 django 频道 2.x?的主要内容,如果未能解决你的问题,请参考以下文章