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


113

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

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

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


정오표 : 내 환경에서 gunicorn은 supervisord에 의해 관리 / 모니터링되므로 실제로 kill -HUP프로세스 PID가 아니라 supervisorctl을 대신 사용합니다. 하지만 이것이 많이 변한다고 생각하지 마십시오.
Paolo

3
github.com/benoitc/gunicorn/issues/154 에는 몇 가지 해결책이 있습니다
KZ

답변:


232

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


5
동의했습니다. 다른 답변이 작동 할 수 있지만 이것은 가장 간단하며 해결 방법이 아닙니다. OP가 원했던 것입니다.
J-bob

1
gunicorn에 내장 된 --reload 옵션이 있다고 생각하지 않습니다. 이걸 어디서 찾았 어? 그들의 문서는 구성을 다시로드하고 HUP ( killall -HUP procname잘 작동 함)를 보내 새로운 작업자를 시작하고 이전 작업자를 정상적으로 종료하도록 말합니다 .
sofly 2014 년

3
감사합니다 @Guandalino, 나는 그것을 놓친 것 같습니다. 흥미로운 점은 "이 설정은 개발 용입니다."라고 말합니다. 이것은 어떤 경우에는 분명히 프로덕션에 적용되지만 다른 많은 경우에도 문제가 될 수 있습니다. 예, 아래에서 프로덕션 / 배포에 관심이없는 것 같습니다.
sofly 2014 년

프로덕션 서버에서 쉽게 수행 할 수있는 방법은 무엇입니까?
juan Isaza

@juanIsaza는 프로덕션에서 이러한 기능을 사용해서는 안됩니다. 필요하다고 생각되면 개발 또는 배포에 대한 접근 방식을 재고해야합니다.
Dmitry Ziolkovskiy

20

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


1
dev 환경을위한 멋지고 우아한 트릭. prod에서는 사용할 수 없지만 "연속 배포"를 수행하지 않는 한 prod에서 자동으로 다시로드하는 것을 원하지 않을 수 있습니다. 그렇다면 Bryan Helmig의 접근 방식은 pip가능한 패키지 가 필요하더라도 더 좋습니다 watchdog.
hobs dec.

2
새 작업자를 부팅하는 데 약 3 초가 걸리며 이는 저에게 너무 느립니다. (2009 년 중반 MBP)
Blaise 2014

11

브라이언 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

Django 1.5.4, gunicorn 18.0, watchdog 0.6, bash 4.2와 함께 fedora 15에서 직접 사용했습니다.
hobs

127.0.0.1:80필요한 경우 대신 IP 또는 FQDN 및 포트를 배치하는 것을 잊지 마십시오 .
호브

1
@Guandalino, 행운이 있습니까? 이제 몇 주 동안 잘 작동하고 있습니다. 수동으로 다시 시작해야하는 시간은 settings.py, models.py(마이그레이션 필요) 또는 watchmedo패턴에 없는 일부 외부 앱의 소스 코드를 변경할 때뿐입니다 .
hobs

알림 주셔서 감사합니다. 그러나 나는 다른 사람의 성공에 내 투표를하고 싶지 않습니다. 왜 (불필요한) 서둘러? 일부 StackOverflow 규칙을 위반하고 있습니까? 그렇다면 해결 방법을 알려주십시오.
Paolo

1
걱정 마. 확실히 SO 규칙을 위반하지 않고, 도움이되는 답변을 평가하는 데 노력 / 우선 순위를 두는 것은 배려 / 유연 / 생각 적입니다. Dave와 제가 당신을 도와주는 데 (수개월) 달콤한 시간을 들인 것 같습니다. 그래서 저희 솔루션을 확인하도록하는 제 긴박감은 불균형 적입니다. 내 서버를 구성했으며 Dave의 접근 방식으로 전환해야합니다 . 즐거운 휴일 보내세요!
hobs dec.

5

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

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


사용 오두막에 참고 #!/bin/bash위 대신에 언급 한 바와 같이이의 #!/bin/sh어떤 망할 놈의 것입니다 post-receive예를했다!
curtisp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.