ソース変更時のgunicorn自動リロード


113

最後に、開発環境をrunserverからgunicorn / nginxに移行しました。

runserverのオートリロード機能をgunicornに複製すると、ソースが変更されたときにサーバーが自動的に再起動するので便利です。そうでない場合は、を使用してサーバーを手動で再起動する必要がありkill -HUPます。

手動による再起動を回避する方法はありますか?


エラッタ:私の環境では、gunicornはスーパーバイザによって管理/監視されているため、実際にkill -HUPはプロセスPIDではなく、代わりにsupervisorctlを使用します。ただし、これが大きく変わるとは思わないでください。
Paolo

3
github.com/benoitc/gunicorn/issues/154にはいくつかのソリューションがあります
KZ

回答:


232

これは古い質問ですが、一貫性のためです-バージョン19.0以降、gunicornには--reloadオプションがあります。したがって、サードパーティのツールはこれ以上必要ありません。


5
同意した。他の回答も機能する可能性がありますが、これははるかに簡単であり、回避策ではありません。それはまさにOPが望んだものです。
J-bob 2014

1
gunicornに--reloadオプションが組み込まれているとは思いません。どこで見つけたの?彼らのドキュメントによれば、設定をリロードし、HUP(killall -HUP procname正常に動作します)を送信して新しいワーカーを開始し、古いワーカーを正常にシャットダウンするように言われています。
sofly 2014

3
@Guandalinoに感謝します。見逃していたに違いありません。しかし興味深いことに、彼らは「この設定は開発を意図している」と述べています。これは明らかに一部のケースではプロダクションで機能しますが、他の多くのケースでも問題になる可能性があります。はい、私はあなたが本番/配備に興味がないように見えることを以下で見ました。
ソフライ2014

本番サーバーでそれを簡単に行う方法は?
フアンイサザ2017年

@juanIsazaは、このような機能を本番環境で使用してはなりません。あなたがそれが必要だと思うなら-あなたは開発や配備のためのあなたのアプローチを再考する必要があります。
Dmitry Ziolkovskiy

20

1つのオプションは、起動オプションに追加することにより、--max-requestsを使用して、生成された各プロセスを1つの要求のみを処理するように制限すること--max-requests 1です。新しく生成されたすべてのプロセスはコードの変更を認識し、開発環境では、リクエストごとの余分な起動時間はごくわずかです。


1
開発環境の素敵でエレガントなトリック。製品では使用できません...しかし、「継続的デプロイ」を行わない限り、製品での自動再読み込みは必要ありません。もしそうなら、ブライアン・ヘルミグのアプローチは、それがpip有能なパッケージを必要とするにもかかわらず、より良いwatchdogです。
ホブ

2
新しいワーカーを起動するには3秒ほどかかりますが、これは私には遅すぎます。(2009年中旬MBP)
ブレイズ

11

Bryan Helmigがこれを思いついたので、直接run_gunicorn起動する代わりに使用するように変更gunicornし、djangoプロジェクトのルートフォルダー(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

fedora 15でDjango 1.5.4、gunicorn 18.0、watchdog 0.6、bash 4.2を使って自分で使用しました。
ホブ2013年

127.0.0.1:80必要に応じて、の代わりにIPまたはFQDNとポートを配置することを忘れないでください。
ホブ2013年

1
@Guandalino、運は?数週間、私にとってはうまくいきました。私は手動で再起動する必要がある唯一の時間は、私が変更されたときであるsettings.pymodels.py(移行が必要)、またはない私の中にいくつかの外部アプリのソースコードwatchmedoパターン。
ホブ2013年

念押し有難う。しかし、私は他の人の成功に投票したくありません。なぜこれが(不要な)急いでいるのですか?StackOverflowルールに違反していますか?その場合は、修正方法を教えてください。
Paolo

1
心配ない。確かにSOルールに違反しているわけではありません。役立つ回答の評価に努力/優先順位を置くことは、思慮深く/独断的/思慮深いことです。デイブのようで、私はあなたを助けるために私たちの甘い時間(数ヶ月)を費やしたので、私たちのソリューションを検証するようにあなたを促す緊急の私の感覚は不釣り合いです-私が方法に隠された欠陥があるかどうか知りたいと私は非常に熱望しています私のサーバーを設定し、デイブのアプローチに切り替える必要があるかどうか。楽しい休暇をお過ごしください!
ホブ

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上記のようにシバンを使用することに注意してください。 代わりに#!/bin/shGitのpost-receive例が使用していました。
curtisp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.