最后,我将开发环境从runserver迁移到gunicorn / nginx。
将runserver的自动重载功能复制到gunicorn会很方便,因此当源更改时,服务器会自动重新启动。否则,我必须使用手动重新启动服务器kill -HUP
。
有什么方法可以避免手动重启?
最后,我将开发环境从runserver迁移到gunicorn / nginx。
将runserver的自动重载功能复制到gunicorn会很方便,因此当源更改时,服务器会自动重新启动。否则,我必须使用手动重新启动服务器kill -HUP
。
有什么方法可以避免手动重启?
Answers:
尽管这是个老问题,但仅出于一致性考虑-因为19.0版本的gunicorn可以--reload
选择。因此,不再需要第三方工具。
killall -HUP procname
可以正常工作),以启动新的工作线程,而旧的工作线程则正常关闭。
一种选择是使用--max-requests通过添加--max-requests 1
到启动选项来将每个生成的进程限制为仅服务一个请求。每个新产生的进程都应该看到您的代码更改,并且在开发环境中,每个请求的额外启动时间可以忽略不计。
pip
watchdog
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
127.0.0.1:80
如果需要的话,请不要忘记将IP或FQDN和端口替换为。
settings.py
,models.py
(需要迁移)或某些外部应用程序的源代码不在我的watchmedo
模式中时,才需要手动重新启动。
我使用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/sh
Git post-receive
示例!
kill -HUP
进程PID,而是使用supervisorctl。不过,不要以为这会发生很大变化。