如何在生产环境中将Celery作为守护进程运行?

20
5个回答

22

我不确定你在这里做什么,但下面是作为守护进程运行celery的步骤。

  1. 你需要将链接中引用的文件https://github.com/celery/celery/blob/3.0/extra/generic-init.d/celeryd拷贝到 /etc/init.d 文件夹,并重命名为celeryd
  2. 接着你需要在文件夹/etc/default 中创建一个名为celeryd的配置文件,该文件由上述脚本使用。此配置文件基本上定义了一些变量和路径,这些变量和路径由上述脚本使用。以下是示例配置。
  3. 泛化的init脚本解释了这个过程,并可作为参考。

由 @Kishor-Pawar:我想在您的回答中添加一些内容。 一旦您创建了这两个文件,您需要启动celeryd服务。(service celeryd start) 它可能会抛出类似于无效用户“celery”的错误。 该错误在conf文件(/etc/default/celeryd)中用CELERY_USER进行了说明。 您可能需要将指定的用户更改为当前用户或需要创建新用户。 您还需要提供所需的权限。 - bummi
2
如果你阅读了celery页面上的说明,人们会感到困惑并不奇怪,因为暗示是有一个文件并且它放在/etc/default中。对于有服务器Linux经验的人来说,你可以解决这个问题,但任何新手都会迷失方向。这篇回答应该加入说明中。 - MagicLAMP

9
我发现这个链接非常有用:如何为Celery(django-celery)在虚拟环境中编写Ubuntu Upstart作业 稍微调整一下.. 我使用以下脚本运行Celery工作程序:
(使用Ubuntu Upstart)
命名为iamcelery.conf,并将其放置在/etc/init目录中(注意:不是init.d)
# iamcelery -runs the celery worker as my virtual env user
#
#
# This task is run on startup to start the celery worker as my vritual env user

description "runs the celery worker"
author "michel van Leeuwen <michel@iamit.nl>"

start on runlevel [2345]
stop on runlevel [!2345]

# retry if ended unexpectedly
respawn
# limit the retries to max 15 times with timeouts of 5 seconds
respawn limit 15 5

# Time to wait between sending TERM and KILL signals
kill timeout 20

task
script
  exec su -s /bin/sh -c 'exec "$0" "$@"' <place here your unprovilegd username> -- srv/<here the path of your django project>/bin/django celeryd -BE -l info
end script

现在您可以启动这个脚本(它也会在服务器启动时自动启动):
sudo start iamcelery

或停止:

sudo stop iamcelery

或者检查它的状态:

sudo status iamcelery

我不确定这是最简洁的方法... 然而... 经过长时间的试错尝试让initd脚本工作...(没有成功)... 最终这个方法起作用了。

2013年6月8日编辑 我在此给出的脚本最终似乎以根用户身份运行。 现在我已更改为:

script
  su <place here your unprovilegd username>
  cd /srv/<here the path of your django project>/
  exec bin/django celeryd -BE -l info
end script

into:

script
  exec su -s /bin/sh -c 'exec "$0" "$@"' <place here your unprovilegd username> -- srv/<here the path of your django project>/bin/django celeryd -BE -l info
end script

这个方法非常有效,所有的功劳归功于这个问题的答案:如何为Celery(django-celery)在虚拟环境中编写Ubuntu Upstart作业

2013年9月5日编辑

还有一件小事:在控制台中启动命令后,我必须按ctrl-c键(并在此之后进行状态检查):如果有人知道,请将其留在命令中,我可以更新这个答案...


你好,为什么在这种情况下进程能成功启动,但 upstart 却无法启动? - spchuang
不确定。一切似乎都正常工作。当您使用Ctrl+C并执行状态命令时,它会运行。 - michel.iamit

9

我通常使用supervisor(加上django-supervisor)来实现这个目的。这样,您就不需要弄清楚如何将应用程序中的每个进程守护化(至少包括托管django的Web服务器,加上celery,以及您实际使用的任何其他中间件来支持这两者)。Supervisor知道如何作为守护进程运行自身,并且您的所有其他进程都作为supervisor的子进程运行。


那么你安装了Supervisor,接下来呢? - frankster
3
@frankster 然后你使用它 - Marcin
Linux 真是一团糟,我有很多选择,如 init 脚本、systemd 和 Ubuntu upstart 都可以工作。但为什么我们需要学习所有这些呢?相反,我们可以使用 supervisor,在所有 Linux 发行版上都能很好地工作,并且只需要学习一次。 - user4985526

4

如Marcin在他的回答中所解释的那样,supervisor通常是人们最终使用的工具,但如果你正在寻找可以与python3配合使用且不能等待supervisor的版本4(我认为将支持python3),那么你可以选择circus。安装完成后,你只需要有一个circus.ini文件,其中包含您要转换为守护进程的所有进程,然后运行该示例circus.ini文件可能类似于:

[watcher:celery]
cmd = full_path/python3.4 full_path/manage.py celeryd -B -l info

[watcher:celerycamera]
cmd = full_path/python3.4 full_path/manage.py celery events --camera=djcelery.snapshot.Camera

[watcher:dceleryflower]
cmd = full_path/python3.4 full_path/manage.py celery flower -A your_app_name --basic_auth=username:password --port=5555 

如果你需要更多细节,我有一篇与此相关的文章在这里。希望它能为某些人节省时间。谢谢。

您可以通过supervisor运行任何版本的Python进程。当然,这样您需要两个虚拟环境,这可能并不完全理想。 - Marcin

1
注意:在Ubuntu 16.04中,我的.conf文件的答案不再起作用。
我创建了一个.service文件,并将其放置在/etc/systemd/system/中。
我可以使用以下命令:
sudo service myservice status
sudo service myservice start
sudo service myservice stop 例如,这个文件:

myservice.service:

[Unit] 
Description=My celery worker 

[Service]
WorkingDirectory=/srv/my-project-path
User=buildout
Group=buildout
Restart=on-failure
RestartSec=20 5
ExecStart=/srv/my-project/bin/django celeryd -BE

[Install]
WantedBy=multi-user.target
Alias=myservice.service

注意,我使用buildout,因此大多数用户需要使用python路径并使用mange.py代替bin/django。
基于:http://minecraft.gamepedia.com/Tutorials/Ubuntu_startup_script(请参见systemd部分)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接