更改源代码时自动加载gunicorn


113

最后,我将开发环境从runserver迁移到gunicorn / nginx。

将runserver的自动重载功能复制到gunicorn会很方便,因此当源更改时,服务器会自动重新启动。否则,我必须使用手动重新启动服务器kill -HUP

有什么方法可以避免手动重启?


勘误表:在我的环境中,机枪兽是由有监督者管理/监视的,所以我实际上不是kill -HUP进程PID,而是使用supervisorctl。不过,不要以为这会发生很大变化。
Paolo

Answers:


232

尽管这是个老问题,但仅出于一致性考虑-因为19.0版本的gunicorn可以--reload选择。因此,不再需要第三方工具。


5
同意 其他答案可能有用,但这是最简单的方法,不是解决方法。这正是OP想要的。
J-bob

1
我不相信在gunicorn中内置了--reload选项。您在哪里找到的?他们的文档说,要重新加载配置,发送一个HUP(killall -HUP procname可以正常工作),以启动新的工作线程,而旧的工作线程则正常关闭。
sofly 2014年

3
谢谢@瓜达利诺,我一定错过了。不过,有趣的是,他们说“此设置用于开发”。在某些情况下,这显然可以用于生产,但在其他情况下,也可能存在问题。是的,我确实在下面看到您似乎对生产/部署不感兴趣。
2014年

对于生产服务器如何轻松实现?
胡安·伊萨扎(Juan Isaza)

@juanIsaza,您永远不应在生产中使用此类功能。如果您认为需要它-您需要重新考虑开发或部署的方法。
德米特里·齐奥尔科夫斯基

20

一种选择是使用--max-requests通过添加--max-requests 1到启动选项来将每个生成的进程限制为仅服务一个请求。每个新产生的进程都应该看到您的代码更改,并且在开发环境中,每个请求的额外启动时间可以忽略不计。


1
开发环境的好方法。无法在产品上使用...,但是您可能无论如何都不希望在产品上自动重载,除非您进行“连续部署”。如果您愿意,即使需要功能强大的软件包,布莱恩·赫尔米格(Bryan Helmig)的方法也会更好。pipwatchdog
滚刀2013年

2
引导新工作人员大约需要3秒钟,这对我来说太慢了。(2009年中的MBP)
Blaise 2014年

11

Bryan Helmig提出了这个建议,我对其进行了修改,以使其直接使用run_gunicorn而不是gunicorn直接启动,以便可以将这3个命令剪切并粘贴到django项目根文件夹中的shell中(激活了virtualenv):

pip install watchdog -U
watchmedo shell-command --patterns="*.py;*.html;*.css;*.js" --recursive --command='echo "${watch_src_path}" && kill -HUP `cat gunicorn.pid`' . &
python manage.py run_gunicorn 127.0.0.1:80 --pid=gunicorn.pid

刚在Django 1.5.4,gunicorn 18.0,watchdog 0.6,bash 4.2的fedora 15上为自己使用过。
滚刀

127.0.0.1:80如果需要的话,请不要忘记将IP或FQDN和端口替换为。
滚刀

1
@Guandalino,有运气吗?对我来说,已经好几个星期了。只有在需要更改settings.pymodels.py(需要迁移)或某些外部应用程序的源代码不在我的watchmedo模式中时,才需要手动重新启动。
滚刀

感谢您的提醒。但是我不想对他人的成功投赞成票。为什么这么(不必要)着急?我违反某些StackOverflow规则吗?如果是这样,请让我知道如何补救。
Paolo 2013年

1
别担心。绝对不违反SO规则,将精力/优先级放在评估有用答案上只是体贴/认真/周到的。看起来像Dave,我花了很长时间(很多个月)为您提供帮助,所以我急于让您验证我们的解决方案的紧迫感不成比例-我非常想知道我的方式中是否存在隐藏的缺陷已经配置了服务器,并且是否应该切换到Dave的方法。节日快乐!
滚刀

5

我使用git push部署到生产环境,并设置git挂钩来运行脚本。这种方法的优点是您还可以同时进行迁移和软件包安装。 https://mikeeverhart.net/2013/01/using-git-to-deploy-code/

mkdir -p /home/git/project_name.git
cd /home/git/project_name.git
git init --bare

然后创建一个脚本/home/git/project_name.git/hooks/post-receive

#!/bin/bash
GIT_WORK_TREE=/path/to/project git checkout -f
source /path/to/virtualenv/activate
pip install -r /path/to/project/requirements.txt
python /path/to/project/manage.py migrate
sudo supervisorctl restart project_name

确保为chmod u+x post-receive,并将用户添加到sudoers。允许它sudo supervisorctl不带密码运行。 https://www.cyberciti.biz/faq/linux-unix-running-sudo-command-without-a-password/

在本地/开发服务器上,我进行了设置,git remote从而可以推送到生产服务器

git remote add production ssh://user_name@production-server/home/git/project_name.git

# initial push
git push production +master:refs/heads/master

# subsequent push
git push production master

另外,在脚本运行时,您将看到所有提示。因此,您将看到迁移/软件包安装/主管重启是否存在任何问题。


请注意,#!/bin/bash如上所述使用shebang 代替#!/bin/shGit post-receive示例!
curtisp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.