djangocl和supervisord之间的简单集成
项目描述
Django-supervisor结合了supervisord的进程管理优势以及Django管理脚本的便捷性。
理由
如今运行Django项目往往不仅仅是启动一个web服务器。您可能需要让Django在FCGI或CherryPy下运行,后台任务由celeryd管理,周期性任务由celerybeat调度,以及许多其他进程协同工作以保持项目的正常运行。
当您只是开发或调试时,手动启动和停止所有这些不同的进程是非常痛苦的。
当您部署时,确保每个进程都正确地连接到系统启动脚本并进行正确配置是非常痛苦的。
Django-supervisor在您的Django项目和supervisord进程控制系统之间提供了一个便捷的桥梁。它使得启动项目所需的所有进程变得非常简单
$ python myproject/manage.py supervisor
优势
Django-supervisor在supervisord提供的出色功能之上确实是一个很薄的一层。但通过与Django管理脚本的紧密集成,您可以获得一些优势
manage.py仍然是运行您的项目的单一控制点。
在开发环境中运行所有这些进程与在生产环境中运行一样简单。
在调试模式下运行时,您会自动重新加载所有进程。
进程配置可以依赖于Django设置和环境变量,并且路径相对于您的项目或应用程序。
配置
Django-supervisor 是 supervisord 的包装器,因此它使用相同的配置文件格式。基本上,你可以编写一个类似于 ini 风格的配置文件,其中每个部分定义了一个要启动的进程。以下是一些示例,但请参阅 supervisord 文档以获取所有更详细的细节。
要开始使用,只需在 INSTALLED_APPS 中包含“djsupervisor”,并在项目目录中放置一个“supervisord.conf”文件,紧挨着主要的 manage.py 脚本。
一个简单的配置示例可能会同时运行 Django 开发服务器和 Celery 任务守护进程。
[program:webserver] command={{ PYTHON }} {{ PROJECT_DIR }}/manage.py runserver --noreload [program:celeryd] command={{ PYTHON }} {{ PROJECT_DIR }}/manage.py celeryd -l info
现在,当你运行“supervisor”管理命令时,它将检测此文件并为你启动两个进程。
请注意,配置文件是使用 Django 的模板引擎进行解释的。这让你可以做些有趣的事情,比如定位到项目根目录的相对文件路径。
更好的是,你可以根据项目设置或环境来使配置的部分条件化。例如,你可能在进行调试时启动开发服务器,但在生产中运行 FCGI。
[program:webserver] {% if settings.DEBUG %} command={{ PYTHON }} {{ PROJECT_DIR }}/manage.py runserver {% else %} command={{ PYTHON }} {{ PROJECT_DIR }}/manage.py runfcgi host=127.0.0.1 port=8025 {% endif %}
用法
Django-supervisor 提供了一个名为“supervisor”的新 Django 管理命令,允许你控制属于你的所有项目进程。
当不带参数运行时,它将启动 supervisord 以启动和监视所有配置的进程。以下是一些使用上一节中所示配置文件的示例输出。
$ python myproject/manage.py supervisor 2011-06-07 23:46:45,253 INFO RPC interface 'supervisor' initialized 2011-06-07 23:46:45,253 INFO supervisord started with pid 4787 2011-06-07 23:46:46,258 INFO spawned: 'celeryd' with pid 4799 2011-06-07 23:46:46,275 INFO spawned: 'webserver' with pid 4801 2011-06-07 23:46:47,456 INFO success: webserver entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) 2011-06-07 23:46:56,512 INFO success: celeryd entered RUNNING state, process has stayed up for > than 10 seconds (startsecs)
默认情况下,“supervisor”命令将保持在前台,并将状态更新打印到控制台。传递 –daemonize 选项以使其在后台运行。您还可以使用配置文件中的所有 supervisord 标准选项来调整其行为。
一旦 supervisor 启动并运行,您可以通过与它交互来控制正在运行的进程。运行“manage.py supervisor shell”将启动交互式 supervisorctl 命令行。从这里,您可以查看进程状态并启动/停止/重启单个进程。
$ python myproject/manage.py supervisor shell celeryd RUNNING pid 4799, uptime 0:03:17 webserver RUNNING pid 4801, uptime 0:03:17 supervisor> supervisor> help default commands (type help <topic>): ===================================== add clear fg open quit remove restart start stop update avail exit maintail pid reload reread shutdown status tail version supervisor> supervisor> stop celeryd celeryd: stopped supervisor> supervisor> status celeryd STOPPED Jun 07 11:51 PM webserver RUNNING pid 4801, uptime 0:04:45 supervisor>
您还可以在命令行上直接发出单个进程管理命令。
$ python myproject/manage.py supervisor start celeryd celeryd: started $ $ python myproject/manage.py supervisor status celeryd RUNNING pid 4937, uptime 0:00:55 webserver RUNNING pid 4801, uptime 0:09:05 $ $ python myproject/manage.py supervisor shutdown Shut down $
有关所有可用管理命令的详细信息,请参阅 supervisord 文档。
命令行选项
“supervisor”命令接受以下选项
- --daemonize
在后台运行 supervisord 进程
- --pidfile
将 supervisord 进程的 PID 存储在此文件中
- --logfile
将 supervisord 日志写入此文件
- --project-dir
将其用作 django 项目目录
- --launch=program
在 supervisor 启动时自动启动程序
- --nolaunch=program
在启动时不要自动启动程序
- --exclude=program
从 supervisord 配置中删除程序
- --include=program
将程序包含在 supervisord 配置中
- --autoreload=program
当代码文件更改时重启程序
- --noreload
当代码文件更改时不要重启程序
额外功能
Django-supervisor 在 supervisord 的配置语言之上提供了一些额外的好处。
模板化
所有 supervisord.conf 文件都通过 Django 的模板系统进行渲染。这允许您从设置或环境中插值值,并根据条件切换进程的开关。每个配置文件的模板上下文包含以下变量
PROJECT_DIR the top-level directory of your project (i.e. the directory containing your manage.py script). APP_DIR for app-provided config files, the top-level directory containing the application code. PYTHON full path to the current python interpreter. SUPERVISOR_OPTIONS the command-line options passed to manage.py. settings the Django settings module, as seen by your code. environ the os.environ dict, as seen by your code.
如果您的项目有其他需要插值这些值的配置文件,您可以通过“templated”过滤器来引用它们,如下所示
[program:nginx] command=nginx -c {{ "nginx.conf"|templated }}
文件路径相对于您的项目目录。 Django-supervisor 将读取指定的文件,通过其模板逻辑进行处理,写入一个匹配的“nginx.conf.templated”文件,并将此文件的路径作为过滤器的结果插入。
默认值、覆盖和排除
Django-supervisor 识别一些在合并多个应用程序特定和项目特定配置文件时有用的特殊配置文件选项。
可以使用[程序:__defaults__]部分为所有其他[程序]部分提供默认选项。只有在通过django-supervisor找到的配置文件中都没有为特定程序提供该选项时,才会使用这些选项。
可以使用[程序:__overrides__]部分覆盖所有已配置程序的选项。这些选项将应用于所有进程,而不考虑任何其他配置文件的内容。
最后,可以通过将选项“exclude”设置为true来完全禁用[程序]部分。这主要用于禁用第三方应用程序提供的进程定义。
以下是一个示例配置文件,展示了它们如何发挥作用
; We want all programs to redirect stderr by default, ; unless specifically configured otherwise. [program:__defaults__] redirect_stderr=true ; We force all programs to run as user "nobody" [program:__overrides__] user=nobody ; Don't reload programs when python code changes. [program:autoreload] exclude=true
自动控制套接字配置
supervisord和supervisorctl程序通过XML-RPC控制套接字进行交互。这提供了很大的灵活性和对安全性的控制,但您必须正确配置它,否则事情不会按预期进行。
为了开发过程中的便利,django-supervisor提供了自动控制套接字配置。默认情况下,它将服务器绑定到localhost上的一个固定但随机的端口,并基于settings.SECRET_KEY设置用户名和密码。
对于生产部署,您可能希望通过设置[inet_http_server]或[unix_http_server]部分来重新配置。Django-supervisor将尊重您提供的任何此类设置。
自动重新加载
在调试模式下运行时,django-supervisor会自动定义一个名为“autoreload”的进程。这非常类似于Django开发服务器的自动重新加载功能,但它适用于所有配置的进程。例如,这将允许您在代码更改时自动重新启动开发服务器和celeryd。
要防止单个程序自动重新加载,请将其“autoreload”选项设置为false。
[program:non-python-related] autoreload=false
要完全关闭自动重新加载进程,可以将supervisor或排除它从您的项目配置文件中传递–noreload选项,如下所示
[program:autoreload] exclude=true
项目详情
django-supervisor-0.4.0.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 7f31daa0aa0a2d4aef802b6758bd64d1f9397f0aa42bf5b8e601a5856172d195 |
|
MD5 | b53ad27a7a4be74075e5694f7f93b4e2 |
|
BLAKE2b-256 | 5d06dbb523e743fc142a4895607d7dcb7986b9da81fddc59f22a6afd79643ff3 |