[python] 소스 변경시 gunicorn 자동 새로 고침

마지막으로 개발 환경을 runserver에서 gunicorn / nginx로 마이그레이션했습니다.

runserver의 자동 재로드 기능을 gunicorn에 복제하는 것이 편리하므로 소스가 변경되면 서버가 자동으로 다시 시작됩니다. 그렇지 않으면 수동으로 서버를 다시 시작해야합니다 kill -HUP.

수동 재시작을 피할 수있는 방법이 있습니까?



답변

이것은 오래된 질문이지만 일관성을 위해 버전 19.0 gunicorn에는 --reload옵션 이 있습니다. 따라서 더 많은 타사 도구가 필요하지 않습니다.


답변

한 가지 옵션은 –max-requests 를 사용 --max-requests 1하여 시작 옵션 에 추가 하여 생성 된 각 프로세스를 하나의 요청 만 제공하도록 제한하는 것 입니다. 새로 생성 된 모든 프로세스는 코드 변경 사항을 확인해야하며 개발 환경에서는 요청 당 추가 시작 시간이 무시할 수 있어야합니다.


답변

브라이언 Helmig는 이 함께 와서 나는 그것을 사용하도록 수정 run_gunicorn실행하는 대신 gunicorn단지 인하가 가능하도록, 직접 (당신의 VIRTUALENV 활성화와 함께) 장고 프로젝트 루트 폴더에있는 쉘에이 3 개 명령을 붙여 넣습니다 :

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


답변

git push를 사용하여 프로덕션에 배포하고 git hooks를 설정하여 스크립트를 실행합니다. 이 접근 방식의 장점은 마이그레이션 및 패키지 설치를 동시에 수행 할 수도 있다는 것입니다. 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

보너스로 스크립트가 실행되는 동안 모든 프롬프트를 볼 수 있습니다. 따라서 마이그레이션 / 패키지 설치 / 감독자 다시 시작에 문제가 있는지 확인할 수 있습니다.


답변