gunicorn autoreload on source change

时间:2012-10-07 23:36:01

标签: python django reload gunicorn

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

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

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

4 个答案:

答案 0 :(得分:194)

虽然这是一个老问题,但只是为了保持一致性 - 因为版本19.0 gunicorn有--reload选项。 所以没有更多的第三方工具需要。

答案 1 :(得分:20)

一种选择是使用--max-requests通过向启动选项添加--max-requests 1来限制每个生成的进程只提供一个请求。每个新生成的进程都应该看到您的代码发生了变化,并且在开发环境中,每个请求的额外启动时间应该可以忽略不计。

答案 2 :(得分:10)

Bryan Helmig提出了这个问题,我将其修改为使用run_gunicorn而不是直接启动gunicorn,以便将这3个命令剪切并粘贴到您的shell中django项目根文件夹(激活你的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

答案 3 :(得分:2)

我使用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 supervisorctlhttps://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

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