Как запустить работника из сельдерея на AWS Elastic Beanstalk?

Версии:

Джанго 1.9.8сельдерей 3.1.23джанго-сельдерей 3.1.17Python 2.7

Я пытаюсь запустить своего сельдерея на AWS Elastic Beanstalk. Я использую Amazon SQS в качестве брокера сельдерея.

Вот мой settings.py

INSTALLED_APPS += ('djcelery',)
import djcelery
djcelery.setup_loader()
BROKER_URL = "sqs://%s:%[email protected]" % (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY.replace('/', '%2F'))

Когда я печатаю строку ниже на терминале, он запускает рабочий на моем локальном компьютере. Также я создал несколько задач, и они выполняются правильно. Как я могу сделать это на AWS EB?

python manage.py celery worker --loglevel=INFO

я обнаружилэтот вопрос по StackOverflow. В нем говорится, что я должен добавить конфигурацию сельдерея в папку .ebextensions, которая выполняет сценарий после развертывания. Но это не работает. Буду признателен за любую помощь. После установки супервизора я ничего с ним не делал. Может быть, это то, что я скучаю. Вот сценарий.

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash

      # Get django environment variables
      celeryenv=`cat /opt/python/current/env | tr '\n' ',' | sed 's/export //g' | sed 's/$PATH/%(ENV_PATH)s/g' | sed 's/$PYTHONPATH//g' | sed 's/$LD_LIBRARY_PATH//g'`
      celeryenv=${celeryenv%?}

      # Create celery configuration script
      celeryconf="[program:celeryd]
      command=/opt/python/run/venv/bin/celery worker --loglevel=INFO

      directory=/opt/python/current/app
      user=nobody
      numprocs=1
      stdout_logfile=/var/log/celery-worker.log
      stderr_logfile=/var/log/celery-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=$celeryenv"

      # Create the celery supervisord conf script
      echo "$celeryconf" | tee /opt/python/etc/celery.conf

      # Add configuration script to supervisord conf (if not there already)
      if ! grep -Fxq "[include]" /opt/python/etc/supervisord.conf
          then
          echo "[include]" | tee -a /opt/python/etc/supervisord.conf
          echo "files: celery.conf" | tee -a /opt/python/etc/supervisord.conf
      fi

      # Reread the supervisord config
      supervisorctl -c /opt/python/etc/supervisord.conf reread

      # Update supervisord in cache without restarting all services
      supervisorctl -c /opt/python/etc/supervisord.conf update

      # Start/Restart celeryd through supervisord
      supervisorctl -c /opt/python/etc/supervisord.conf restart celeryd

Журналы от EB: Похоже, это работает, но все же не выполняет мои задачи.

-------------------------------------
/opt/python/log/supervisord.log
-------------------------------------
2016-08-02 10:45:27,713 CRIT Supervisor running as root (no user in config file)
2016-08-02 10:45:27,733 INFO RPC interface 'supervisor' initialized
2016-08-02 10:45:27,733 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2016-08-02 10:45:27,733 INFO supervisord started with pid 2726
2016-08-02 10:45:28,735 INFO spawned: 'httpd' with pid 2812
2016-08-02 10:45:29,737 INFO success: httpd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2016-08-02 10:47:14,684 INFO stopped: httpd (exit status 0)
2016-08-02 10:47:15,689 INFO spawned: 'httpd' with pid 4092
2016-08-02 10:47:16,727 INFO success: httpd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2016-08-02 10:47:23,701 INFO spawned: 'celeryd' with pid 4208
2016-08-02 10:47:23,854 INFO stopped: celeryd (terminated by SIGTERM)
2016-08-02 10:47:24,858 INFO spawned: 'celeryd' with pid 4214
2016-08-02 10:47:35,067 INFO success: celeryd entered RUNNING state, process has stayed up for > than 10 seconds (startsecs)
2016-08-02 10:52:36,240 INFO stopped: httpd (exit status 0)
2016-08-02 10:52:37,245 INFO spawned: 'httpd' with pid 4460
2016-08-02 10:52:38,278 INFO success: httpd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2016-08-02 10:52:45,677 INFO stopped: celeryd (exit status 0)
2016-08-02 10:52:46,682 INFO spawned: 'celeryd' with pid 4514
2016-08-02 10:52:46,860 INFO stopped: celeryd (terminated by SIGTERM)
2016-08-02 10:52:47,865 INFO spawned: 'celeryd' with pid 4521
2016-08-02 10:52:58,054 INFO success: celeryd entered RUNNING state, process has stayed up for > than 10 seconds (startsecs)
2016-08-02 10:55:03,135 INFO stopped: httpd (exit status 0)
2016-08-02 10:55:04,139 INFO spawned: 'httpd' with pid 4745
2016-08-02 10:55:05,173 INFO success: httpd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2016-08-02 10:55:13,143 INFO stopped: celeryd (exit status 0)
2016-08-02 10:55:14,147 INFO spawned: 'celeryd' with pid 4857
2016-08-02 10:55:14,316 INFO stopped: celeryd (terminated by SIGTERM)
2016-08-02 10:55:15,321 INFO spawned: 'celeryd' with pid 4863
2016-08-02 10:55:25,518 INFO success: celeryd entered RUNNING state, process has stayed up for > than 10 seconds (startsecs)
 Peter Brittain02 авг. 2016 г., 13:26
Благодарю. И производит ли сельдерей что-нибудь в своем лог-файле сейчас?
 r.bhardwaj16 сент. 2016 г., 19:37
Если новый экземпляр загружается из-за автоматического масштабирования в EB, то в этом новом экземпляре также будет запущен рабочий из сельдерея, то есть ли вероятность многократного выполнения одного и того же сообщения в SQS?
 Çağatay Barın02 авг. 2016 г., 13:35
как я могу это проверить? Можно увидеть, что также на всех журналах от еб?
 Çağatay Barın16 сент. 2016 г., 19:39
Мой рабочий экземпляр отличается от моего основного экземпляра, и он не масштабируется, он настроен как один экземпляр. Поэтому я не знаю, что будет в таком случае.
 Peter Brittain02 авг. 2016 г., 11:48
Если он не распознает supervisorctl, я предполагаю, что supervisor либо не установлен (что маловероятно на AWS EB!), Либо не находится на вашем пути ... Вы пытались использовать полные пути к supervisorctl?
 Peter Brittain03 авг. 2016 г., 16:19
Я думаю, что AWS загрузит эти журналы, если вы не настроите его. Увидетьdocs.aws.amazon.com/elasticbeanstalk/latest/dg/...
 Çağatay Barın02 авг. 2016 г., 11:18
Я проверил ссылку, которую вы отправили мне раньше. Я уже проверил это перед публикацией здесь. Когда я проверял журналы после развертывания, он говорит, что нет команды 'supervisorctl'. Я дам журналы с более подробной информацией позже.
 Çağatay Barın02 авг. 2016 г., 13:06
Я добавил журналы из эластичного бобового стебля.
 Peter Brittain02 авг. 2016 г., 18:14
Это зависит от вашего конфига сельдерея ... Если я все прочитал правильно, сельдерей передает все свои логи в stderr, который затем перейдет в/var/log/celery-worker.log
 Peter Brittain30 июл. 2016 г., 21:50
Кроме того, похоже, что эти крючки не являются официальными, и, возможно, вам придется сделать немного больше - как описано вjunkheap.net/blog/2013/05/20/...
 Çağatay Barın03 авг. 2016 г., 00:25
Когда я загружаю логи из aws, нет файла с именем "celery-worker.log". Я предполагаю, что есть какая-то ошибка.
 Çağatay Barın30 июл. 2016 г., 21:51
Да, это не официально, но, как я уже сказал, у кого-то все получилось. Я посмотрю, что ты отправишь, и отвечу тебе в ответ. Спасибо
 r.bhardwaj16 сент. 2016 г., 19:53
Подскажите, пожалуйста, каковы необходимые настройки Django для работника Celery и требуемые настройки Django для клиента Celery при использовании с SQS? В принципе, я не могу понять, какие настройки Django Celery Worker на удаленной машине будет читать из SQS.
 Peter Brittain30 июл. 2016 г., 21:45
Вы пробовали смотреть в eb-tools.log (см.stackoverflow.com/questions/12836834/...) проверить свой деплимент?
 Çağatay Barın16 сент. 2016 г., 20:03
Вы можете увидеть настройки выше. Я использовал также Амазонка sqs. Насколько я знаю, нет разницы между клиентом и работником. Разница исходит от запуска работника. Если вы не запускаете работника в одном экземпляре, он действует как клиент и может создавать задачи. Работник получает задачи из sqs и запускает их.

Ответы на вопрос(2)

Решение Вопроса

авил. Я создал новый файл "99-celery.config" в моей папке .ebextensions. В этом файле я добавил этот код, и он отлично работает. (не забудьте изменить название вашего проекта в строке № 16, мой - molocate_eb)

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash

      # Get django environment variables
      celeryenv=`cat /opt/python/current/env | tr '\n' ',' | sed 's/export //g' | sed 's/$PATH/%(ENV_PATH)s/g' | sed 's/$PYTHONPATH//g' | sed 's/$LD_LIBRARY_PATH//g'`
      celeryenv=${celeryenv%?}

      # Create celery configuraiton script
      celeryconf="[program:celeryd]
      ; Set full path to celery program if using virtualenv
      command=/opt/python/current/app/molocate_eb/manage.py celery worker --loglevel=INFO

      directory=/opt/python/current/app
      user=nobody
      numprocs=1
      stdout_logfile=/var/log/celery-worker.log
      stderr_logfile=/var/log/celery-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=$celeryenv"

      # Create the celery supervisord conf script
      echo "$celeryconf" | tee /opt/python/etc/celery.conf

      # Add configuration script to supervisord conf (if not there already)
      if ! grep -Fxq "[include]" /opt/python/etc/supervisord.conf
          then
          echo "[include]" | tee -a /opt/python/etc/supervisord.conf
          echo "files: celery.conf" | tee -a /opt/python/etc/supervisord.conf
      fi

      # Reread the supervisord config
      supervisorctl -c /opt/python/etc/supervisord.conf reread

      # Update supervisord in cache without restarting all services
      supervisorctl -c /opt/python/etc/supervisord.conf update

      # Start/Restart celeryd through supervisord
      supervisorctl -c /opt/python/etc/supervisord.conf restart celeryd

Изменить: В случае ошибки супервизора в AWS, просто убедитесь, что;

Вы используете Python 2, а не Python 3, так как супервизор не работает на Python 3.Не забудьте добавить супервизор в ваш файл require.txt.Если он по-прежнему выдает ошибку (случилось со мной один раз), просто «Перестройте среду», и это, вероятно, сработает.
 Raghu Kanchiraju19 февр. 2017 г., 05:59
Одна неприятная проблема, с которой я столкнулся, была с переменной celeryenv. При попытке запустить супервизор я получил ошибку «неправильно отформатированная строка». Проблема заключалась в том, что некоторые переменные окружения содержали символ «%», и они не были экранированы, поэтому это приводило к потере Python. Чтобы решить эту проблему, добавьте| sed 's/%/%%/g' к линииceleryenv= ....
 bones22514 авг. 2019 г., 22:27
Supervisor теперь поддерживает Python3github.com/Supervisor/supervisor/issues/1060
 Babu26 мар. 2017 г., 10:34
Я уверен, что эти ловушки не будут выполняться при автоматическом масштабировании и масштабировании. Крючки не будут скопированы. Я попытался поместить скрипты в каталоги post и pre init. Но не повезло. На форумах AWS нет четких ответов, так как хуки являются недокументированными функциями и могут быть изменены без предварительного уведомления.
 Chirag Maliwal24 янв. 2018 г., 12:40
@ ÇağatayBarın, что мне нужно сделать в случае с python3.6, потому что супервизор не поддерживается для python3.6.
 Çağatay Barın04 янв. 2017 г., 11:18
Я не писал сценарий, вы можете найти писателя под вопросом.
 Raghu Kanchiraju04 янв. 2017 г., 10:25
Что делает этоceleryenv = $ {celeryenv%?} делать?
 Çağatay Barın25 янв. 2018 г., 08:15
@chiragmaliwal В то время, когда я публиковал ответ, у супервизора был отказ от ответственности за python3 на их странице github, но, очевидно, они начали поддерживать проект для python3. (См. Удаление заявления об отказе здесь:github.com/Supervisor/supervisor/commit/...). Я ничего не знаю о вашем проекте, но вы можете попробовать его в основной ветке, но не в релизной версии. Он не готов к производству и, вероятно, не стабилен. Поэтому я не несу за это никакой ответственности :) Вы можете проверить результаты TravisCI, щелкнув значок галочки на странице филиалов.
 Çağatay Barın05 янв. 2017 г., 21:49
Вы уверены, что сценарий все еще будет существовать в откате?
 Çağatay Barın26 мар. 2017 г., 11:10
В то время я использовал это для своего приложения, и это помогло мне. Но очевидно, что это не лучший способ справиться с этой ситуацией. Либо aws должен добавить поддержку для этого, либо вы должны сделать это самостоятельно с помощью ec2, который является лучшим способом сделать это. Извините, ребята, я не работал над бэкэнд-системами более 6 месяцев и не могу вам с этим помочь. :(
 brocksamson05 янв. 2017 г., 17:39
Это отличный способ решить проблему, но в этом подходе есть один важный момент. Этот файл останется в каталоге ловушки развертывания и не будет удален, если вы выполните откат к предыдущей версии приложения. то есть V1 моего приложения развернуто, я добавляю сельдерей в V2 моего приложения. После развертывания я понимаю, что в V2 есть существенная ошибка, и мне нужно откатить сервер до V1. Развертывание V1 в среде beanstalk завершится неудачно, поскольку этот скрипт ловушки все еще существует в папке после развертывания, но код сельдерея больше не находится в среде.

сельдерей в демоническом процессе.

[program:tornado-8002]
directory: name of the director where django project lies
command: command to run celery // python manage.py celery
stderr_logfile = /var/log/supervisord/tornado-stderr.log
stdout_logfile = /var/log/supervisord/tornado-stdout.log
 Evan Chu06 авг. 2016 г., 04:29
это было именно то, что делал OP ...

Ваш ответ на вопрос